2 # UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
3 # RUN: rm -rf %t; split-file %s %t && cd %t
6 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o rel_dylib.o simple_class.s
8 ## Test relative method lists
9 # RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists
10 # RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
12 ## Test relative method lists + dead-strip
13 # RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists -dead_strip
14 # RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
16 ## Test traditional method lists (no relative offsets)
17 # RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -no_objc_relative_method_lists
18 # RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
21 CHK_REL
: Contents of
(__DATA_CONST
,__objc_classlist
) section
22 CHK_REL-NEXT
: _OBJC_CLASS_$_MyClass
24 CHK_REL-NEXT
: entsize
12 (relative
)
26 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_00
27 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
28 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_00
]
29 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_01
30 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
31 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_01
]
32 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_02
33 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
34 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_02
]
37 CHK_REL-NEXT
: isa
0x
{{[0-9a-f
]*}} _OBJC_METACLASS_$_MyClass
38 CHK_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
39 CHK_REL-NEXT
: entsize
12 (relative
)
41 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_00
42 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
43 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_00
]
44 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_01
45 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
46 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_01
]
47 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_02
48 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
49 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_02
]
52 CHK_NO_REL-
NOT: (relative
)
54 CHK_NO_REL
: Contents of
(__DATA_CONST
,__objc_classlist
) section
55 CHK_NO_REL-NEXT
: _OBJC_CLASS_$_MyClass
57 CHK_NO_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
58 CHK_NO_REL-NEXT
: entsize
24
59 CHK_NO_REL-NEXT
: count
3
60 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_00
61 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
62 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_00
]
63 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_01
64 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
65 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_01
]
66 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_02
67 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
68 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_02
]
71 CHK_NO_REL
: Meta Class
72 CHK_NO_REL-NEXT
: _OBJC_METACLASS_$_MyClass
74 CHK_NO_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
75 CHK_NO_REL-NEXT
: entsize
24
76 CHK_NO_REL-NEXT
: count
3
77 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_00
78 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
79 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_00
]
80 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_01
81 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
82 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_01
]
83 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_02
84 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
85 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_02
]
88 ######################## Generate simple_class.s #########################
89 # clang -c simple_class.mm -s -o simple_class.s -target x86_64-apple-macos11 -Oz
91 ######################## simple_class.mm ########################
92 # __attribute__((objc_root_class))
94 # - (void)instance_method_00;
95 # - (void)instance_method_01;
96 # - (void)instance_method_02;
97 # + (void)class_method_00;
98 # + (void)class_method_01;
99 # + (void)class_method_02;
102 # @implementation MyClass
103 # - (void)instance_method_00 {}
104 # - (void)instance_method_01 {}
105 # - (void)instance_method_02 {}
106 # + (void)class_method_00 {}
107 # + (void)class_method_01 {}
108 # + (void)class_method_02 {}
111 # void *_objc_empty_cache;
115 .macro .objc_selector_def name
124 .include "objc-macros.s"
126 .section __TEXT,__text,regular,pure_instructions
127 .build_version macos, 11, 0
129 .objc_selector_def "-[MyClass instance_method_00]"
130 .objc_selector_def "-[MyClass instance_method_01]"
131 .objc_selector_def "-[MyClass instance_method_02]"
133 .objc_selector_def "+[MyClass class_method_00]"
134 .objc_selector_def "+[MyClass class_method_01]"
135 .objc_selector_def "+[MyClass class_method_02]"
137 .section __DATA,__objc_data
138 .globl _OBJC_CLASS_$_MyClass
140 _OBJC_CLASS_$_MyClass
:
141 .quad _OBJC_METACLASS_$_MyClass
143 .quad __objc_empty_cache
145 .quad __OBJC_CLASS_RO_$_MyClass
147 .globl _OBJC_METACLASS_$_MyClass
149 _OBJC_METACLASS_$_MyClass
:
150 .quad _OBJC_METACLASS_$_MyClass
151 .quad _OBJC_CLASS_$_MyClass
152 .quad __objc_empty_cache
154 .quad __OBJC_METACLASS_RO_$_MyClass
156 .section __TEXT,__objc_classname,cstring_literals
160 .section __TEXT,__objc_methname,cstring_literals
161 L_OBJC_METH_VAR_NAME_
:
162 .asciz "class_method_00"
164 .section __TEXT,__objc_methtype,cstring_literals
165 L_OBJC_METH_VAR_TYPE_
:
168 .section __TEXT,__objc_methname,cstring_literals
169 L_OBJC_METH_VAR_NAME_.1
:
170 .asciz "class_method_01"
172 L_OBJC_METH_VAR_NAME_.2
:
173 .asciz "class_method_02"
175 .section __DATA,__objc_const
177 __OBJC_$_CLASS_METHODS_MyClass
:
180 .quad L_OBJC_METH_VAR_NAME_
181 .quad L_OBJC_METH_VAR_TYPE_
182 .quad "+[MyClass class_method_00]"
183 .quad L_OBJC_METH_VAR_NAME_.1
184 .quad L_OBJC_METH_VAR_TYPE_
185 .quad "+[MyClass class_method_01]"
186 .quad L_OBJC_METH_VAR_NAME_.2
187 .quad L_OBJC_METH_VAR_TYPE_
188 .quad "+[MyClass class_method_02]"
191 __OBJC_METACLASS_RO_$_MyClass
:
197 .quad L_OBJC_CLASS_NAME_
198 .quad __OBJC_$_CLASS_METHODS_MyClass
204 .section __TEXT,__objc_methname,cstring_literals
205 L_OBJC_METH_VAR_NAME_.3
:
206 .asciz "instance_method_00"
208 L_OBJC_METH_VAR_NAME_.4
:
209 .asciz "instance_method_01"
211 L_OBJC_METH_VAR_NAME_.5
:
212 .asciz "instance_method_02"
214 .section __DATA,__objc_const
216 __OBJC_$_INSTANCE_METHODS_MyClass
:
219 .quad L_OBJC_METH_VAR_NAME_.3
220 .quad L_OBJC_METH_VAR_TYPE_
221 .quad "-[MyClass instance_method_00]"
222 .quad L_OBJC_METH_VAR_NAME_.4
223 .quad L_OBJC_METH_VAR_TYPE_
224 .quad "-[MyClass instance_method_01]"
225 .quad L_OBJC_METH_VAR_NAME_.5
226 .quad L_OBJC_METH_VAR_TYPE_
227 .quad "-[MyClass instance_method_02]"
230 __OBJC_CLASS_RO_$_MyClass
:
236 .quad L_OBJC_CLASS_NAME_
237 .quad __OBJC_$_INSTANCE_METHODS_MyClass
243 .globl __objc_empty_cache
244 .zerofill __DATA,__common,__objc_empty_cache,8,3
245 .section __DATA,__objc_classlist,regular,no_dead_strip
247 l_OBJC_LABEL_CLASS_$
:
248 .quad _OBJC_CLASS_$_MyClass
250 .section __DATA,__objc_imageinfo,regular,no_dead_strip
255 .subsections_via_symbols