[lld] [lld-macho] Make relative method lists work on x86-64 (PR #103905)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 21 14:35:49 PDT 2024
================
@@ -0,0 +1,255 @@
+# REQUIRES: x86
+# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
+# RUN: rm -rf %t; split-file %s %t && cd %t
+
+## Compile rel_dylib.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o rel_dylib.o simple_class.s
+
+## Test relative method lists
+# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists
+# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
+
+## Test relative method lists + dead-strip
+# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists -dead_strip
+# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
+
+## Test traditional method lists (no relative offsets)
+# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -no_objc_relative_method_lists
+# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
+
+
+CHK_REL: Contents of (__DATA_CONST,__objc_classlist) section
+CHK_REL-NEXT: _OBJC_CLASS_$_MyClass
+CHK_REL: baseMethods
+CHK_REL-NEXT: entsize 12 (relative)
+CHK_REL-NEXT: count 3
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_00
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_00]
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_01
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_01]
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_02
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]
+
+CHK_REL: Meta Class
+CHK_REL-NEXT: isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass
+CHK_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
+CHK_REL-NEXT: entsize 12 (relative)
+CHK_REL-NEXT: count 3
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_00
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_00]
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_01
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_01]
+CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_02
+CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16 at 0:8
+CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_02]
+
+
+CHK_NO_REL-NOT: (relative)
+
+CHK_NO_REL: Contents of (__DATA_CONST,__objc_classlist) section
+CHK_NO_REL-NEXT: _OBJC_CLASS_$_MyClass
+
+CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
+CHK_NO_REL-NEXT: entsize 24
+CHK_NO_REL-NEXT: count 3
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_00
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp -[MyClass instance_method_00]
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_01
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp -[MyClass instance_method_01]
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_02
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp -[MyClass instance_method_02]
+
+
+CHK_NO_REL: Meta Class
+CHK_NO_REL-NEXT: _OBJC_METACLASS_$_MyClass
+
+CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
+CHK_NO_REL-NEXT: entsize 24
+CHK_NO_REL-NEXT: count 3
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_00
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp +[MyClass class_method_00]
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_01
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp +[MyClass class_method_01]
+CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_02
+CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16 at 0:8
+CHK_NO_REL-NEXT: imp +[MyClass class_method_02]
+
+
+######################## Generate simple_class.s #########################
+# clang -c simple_class.mm -s -o simple_class.s -target x86_64-apple-macos11 -Oz
----------------
MaskRay wrote:
Note: https://llvm.org/docs/TestingGuide.html#elaborated-tests could be used to make regeneration easier.
https://github.com/llvm/llvm-project/pull/103905
More information about the llvm-commits
mailing list