Loading...
include/objc-shared-cache.h dyld-421.2 dyld-239.3
--- dyld/dyld-421.2/include/objc-shared-cache.h
+++ dyld/dyld-239.3/include/objc-shared-cache.h
@@ -145,9 +145,6 @@
 // (used for selector names and class names)
 typedef std::unordered_map<const char *, uint64_t, hashstr, eqstr> string_map;
 
-// protocol name => protocol vmaddress
-typedef std::unordered_map<const char *, uint64_t, hashstr, eqstr> protocol_map;
-
 // class name => (class vmaddress, header_info vmaddress)
 typedef std::unordered_multimap<const char *, std::pair<uint64_t, uint64_t>, hashstr, eqstr> class_map;
 
@@ -158,14 +155,14 @@
 
 // Precomputed perfect hash table of strings.
 // Base class for precomputed selector table and class table.
-// Edit objc-sel-table.s if you change this structure.
+// Edit objc-sel-table.s and OPT_INITIALIZER if you change this structure.
 struct objc_stringhash_t {
     uint32_t capacity;
     uint32_t occupied;
     uint32_t shift;
     uint32_t mask;
-    uint32_t unused1;  // was zero
-    uint32_t unused2;  // alignment pad
+    uint32_t zero;
+    uint32_t unused; // alignment pad
     uint64_t salt;
     
     uint32_t scramble[256];
@@ -224,8 +221,9 @@
         if (check_fail) return INDEX_NOT_FOUND;
 #endif
 
+        // fixme change &zero to 0 in the next version-breaking update
         objc_stringhash_offset_t offset = offsets()[h];
-        if (offset == 0) return INDEX_NOT_FOUND;
+        if (offset == offsetof(objc_stringhash_t,zero)) return INDEX_NOT_FOUND;
         const char *result = (const char *)this + offset;
         if (0 != strcmp(key, result)) return INDEX_NOT_FOUND;
 
@@ -261,6 +259,7 @@
         S32(occupied);
         S32(shift);
         S32(mask);
+        S32(zero);
         S64(salt);
     }
 
@@ -285,8 +284,8 @@
         occupied = phash.occupied;
         shift = phash.shift;
         mask = phash.mask;
-        unused1 = 0;
-        unused2 = 0;
+        zero = 0;
+        unused = 0;
         salt = phash.salt;
 
         if (size() > remaining) {
@@ -301,9 +300,10 @@
             tab[i] = phash.tab[i];
         }
         
-        // Set offsets to 0
+        // Set offsets to ""
         for (uint32_t i = 0; i < phash.capacity; i++) {
-            offsets()[i] = 0;
+            offsets()[i] = 
+                (objc_stringhash_offset_t)offsetof(objc_stringhash_t, zero);
         }
         // Set checkbytes to 0
         for (uint32_t i = 0; i < phash.capacity; i++) {
@@ -334,7 +334,7 @@
 
 
 // Precomputed selector table.
-// Edit objc-sel-table.s if you change this structure.
+// Edit objc-sel-table.s and OPT_INITIALIZER if you change this structure.
 struct objc_selopt_t : objc_stringhash_t { 
     const char *get(const char *key) const 
     {
@@ -346,7 +346,7 @@
 };
 
 // Precomputed class list.
-// Edit objc-sel-table.s if you change these structures.
+// Edit objc-sel-table.s and OPT_INITIALIZER if you change these structures.
 
 struct objc_classheader_t {
     objc_stringhash_offset_t clsOffset;
@@ -469,10 +469,12 @@
             return "selector section too small (metadata not optimized)";
         }
 
-        // Set class offsets to 0
+        // Set class offsets to &zero
+        objc_stringhash_offset_t zeroOffset = 
+            (objc_stringhash_offset_t)offsetof(objc_stringhash_t, zero);
         for (uint32_t i = 0; i < capacity; i++) {
-            classOffsets()[i].clsOffset = 0;
-            classOffsets()[i].hiOffset = 0;
+            classOffsets()[i].clsOffset = zeroOffset;
+            classOffsets()[i].hiOffset = zeroOffset;
         }
         
         // Set real class offsets
@@ -484,12 +486,12 @@
                 return "class list busted (metadata not optimized)";
             }
 
-            if (classOffsets()[h].clsOffset != 0) {
+            if (classOffsets()[h].clsOffset != zeroOffset) {
                 // already did this class
                 continue;
             }
 
-            uint32_t count = (uint32_t)classes.count(c->first);
+            uint32_t count = classes.count(c->first);
             if (count == 1) {
                 // only one class with this name
 
@@ -549,119 +551,24 @@
 #endif
 };
 
-
-
-struct objc_protocolopt_t : objc_stringhash_t {
-    // ...objc_stringhash_t fields...
-    // uint32_t protocolOffsets[capacity]; /* offsets from &capacity to protocol_t */
-
-    objc_stringhash_offset_t *protocolOffsets() { return (objc_stringhash_offset_t *)&offsets()[capacity]; }
-    const objc_stringhash_offset_t *protocolOffsets() const { return (const objc_stringhash_offset_t *)&offsets()[capacity]; }
-
-    void* getProtocol(const char *key) const 
-    {
-        uint32_t h = getIndex(key);
-        if (h == INDEX_NOT_FOUND) { 
-            return NULL;
-        }
-
-        return (void *)((const char *)this + protocolOffsets()[h]);
-    }
-
-#ifdef SELOPT_WRITE
-
-    size_t size() 
-    {
-        return
-            objc_stringhash_t::size() + capacity * sizeof(objc_stringhash_offset_t);
-    }
-
-    void byteswap(bool little_endian) 
-    {
-        objc_stringhash_offset_t *o;
-        
-        o = protocolOffsets();
-        for (objc_stringhash_offset_t i = 0; i < capacity; i++) {
-            S32(o[i]);
-        }
-
-        objc_stringhash_t::byteswap(little_endian);
-    }
-    
-    const char *write(uint64_t base, size_t remaining, 
-                      string_map& strings, protocol_map& protocols, 
-                      bool verbose)
-    {
-        const char *err;
-        err = objc_stringhash_t::write(base, remaining, strings);
-        if (err) return err;
-
-        if (size() > remaining) {
-            return "selector section too small (metadata not optimized)";
-        }
-
-        // Set protocol offsets to 0
-        for (uint32_t i = 0; i < capacity; i++) {
-            protocolOffsets()[i] = 0;
-        }
-        
-        // Set real protocol offsets
-#       define SHIFT (64 - 8*sizeof(objc_stringhash_offset_t))
-        protocol_map::const_iterator c;
-        for (c = protocols.begin(); c != protocols.end(); ++c) {
-            uint32_t h = getIndex(c->first);
-            if (h == INDEX_NOT_FOUND) {
-                return "protocol list busted (metadata not optimized)";
-            }
-
-            int64_t offset = c->second - base;
-            if ((offset<<SHIFT)>>SHIFT != offset) {
-                return "protocol offset too big (metadata not optimized)";
-            }
-
-            protocolOffsets()[h] = (objc_stringhash_offset_t)offset;
-        }
-#       undef SHIFT
-        
-        return NULL;
-    }
-
-// SELOPT_WRITE
-#endif
-};
-
-
 // Precomputed image list.
-struct objc_headeropt_ro_t;
-
-// Precomputed image list.
-struct objc_headeropt_rw_t;
+struct objc_headeropt_t;
 
 // Precomputed class list.
 struct objc_clsopt_t;
 
 // Edit objc-sel-table.s if you change this value.
-// lldb and Symbolication read these structures. Inform them of any changes.
-enum { VERSION = 15 };
-
-// Values for objc_opt_t::flags
-enum : uint32_t {
-    IsProduction = (1 << 0),               // never set in development cache
-    NoMissingWeakSuperclasses = (1 << 1),  // never set in development cache
-};
+enum { VERSION = 12 };
 
 // Top-level optimization structure.
-// Edit objc-sel-table.s if you change this structure.
-struct alignas(alignof(void*)) objc_opt_t {
+// Edit objc-sel-table.s and OPT_INITIALIZER if you change this structure.
+struct objc_opt_t {
     uint32_t version;
-    uint32_t flags;
     int32_t selopt_offset;
-    int32_t headeropt_ro_offset;
+    int32_t headeropt_offset;
     int32_t clsopt_offset;
-    int32_t protocolopt_offset;
-    int32_t headeropt_rw_offset;
-
-    const objc_selopt_t* selopt() const {
+
+    const objc_selopt_t* selopt() const { 
         if (selopt_offset == 0) return NULL;
         return (objc_selopt_t *)((uint8_t *)this + selopt_offset);
     }
@@ -670,37 +577,32 @@
         return (objc_selopt_t *)((uint8_t *)this + selopt_offset);
     }
 
-    struct objc_headeropt_ro_t* headeropt_ro() const {
-        if (headeropt_ro_offset == 0) return NULL;
-        return (struct objc_headeropt_ro_t *)((uint8_t *)this + headeropt_ro_offset);
+    struct objc_headeropt_t* headeropt() const { 
+        if (headeropt_offset == 0) return NULL;
+        return (struct objc_headeropt_t *)((uint8_t *)this + headeropt_offset);
     }
 
     struct objc_clsopt_t* clsopt() const { 
         if (clsopt_offset == 0) return NULL;
         return (objc_clsopt_t *)((uint8_t *)this + clsopt_offset);
     }
-
-    struct objc_protocolopt_t* protocolopt() const { 
-        if (protocolopt_offset == 0) return NULL;
-        return (objc_protocolopt_t *)((uint8_t *)this + protocolopt_offset);
-    }
-
-    struct objc_headeropt_rw_t* headeropt_rw() const {
-        if (headeropt_rw_offset == 0) return NULL;
-        return (struct objc_headeropt_rw_t *)((uint8_t *)this + headeropt_rw_offset);
-    }
 };
 
 // sizeof(objc_opt_t) must be pointer-aligned
 STATIC_ASSERT(sizeof(objc_opt_t) % sizeof(void*) == 0);
 
-
-// List of offsets in libobjc that the shared cache optimization needs to use.
-template <typename T>
-struct objc_opt_pointerlist_tt {
-    T protocolClass;
-};
-typedef struct objc_opt_pointerlist_tt<uintptr_t> objc_opt_pointerlist_t;
+// Initializer for empty opt of type uint32_t[].
+#define X8(x) x, x, x, x, x, x, x, x
+#define X64(x) X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x)
+#define X256(x) X64(x), X64(x), X64(x), X64(x)
+#define OPT_INITIALIZER {                                           \
+        /* objc_opt_t */                                            \
+        objc_opt::VERSION, 16, 0, 0,                                \
+        /* objc_selopt_t */                                         \
+        4, 4, 63, 3, 0, 0, 0,0, X256(0), 0, 0, 16, 16, 16, 16       \
+        /* no objc_headeropt_t */                                   \
+        /* no objc_clsopt_t */                                      \
+}
 
 
 /*
@@ -1042,8 +944,8 @@
   for (i = 0; i < nkeys; i++) {
     key *mykey = keys+i;
     ub8 hash = lookup8(mykey->name_k, mykey->len_k, salt);
-    mykey->a_k = (loga > 0) ? (ub4)(hash >> (UB8BITS-loga)) : 0;
-    mykey->b_k = (blen > 1) ? (hash & (blen-1)) : 0;
+    mykey->a_k = (loga > 0) ? hash>>(UB8BITS-loga) : 0;
+    mykey->b_k = (blen > 1) ? hash&(blen-1) : 0;
   }
 }
 
@@ -1415,7 +1317,7 @@
     mykey->len_k  = (ub4)strlen(s->first);
   }
   *keys = buf;
-  *nkeys = (ub4)strings.size();
+  *nkeys = strings.size();
 }