[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