[llvm] 36fd0e7 - Revert "[llvm-objdump][macho] Add support for ObjC relative method lists (#84250)"
Kyungwoo Lee via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 15 05:14:31 PDT 2024
Author: Kyungwoo Lee
Date: 2024-03-15T05:07:15-07:00
New Revision: 36fd0e797974b75623d847e30d8ba0494e43af99
URL: https://github.com/llvm/llvm-project/commit/36fd0e797974b75623d847e30d8ba0494e43af99
DIFF: https://github.com/llvm/llvm-project/commit/36fd0e797974b75623d847e30d8ba0494e43af99.diff
LOG: Revert "[llvm-objdump][macho] Add support for ObjC relative method lists (#84250)"
This reverts llvm/llvm-project#84250, commit aa6100643c2c8f9a1b06ba557b68b0fba477e3c7.
See build failures:
https://lab.llvm.org/buildbot/#/builders/178/builds/7028
https://lab.llvm.org/buildbot/#/builders/182/builds/9282
https://lab.llvm.org/buildbot/#/builders/186/builds/15299
https://lab.llvm.org/buildbot/#/builders/187/builds/14564
Added:
Modified:
llvm/tools/llvm-objdump/MachODump.cpp
Removed:
llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64.dylib
llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64_32.dylib
llvm/test/tools/llvm-objdump/MachO/AArch64/macho-relative-method-lists.test
################################################################################
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 9b39fc98fb5d96..00000000000000
Binary files a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64.dylib and /dev/null
diff er
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 d3a339057abc34..00000000000000
Binary files a/llvm/test/tools/llvm-objdump/MachO/AArch64/Inputs/rel-method-lists-arm64_32.dylib and /dev/null
diff er
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 be8b7f8f3b2ce0..00000000000000
--- 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 at 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 at 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 at 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 at 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 at 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 at 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 at 0:8
-CHK64-NEXT: imp -[MyClass instance_method_00]
-CHK64-NEXT: name 0x6b7 instance_method_01
-CHK64-NEXT: types 0x6dd v16 at 0:8
-CHK64-NEXT: imp -[MyClass instance_method_01]
-CHK64-NEXT: name 0x6ca instance_method_02
-CHK64-NEXT: types 0x6dd v16 at 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 at 0:8
-CHK64-NEXT: imp +[MyClass class_method_00]
-CHK64-NEXT: name 0x684 class_method_01
-CHK64-NEXT: types 0x6dd v16 at 0:8
-CHK64-NEXT: imp +[MyClass class_method_01]
-CHK64-NEXT: name 0x694 class_method_02
-CHK64-NEXT: types 0x6dd v16 at 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))
- at 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;
- at end
- at 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 {}
- at 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 1b0e5ba279d06b..0e6935c0ac5895 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<const uint64_t *>(nameRefPtr),
- xoffset, left, xS, info);
- } else {
- name = get_pointer_32(*reinterpret_cast<const uint32_t *>(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);
More information about the llvm-commits
mailing list