xref: /llvm-project/lld/test/MachO/objc-relative-method-lists-simple.s (revision 89a1f144f3890d9bd8ab30537b36f8c18038719b)
1# REQUIRES: aarch64
2# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
3# RUN: rm -rf %t; split-file %s %t && cd %t
4
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
7
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
11
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
15
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
19
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
23
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
27
28
29CHK_REL:       Contents of (__DATA_CONST,__objc_classlist) section
30CHK_REL-NEXT:  _OBJC_CLASS_$_MyClass
31CHK_REL:       baseMethods
32CHK_REL-NEXT:  entsize 12 (relative)
33CHK_REL-NEXT:  count 3
34CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_00
35CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
36CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_00]
37CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_01
38CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
39CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_01]
40CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_02
41CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
42CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]
43
44CHK_REL:       Meta Class
45CHK_REL-NEXT:  isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass
46CHK_REL:       baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
47CHK_REL-NEXT:  entsize 12 (relative)
48CHK_REL-NEXT:  count 3
49CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_00
50CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
51CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_00]
52CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_01
53CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
54CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_01]
55CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_02
56CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
57CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_02]
58
59
60CHK_NO_REL-NOT: (relative)
61
62CHK_NO_REL:           Contents of (__DATA_CONST,__objc_classlist) section
63CHK_NO_REL-NEXT:      _OBJC_CLASS_$_MyClass
64
65CHK_NO_REL:            baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
66CHK_NO_REL-NEXT:		   entsize 24
67CHK_NO_REL-NEXT:		     count 3
68CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_00
69CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
70CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_00]
71CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_01
72CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
73CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_01]
74CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_02
75CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
76CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_02]
77
78
79CHK_NO_REL:             Meta Class
80CHK_NO_REL-NEXT:        _OBJC_METACLASS_$_MyClass
81
82CHK_NO_REL:             baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
83CHK_NO_REL-NEXT:		   entsize 24
84CHK_NO_REL-NEXT:		     count 3
85CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_00
86CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
87CHK_NO_REL-NEXT:		       imp +[MyClass class_method_00]
88CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_01
89CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
90CHK_NO_REL-NEXT:		       imp +[MyClass class_method_01]
91CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_02
92CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
93CHK_NO_REL-NEXT:		       imp +[MyClass class_method_02]
94
95
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
98
99########################       simple_class.mm       ########################
100#  __attribute__((objc_root_class))
101#  @interface MyClass
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;
108#  @end
109#
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 {}
117#  @end
118#
119#  void *_objc_empty_cache;
120#  void *_objc_empty_vtable;
121#
122
123#--- objc-macros.s
124.macro .objc_selector_def name
125	.p2align	2
126"\name":
127	.cfi_startproc
128	ret
129	.cfi_endproc
130.endm
131
132#--- a64_simple_class.s
133.include "objc-macros.s"
134
135.section	__TEXT,__text,regular,pure_instructions
136.build_version macos, 10, 15
137
138.objc_selector_def "-[MyClass instance_method_00]"
139.objc_selector_def "-[MyClass instance_method_01]"
140.objc_selector_def "-[MyClass instance_method_02]"
141
142.objc_selector_def "+[MyClass class_method_00]"
143.objc_selector_def "+[MyClass class_method_01]"
144.objc_selector_def "+[MyClass class_method_02]"
145
146.globl	__objc_empty_vtable
147.zerofill __DATA,__common,__objc_empty_vtable,8,3
148.section	__DATA,__objc_data
149.globl	_OBJC_CLASS_$_MyClass
150.p2align	3, 0x0
151
152_OBJC_CLASS_$_MyClass:
153	.quad	_OBJC_METACLASS_$_MyClass
154	.quad	0
155	.quad	__objc_empty_cache
156	.quad	__objc_empty_vtable
157	.quad	__OBJC_CLASS_RO_$_MyClass
158	.globl	_OBJC_METACLASS_$_MyClass
159	.p2align	3, 0x0
160
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
167
168	.section	__TEXT,__objc_classname,cstring_literals
169l_OBJC_CLASS_NAME_:
170	.asciz	"MyClass"
171	.section	__TEXT,__objc_methname,cstring_literals
172l_OBJC_METH_VAR_NAME_:
173	.asciz	"class_method_00"
174	.section	__TEXT,__objc_methtype,cstring_literals
175l_OBJC_METH_VAR_TYPE_:
176	.asciz	"v16@0:8"
177	.section	__TEXT,__objc_methname,cstring_literals
178l_OBJC_METH_VAR_NAME_.1:
179	.asciz	"class_method_01"
180l_OBJC_METH_VAR_NAME_.2:
181	.asciz	"class_method_02"
182	.section	__DATA,__objc_const
183	.p2align	3, 0x0
184__OBJC_$_CLASS_METHODS_MyClass:
185	.long	24
186	.long	3
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]"
196	.p2align	3, 0x0
197
198__OBJC_METACLASS_RO_$_MyClass:
199	.long	3
200	.long	40
201	.long	40
202	.space	4
203	.quad	0
204	.quad	l_OBJC_CLASS_NAME_
205	.quad	__OBJC_$_CLASS_METHODS_MyClass
206	.quad	0
207	.quad	0
208	.quad	0
209	.quad	0
210
211	.section	__TEXT,__objc_methname,cstring_literals
212l_OBJC_METH_VAR_NAME_.3:
213	.asciz	"instance_method_00"
214l_OBJC_METH_VAR_NAME_.4:
215	.asciz	"instance_method_01"
216l_OBJC_METH_VAR_NAME_.5:
217	.asciz	"instance_method_02"
218
219	.section	__DATA,__objc_const
220	.p2align	3, 0x0
221__OBJC_$_INSTANCE_METHODS_MyClass:
222	.long	24
223	.long	3
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]"
233	.p2align	3, 0x0
234
235__OBJC_CLASS_RO_$_MyClass:
236	.long	2
237	.long	0
238	.long	0
239	.space	4
240	.quad	0
241	.quad	l_OBJC_CLASS_NAME_
242	.quad	__OBJC_$_INSTANCE_METHODS_MyClass
243	.quad	0
244	.quad	0
245	.quad	0
246	.quad	0
247	.globl	__objc_empty_cache
248
249.zerofill __DATA,__common,__objc_empty_cache,8,3
250	.section	__DATA,__objc_classlist,regular,no_dead_strip
251	.p2align	3, 0x0
252l_OBJC_LABEL_CLASS_$:
253	.quad	_OBJC_CLASS_$_MyClass
254	.section	__DATA,__objc_imageinfo,regular,no_dead_strip
255L_OBJC_IMAGE_INFO:
256	.long	0
257	.long	64
258.subsections_via_symbols
259