diff --git a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64.dylib b/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64.dylib deleted file mode 100755 index 9b39fc98fb5d9..0000000000000 Binary files a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64.dylib and /dev/null differ diff --git a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64_32.dylib b/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64_32.dylib deleted file mode 100755 index d3a339057abc3..0000000000000 Binary files a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64_32.dylib and /dev/null differ diff --git a/llvm/test/tools/llvm-objdump/MachO/AArch64/macho-relative-method-lists.test b/llvm/test/tools/llvm-objdump/MachO/AArch64/macho-relative-method-lists.test deleted file mode 100644 index be8b7f8f3b2ce..0000000000000 --- a/llvm/test/tools/llvm-objdump/MachO/AArch64/macho-relative-method-lists.test +++ /dev/null @@ -1,87 +0,0 @@ -RUN: llvm-objdump --macho --objc-meta-data %p/Inputs/rel-method-lists-arm64_32.dylib | FileCheck %s --check-prefix=CHK32 -RUN: llvm-otool -ov %p/Inputs/rel-method-lists-arm64_32.dylib | FileCheck %s --check-prefix=CHK32 - -RUN: llvm-objdump --macho --objc-meta-data %p/Inputs/rel-method-lists-arm64.dylib | FileCheck %s --check-prefix=CHK64 -RUN: llvm-otool -ov %p/Inputs/rel-method-lists-arm64.dylib | FileCheck %s --check-prefix=CHK64 - -CHK32: baseMethods 0x660 (struct method_list_t *) -CHK32-NEXT: entsize 12 (relative) -CHK32-NEXT: count 3 -CHK32-NEXT: name 0x144 (0x7ac) instance_method_00 -CHK32-NEXT: types 0x91 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffff18 (0x588) -[MyClass instance_method_00] -CHK32-NEXT: name 0x13c (0x7b0) instance_method_01 -CHK32-NEXT: types 0x85 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffff28 (0x5a4) -[MyClass instance_method_01] -CHK32-NEXT: name 0x134 (0x7b4) instance_method_02 -CHK32-NEXT: types 0x79 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffff38 (0x5c0) -[MyClass instance_method_02] - -CHK32: baseMethods 0x630 (struct method_list_t *) -CHK32-NEXT: entsize 12 (relative) -CHK32-NEXT: count 3 -CHK32-NEXT: name 0x180 (0x7b8) class_method_00 -CHK32-NEXT: types 0xc1 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffff9c (0x5dc) +[MyClass class_method_00] -CHK32-NEXT: name 0x178 (0x7bc) class_method_01 -CHK32-NEXT: types 0xb5 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffffac (0x5f8) +[MyClass class_method_01] -CHK32-NEXT: name 0x170 (0x7c0) class_method_02 -CHK32-NEXT: types 0xa9 (0x6fd) v8@0:4 -CHK32-NEXT: imp 0xffffffbc (0x614) +[MyClass class_method_02] - -CHK64: baseMethods 0x7d8 (struct method_list_t *) -CHK64-NEXT: entsize 24 -CHK64-NEXT: count 3 -CHK64-NEXT: name 0x6a4 instance_method_00 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp -[MyClass instance_method_00] -CHK64-NEXT: name 0x6b7 instance_method_01 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp -[MyClass instance_method_01] -CHK64-NEXT: name 0x6ca instance_method_02 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp -[MyClass instance_method_02] - -CHK64: baseMethods 0x740 (struct method_list_t *) -CHK64-NEXT: entsize 24 -CHK64-NEXT: count 3 -CHK64-NEXT: name 0x674 class_method_00 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp +[MyClass class_method_00] -CHK64-NEXT: name 0x684 class_method_01 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp +[MyClass class_method_01] -CHK64-NEXT: name 0x694 class_method_02 -CHK64-NEXT: types 0x6dd v16@0:8 -CHK64-NEXT: imp +[MyClass class_method_02] - - -######## Generate rel-method-lists-arm64.dylib ######## -// clang -c main.mm -o main.o -target arm64-apple-macos -arch arm64 -// ld64.ld64 -dylib -demangle -dynamic main.o -o rel-method-lists-arm64.dylib -syslibroot MacOSX14.2.sdk -segalign 0x10 -objc_relative_method_lists - -######## Generate rel-method-lists-arm64_32.dylib ######## -// clang -c main.mm -o main.o -target arm64_32-apple-watchos -arch arm64_32 -// ld64.ld64 -dylib -demangle -dynamic main.o -o rel-method-lists-arm64_32.dylib -syslibroot WatchOS.sdk -segalign 0x10 -objc_relative_method_lists - -// ~~~~~~~~~~~~~~~~~~~~~~~~~ main.mm ~~~~~~~~~~~~~~~~~~~~~~~~~ -__attribute__((objc_root_class)) -@interface MyClass -- (void)instance_method_00; -- (void)instance_method_01; -- (void)instance_method_02; -+ (void)class_method_00; -+ (void)class_method_01; -+ (void)class_method_02; -@end -@implementation MyClass -- (void)instance_method_00 {} -- (void)instance_method_01 {} -- (void)instance_method_02 {} -+ (void)class_method_00 {} -+ (void)class_method_01 {} -+ (void)class_method_02 {} -@end -void *_objc_empty_cache; -void *_objc_empty_vtable; diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 1b0e5ba279d06..0e6935c0ac589 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -3661,10 +3661,6 @@ struct class_ro32_t { #define RO_ROOT (1 << 1) #define RO_HAS_CXX_STRUCTORS (1 << 2) -/* Values for method_list{64,32}_t->entsize */ -#define ML_HAS_RELATIVE_PTRS (1 << 31) -#define ML_ENTSIZE_MASK 0xFFFF - struct method_list64_t { uint32_t entsize; uint32_t count; @@ -3689,12 +3685,6 @@ struct method32_t { uint32_t imp; /* IMP (32-bit pointer) */ }; -struct method_relative_t { - int32_t name; /* SEL (32-bit relative) */ - int32_t types; /* const char * (32-bit relative) */ - int32_t imp; /* IMP (32-bit relative) */ -}; - struct protocol_list64_t { uint64_t count; /* uintptr_t (a 64-bit value) */ /* struct protocol64_t * list[0]; These pointers follow inline */ @@ -3996,12 +3986,6 @@ inline void swapStruct(struct method32_t &m) { sys::swapByteOrder(m.imp); } -inline void swapStruct(struct method_relative_t &m) { - sys::swapByteOrder(m.name); - sys::swapByteOrder(m.types); - sys::swapByteOrder(m.imp); -} - inline void swapStruct(struct protocol_list64_t &pl) { sys::swapByteOrder(pl.count); } @@ -4456,84 +4440,6 @@ static void print_layout_map32(uint32_t p, struct DisassembleInfo *info) { print_layout_map(layout_map, left); } -static void print_relative_method_list(uint32_t structSizeAndFlags, - uint32_t structCount, uint64_t p, - struct DisassembleInfo *info, - const char *indent, - uint32_t pointerBits) { - struct method_relative_t m; - const char *r, *name; - uint32_t offset, xoffset, left, i; - SectionRef S, xS; - - assert(((structSizeAndFlags & ML_HAS_RELATIVE_PTRS) != 0) && - "expected structSizeAndFlags to have ML_HAS_RELATIVE_PTRS flag"); - - outs() << indent << "\t\t entsize " - << (structSizeAndFlags & ML_ENTSIZE_MASK) << " (relative) \n"; - outs() << indent << "\t\t count " << structCount << "\n"; - - for (i = 0; i < structCount; i++) { - r = get_pointer_64(p, offset, left, S, info); - memset(&m, '\0', sizeof(struct method_relative_t)); - if (left < sizeof(struct method_relative_t)) { - memcpy(&m, r, left); - outs() << indent << " (method_t extends past the end of the section)\n"; - } else - memcpy(&m, r, sizeof(struct method_relative_t)); - if (info->O->isLittleEndian() != sys::IsLittleEndianHost) - swapStruct(m); - - outs() << indent << "\t\t name " << format("0x%" PRIx32, m.name); - uint64_t relNameRefVA = p + offsetof(struct method_relative_t, name); - uint64_t absNameRefVA = relNameRefVA + m.name; - outs() << " (" << format("0x%" PRIx32, absNameRefVA) << ")"; - - // since this is a relative list, absNameRefVA is the address of the - // __objc_selrefs entry, so a pointer, not the actual name - const char *nameRefPtr = - get_pointer_64(absNameRefVA, xoffset, left, xS, info); - if (nameRefPtr) { - uint32_t pointerSize = pointerBits / CHAR_BIT; - if (left < pointerSize) - outs() << indent << " (nameRefPtr extends past the end of the section)"; - else { - if (pointerSize == 64) { - name = get_pointer_64(*reinterpret_cast(nameRefPtr), - xoffset, left, xS, info); - } else { - name = get_pointer_32(*reinterpret_cast(nameRefPtr), - xoffset, left, xS, info); - } - if (name != nullptr) - outs() << format(" %.*s", left, name); - } - } - outs() << "\n"; - - outs() << indent << "\t\t types " << format("0x%" PRIx32, m.types); - uint64_t relTypesVA = p + offsetof(struct method_relative_t, types); - uint64_t absTypesVA = relTypesVA + m.types; - outs() << " (" << format("0x%" PRIx32, absTypesVA) << ")"; - name = get_pointer_32(absTypesVA, xoffset, left, xS, info); - if (name != nullptr) - outs() << format(" %.*s", left, name); - outs() << "\n"; - - outs() << indent << "\t\t imp " << format("0x%" PRIx32, m.imp); - uint64_t relImpVA = p + offsetof(struct method_relative_t, imp); - uint64_t absImpVA = relImpVA + m.imp; - outs() << " (" << format("0x%" PRIx32, absImpVA) << ")"; - name = GuessSymbolName(absImpVA, info->AddrMap); - if (name != nullptr) - outs() << " " << name; - outs() << "\n"; - - p += sizeof(struct method_relative_t); - offset += sizeof(struct method_relative_t); - } -} - static void print_method_list64_t(uint64_t p, struct DisassembleInfo *info, const char *indent) { struct method_list64_t ml; @@ -4555,17 +4461,10 @@ static void print_method_list64_t(uint64_t p, struct DisassembleInfo *info, memcpy(&ml, r, sizeof(struct method_list64_t)); if (info->O->isLittleEndian() != sys::IsLittleEndianHost) swapStruct(ml); - p += sizeof(struct method_list64_t); - - if ((ml.entsize & ML_HAS_RELATIVE_PTRS) != 0) { - print_relative_method_list(ml.entsize, ml.count, p, info, indent, - /*pointerBits=*/64); - return; - } - outs() << indent << "\t\t entsize " << ml.entsize << "\n"; outs() << indent << "\t\t count " << ml.count << "\n"; + p += sizeof(struct method_list64_t); offset += sizeof(struct method_list64_t); for (i = 0; i < ml.count; i++) { r = get_pointer_64(p, offset, left, S, info); @@ -4653,17 +4552,10 @@ static void print_method_list32_t(uint64_t p, struct DisassembleInfo *info, memcpy(&ml, r, sizeof(struct method_list32_t)); if (info->O->isLittleEndian() != sys::IsLittleEndianHost) swapStruct(ml); - p += sizeof(struct method_list32_t); - - if ((ml.entsize & ML_HAS_RELATIVE_PTRS) != 0) { - print_relative_method_list(ml.entsize, ml.count, p, info, indent, - /*pointerBits=*/32); - return; - } - outs() << indent << "\t\t entsize " << ml.entsize << "\n"; outs() << indent << "\t\t count " << ml.count << "\n"; + p += sizeof(struct method_list32_t); offset += sizeof(struct method_list32_t); for (i = 0; i < ml.count; i++) { r = get_pointer_32(p, offset, left, S, info);