Loading...
--- dyld/dyld-360.21/include/objc-shared-cache.h
+++ dyld/dyld-239.4/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;
@@ -164,8 +161,8 @@
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++) {
@@ -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,7 +486,7 @@
return "class list busted (metadata not optimized)";
}
- if (classOffsets()[h].clsOffset != 0) {
+ if (classOffsets()[h].clsOffset != zeroOffset) {
// already did this class
continue;
}
@@ -549,88 +551,6 @@
#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_t;
@@ -638,16 +558,15 @@
struct objc_clsopt_t;
// Edit objc-sel-table.s if you change this value.
-enum { VERSION = 13 };
+enum { VERSION = 12 };
// Top-level optimization structure.
// Edit objc-sel-table.s and OPT_INITIALIZER if you change this structure.
-struct alignas(alignof(void*)) objc_opt_t {
+struct objc_opt_t {
uint32_t version;
int32_t selopt_offset;
int32_t headeropt_offset;
int32_t clsopt_offset;
- int32_t protocolopt_offset;
const objc_selopt_t* selopt() const {
if (selopt_offset == 0) return NULL;
@@ -666,11 +585,6 @@
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);
}
};
@@ -688,16 +602,7 @@
4, 4, 63, 3, 0, 0, 0,0, X256(0), 0, 0, 16, 16, 16, 16 \
/* no objc_headeropt_t */ \
/* no objc_clsopt_t */ \
- /* no objc_protocolopt_t */ \
-}
-
-
-// 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;
+}
/*