2 # UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
3 # RUN: rm -rf %t; split-file %s %t && cd %t
5 ## Compile a64_rel_dylib.o
6 # RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos10.15 -o a64_rel_dylib.o a64_simple_class.s
8 ## Test arm64 + relative method lists
9 # RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64
10 # RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
12 ## Test arm64 + relative method lists + dead-strip
13 # RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -dead_strip
14 # RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
16 ## Test arm64 + traditional method lists (no relative offsets)
17 # RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -no_objc_relative_method_lists
18 # RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
20 ## Test arm64 + relative method lists by explicitly adding `-objc_relative_method_lists`.
21 # RUN: %lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -platform_version macOS 10.15 10.15 -objc_relative_method_lists
22 # RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
24 ## Test arm64 + no relative method lists by default.
25 # RUN: %lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -platform_version macOS 10.15 10.15
26 # RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
29 CHK_REL
: Contents of
(__DATA_CONST
,__objc_classlist
) section
30 CHK_REL-NEXT
: _OBJC_CLASS_$_MyClass
32 CHK_REL-NEXT
: entsize
12 (relative
)
34 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_00
35 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
36 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_00
]
37 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_01
38 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
39 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_01
]
40 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) instance_method_02
41 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
42 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) -[MyClass instance_method_02
]
45 CHK_REL-NEXT
: isa
0x
{{[0-9a-f
]*}} _OBJC_METACLASS_$_MyClass
46 CHK_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
47 CHK_REL-NEXT
: entsize
12 (relative
)
49 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_00
50 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
51 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_00
]
52 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_01
53 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
54 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_01
]
55 CHK_REL-NEXT
: name
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) class_method_02
56 CHK_REL-NEXT
: types
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) v16@
0:8
57 CHK_REL-NEXT
: imp
0x
{{[0-9a-f
]*}} (0x
{{[0-9a-f
]*}}) +[MyClass class_method_02
]
60 CHK_NO_REL-
NOT: (relative
)
62 CHK_NO_REL
: Contents of
(__DATA_CONST
,__objc_classlist
) section
63 CHK_NO_REL-NEXT
: _OBJC_CLASS_$_MyClass
65 CHK_NO_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
66 CHK_NO_REL-NEXT
: entsize
24
67 CHK_NO_REL-NEXT
: count
3
68 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_00
69 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
70 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_00
]
71 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_01
72 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
73 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_01
]
74 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} instance_method_02
75 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
76 CHK_NO_REL-NEXT
: imp
-[MyClass instance_method_02
]
79 CHK_NO_REL
: Meta Class
80 CHK_NO_REL-NEXT
: _OBJC_METACLASS_$_MyClass
82 CHK_NO_REL
: baseMethods
0x
{{[0-9a-f
]*}} (struct method_list_t
*)
83 CHK_NO_REL-NEXT
: entsize
24
84 CHK_NO_REL-NEXT
: count
3
85 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_00
86 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
87 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_00
]
88 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_01
89 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
90 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_01
]
91 CHK_NO_REL-NEXT
: name
0x
{{[0-9a-f
]*}} class_method_02
92 CHK_NO_REL-NEXT
: types
0x
{{[0-9a-f
]*}} v16@
0:8
93 CHK_NO_REL-NEXT
: imp
+[MyClass class_method_02
]
96 ######################## Generate a64_simple_class.s #########################
97 # clang -c simple_class.mm -s -o a64_simple_class.s -target arm64-apple-macos -arch arm64 -Oz
99 ######################## simple_class.mm ########################
100 # __attribute__((objc_root_class))
102 # - (void)instance_method_00;
103 # - (void)instance_method_01;
104 # - (void)instance_method_02;
105 # + (void)class_method_00;
106 # + (void)class_method_01;
107 # + (void)class_method_02;
110 # @implementation MyClass
111 # - (void)instance_method_00 {}
112 # - (void)instance_method_01 {}
113 # - (void)instance_method_02 {}
114 # + (void)class_method_00 {}
115 # + (void)class_method_01 {}
116 # + (void)class_method_02 {}
119 # void *_objc_empty_cache;
120 # void *_objc_empty_vtable;
124 .macro .objc_selector_def name
132 #--- a64_simple_class.s
133 .include "objc-macros.s"
135 .section __TEXT,__text,regular,pure_instructions
136 .build_version macos, 10, 15
138 .objc_selector_def "-[MyClass instance_method_00]"
139 .objc_selector_def "-[MyClass instance_method_01]"
140 .objc_selector_def "-[MyClass instance_method_02]"
142 .objc_selector_def "+[MyClass class_method_00]"
143 .objc_selector_def "+[MyClass class_method_01]"
144 .objc_selector_def "+[MyClass class_method_02]"
146 .globl __objc_empty_vtable
147 .zerofill __DATA,__common,__objc_empty_vtable,8,3
148 .section __DATA,__objc_data
149 .globl _OBJC_CLASS_$_MyClass
152 _OBJC_CLASS_$_MyClass
:
153 .quad _OBJC_METACLASS_$_MyClass
155 .quad __objc_empty_cache
156 .quad __objc_empty_vtable
157 .quad __OBJC_CLASS_RO_$_MyClass
158 .globl _OBJC_METACLASS_$_MyClass
161 _OBJC_METACLASS_$_MyClass
:
162 .quad _OBJC_METACLASS_$_MyClass
163 .quad _OBJC_CLASS_$_MyClass
164 .quad __objc_empty_cache
165 .quad __objc_empty_vtable
166 .quad __OBJC_METACLASS_RO_$_MyClass
168 .section __TEXT,__objc_classname,cstring_literals
171 .section __TEXT,__objc_methname,cstring_literals
172 l_OBJC_METH_VAR_NAME_
:
173 .asciz "class_method_00"
174 .section __TEXT,__objc_methtype,cstring_literals
175 l_OBJC_METH_VAR_TYPE_
:
177 .section __TEXT,__objc_methname,cstring_literals
178 l_OBJC_METH_VAR_NAME_.1
:
179 .asciz "class_method_01"
180 l_OBJC_METH_VAR_NAME_.2
:
181 .asciz "class_method_02"
182 .section __DATA,__objc_const
184 __OBJC_$_CLASS_METHODS_MyClass
:
187 .quad l_OBJC_METH_VAR_NAME_
188 .quad l_OBJC_METH_VAR_TYPE_
189 .quad "+[MyClass class_method_00]"
190 .quad l_OBJC_METH_VAR_NAME_.1
191 .quad l_OBJC_METH_VAR_TYPE_
192 .quad "+[MyClass class_method_01]"
193 .quad l_OBJC_METH_VAR_NAME_.2
194 .quad l_OBJC_METH_VAR_TYPE_
195 .quad "+[MyClass class_method_02]"
198 __OBJC_METACLASS_RO_$_MyClass
:
204 .quad l_OBJC_CLASS_NAME_
205 .quad __OBJC_$_CLASS_METHODS_MyClass
211 .section __TEXT,__objc_methname,cstring_literals
212 l_OBJC_METH_VAR_NAME_.3
:
213 .asciz "instance_method_00"
214 l_OBJC_METH_VAR_NAME_.4
:
215 .asciz "instance_method_01"
216 l_OBJC_METH_VAR_NAME_.5
:
217 .asciz "instance_method_02"
219 .section __DATA,__objc_const
221 __OBJC_$_INSTANCE_METHODS_MyClass
:
224 .quad l_OBJC_METH_VAR_NAME_.3
225 .quad l_OBJC_METH_VAR_TYPE_
226 .quad "-[MyClass instance_method_00]"
227 .quad l_OBJC_METH_VAR_NAME_.4
228 .quad l_OBJC_METH_VAR_TYPE_
229 .quad "-[MyClass instance_method_01]"
230 .quad l_OBJC_METH_VAR_NAME_.5
231 .quad l_OBJC_METH_VAR_TYPE_
232 .quad "-[MyClass instance_method_02]"
235 __OBJC_CLASS_RO_$_MyClass
:
241 .quad l_OBJC_CLASS_NAME_
242 .quad __OBJC_$_INSTANCE_METHODS_MyClass
247 .globl __objc_empty_cache
249 .zerofill __DATA,__common,__objc_empty_cache,8,3
250 .section __DATA,__objc_classlist,regular,no_dead_strip
252 l_OBJC_LABEL_CLASS_$
:
253 .quad _OBJC_CLASS_$_MyClass
254 .section __DATA,__objc_imageinfo,regular,no_dead_strip
258 .subsections_via_symbols