xref: /llvm-project/lld/test/MachO/objc-relative-method-lists-simple.s (revision 89a1f144f3890d9bd8ab30537b36f8c18038719b)
1742a82a7Salx32# REQUIRES: aarch64
26b957470SLeandro Lupori# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
3742a82a7Salx32# RUN: rm -rf %t; split-file %s %t && cd %t
4742a82a7Salx32
5742a82a7Salx32## Compile a64_rel_dylib.o
6*89a1f144SPeter Rong# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos10.15 -o a64_rel_dylib.o a64_simple_class.s
7742a82a7Salx32
8742a82a7Salx32## Test arm64 + relative method lists
9*89a1f144SPeter Rong# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64
10742a82a7Salx32# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_REL
11742a82a7Salx32
12bbfa5069Salx32## Test arm64 + relative method lists + dead-strip
13*89a1f144SPeter Rong# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -dead_strip
14bbfa5069Salx32# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_REL
15bbfa5069Salx32
16742a82a7Salx32## Test arm64 + traditional method lists (no relative offsets)
17742a82a7Salx32# 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
18742a82a7Salx32# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_NO_REL
19742a82a7Salx32
20*89a1f144SPeter Rong## Test arm64 + relative method lists by explicitly adding `-objc_relative_method_lists`.
21*89a1f144SPeter Rong# 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*89a1f144SPeter Rong# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_REL
23*89a1f144SPeter Rong
24*89a1f144SPeter Rong## Test arm64 + no relative method lists by default.
25*89a1f144SPeter Rong# 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*89a1f144SPeter Rong# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_NO_REL
27*89a1f144SPeter Rong
28742a82a7Salx32
29742a82a7Salx32CHK_REL:       Contents of (__DATA_CONST,__objc_classlist) section
30742a82a7Salx32CHK_REL-NEXT:  _OBJC_CLASS_$_MyClass
31742a82a7Salx32CHK_REL:       baseMethods
32742a82a7Salx32CHK_REL-NEXT:  entsize 12 (relative)
33742a82a7Salx32CHK_REL-NEXT:  count 3
34742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_00
35742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
36742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_00]
37742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_01
38742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
39742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_01]
40742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_02
41742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
42742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]
43742a82a7Salx32
44742a82a7Salx32CHK_REL:       Meta Class
45742a82a7Salx32CHK_REL-NEXT:  isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass
46742a82a7Salx32CHK_REL:       baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
47742a82a7Salx32CHK_REL-NEXT:  entsize 12 (relative)
48742a82a7Salx32CHK_REL-NEXT:  count 3
49742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_00
50742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
51742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_00]
52742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_01
53742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
54742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_01]
55742a82a7Salx32CHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_02
56742a82a7Salx32CHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
57742a82a7Salx32CHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_02]
58742a82a7Salx32
59742a82a7Salx32
60742a82a7Salx32CHK_NO_REL-NOT: (relative)
61742a82a7Salx32
62742a82a7Salx32CHK_NO_REL:           Contents of (__DATA_CONST,__objc_classlist) section
63742a82a7Salx32CHK_NO_REL-NEXT:      _OBJC_CLASS_$_MyClass
64742a82a7Salx32
65742a82a7Salx32CHK_NO_REL:            baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
66742a82a7Salx32CHK_NO_REL-NEXT:		   entsize 24
67742a82a7Salx32CHK_NO_REL-NEXT:		     count 3
68742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_00
69742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
70742a82a7Salx32CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_00]
71742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_01
72742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
73742a82a7Salx32CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_01]
74742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_02
75742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
76742a82a7Salx32CHK_NO_REL-NEXT:		       imp -[MyClass instance_method_02]
77742a82a7Salx32
78742a82a7Salx32
79742a82a7Salx32CHK_NO_REL:             Meta Class
80742a82a7Salx32CHK_NO_REL-NEXT:        _OBJC_METACLASS_$_MyClass
81742a82a7Salx32
82742a82a7Salx32CHK_NO_REL:             baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
83742a82a7Salx32CHK_NO_REL-NEXT:		   entsize 24
84742a82a7Salx32CHK_NO_REL-NEXT:		     count 3
85742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_00
86742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
87742a82a7Salx32CHK_NO_REL-NEXT:		       imp +[MyClass class_method_00]
88742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_01
89742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
90742a82a7Salx32CHK_NO_REL-NEXT:		       imp +[MyClass class_method_01]
91742a82a7Salx32CHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_02
92742a82a7Salx32CHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
93742a82a7Salx32CHK_NO_REL-NEXT:		       imp +[MyClass class_method_02]
94742a82a7Salx32
95742a82a7Salx32
96742a82a7Salx32######################## Generate a64_simple_class.s #########################
97742a82a7Salx32# clang -c simple_class.mm -s -o a64_simple_class.s -target arm64-apple-macos -arch arm64 -Oz
98742a82a7Salx32
99742a82a7Salx32########################       simple_class.mm       ########################
100742a82a7Salx32#  __attribute__((objc_root_class))
101742a82a7Salx32#  @interface MyClass
102742a82a7Salx32#  - (void)instance_method_00;
103742a82a7Salx32#  - (void)instance_method_01;
104742a82a7Salx32#  - (void)instance_method_02;
105742a82a7Salx32#  + (void)class_method_00;
106742a82a7Salx32#  + (void)class_method_01;
107742a82a7Salx32#  + (void)class_method_02;
108742a82a7Salx32#  @end
109742a82a7Salx32#
110742a82a7Salx32#  @implementation MyClass
111742a82a7Salx32#  - (void)instance_method_00 {}
112742a82a7Salx32#  - (void)instance_method_01 {}
113742a82a7Salx32#  - (void)instance_method_02 {}
114742a82a7Salx32#  + (void)class_method_00 {}
115742a82a7Salx32#  + (void)class_method_01 {}
116742a82a7Salx32#  + (void)class_method_02 {}
117742a82a7Salx32#  @end
118742a82a7Salx32#
119742a82a7Salx32#  void *_objc_empty_cache;
120742a82a7Salx32#  void *_objc_empty_vtable;
121742a82a7Salx32#
122742a82a7Salx32
123742a82a7Salx32#--- objc-macros.s
124742a82a7Salx32.macro .objc_selector_def name
125742a82a7Salx32	.p2align	2
126742a82a7Salx32"\name":
127742a82a7Salx32	.cfi_startproc
128742a82a7Salx32	ret
129742a82a7Salx32	.cfi_endproc
130742a82a7Salx32.endm
131742a82a7Salx32
132742a82a7Salx32#--- a64_simple_class.s
133742a82a7Salx32.include "objc-macros.s"
134742a82a7Salx32
135742a82a7Salx32.section	__TEXT,__text,regular,pure_instructions
136*89a1f144SPeter Rong.build_version macos, 10, 15
137742a82a7Salx32
138742a82a7Salx32.objc_selector_def "-[MyClass instance_method_00]"
139742a82a7Salx32.objc_selector_def "-[MyClass instance_method_01]"
140742a82a7Salx32.objc_selector_def "-[MyClass instance_method_02]"
141742a82a7Salx32
142742a82a7Salx32.objc_selector_def "+[MyClass class_method_00]"
143742a82a7Salx32.objc_selector_def "+[MyClass class_method_01]"
144742a82a7Salx32.objc_selector_def "+[MyClass class_method_02]"
145742a82a7Salx32
146742a82a7Salx32.globl	__objc_empty_vtable
147742a82a7Salx32.zerofill __DATA,__common,__objc_empty_vtable,8,3
148742a82a7Salx32.section	__DATA,__objc_data
149742a82a7Salx32.globl	_OBJC_CLASS_$_MyClass
150742a82a7Salx32.p2align	3, 0x0
151742a82a7Salx32
152742a82a7Salx32_OBJC_CLASS_$_MyClass:
153742a82a7Salx32	.quad	_OBJC_METACLASS_$_MyClass
154742a82a7Salx32	.quad	0
155742a82a7Salx32	.quad	__objc_empty_cache
156742a82a7Salx32	.quad	__objc_empty_vtable
157742a82a7Salx32	.quad	__OBJC_CLASS_RO_$_MyClass
158742a82a7Salx32	.globl	_OBJC_METACLASS_$_MyClass
159742a82a7Salx32	.p2align	3, 0x0
160742a82a7Salx32
161742a82a7Salx32_OBJC_METACLASS_$_MyClass:
162742a82a7Salx32	.quad	_OBJC_METACLASS_$_MyClass
163742a82a7Salx32	.quad	_OBJC_CLASS_$_MyClass
164742a82a7Salx32	.quad	__objc_empty_cache
165742a82a7Salx32	.quad	__objc_empty_vtable
166742a82a7Salx32	.quad	__OBJC_METACLASS_RO_$_MyClass
167742a82a7Salx32
168742a82a7Salx32	.section	__TEXT,__objc_classname,cstring_literals
169742a82a7Salx32l_OBJC_CLASS_NAME_:
170742a82a7Salx32	.asciz	"MyClass"
171742a82a7Salx32	.section	__TEXT,__objc_methname,cstring_literals
172742a82a7Salx32l_OBJC_METH_VAR_NAME_:
173742a82a7Salx32	.asciz	"class_method_00"
174742a82a7Salx32	.section	__TEXT,__objc_methtype,cstring_literals
175742a82a7Salx32l_OBJC_METH_VAR_TYPE_:
176742a82a7Salx32	.asciz	"v16@0:8"
177742a82a7Salx32	.section	__TEXT,__objc_methname,cstring_literals
178742a82a7Salx32l_OBJC_METH_VAR_NAME_.1:
179742a82a7Salx32	.asciz	"class_method_01"
180742a82a7Salx32l_OBJC_METH_VAR_NAME_.2:
181742a82a7Salx32	.asciz	"class_method_02"
182742a82a7Salx32	.section	__DATA,__objc_const
183742a82a7Salx32	.p2align	3, 0x0
184742a82a7Salx32__OBJC_$_CLASS_METHODS_MyClass:
185742a82a7Salx32	.long	24
186742a82a7Salx32	.long	3
187742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_
188742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
189742a82a7Salx32	.quad	"+[MyClass class_method_00]"
190742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_.1
191742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
192742a82a7Salx32	.quad	"+[MyClass class_method_01]"
193742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_.2
194742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
195742a82a7Salx32	.quad	"+[MyClass class_method_02]"
196742a82a7Salx32	.p2align	3, 0x0
197742a82a7Salx32
198742a82a7Salx32__OBJC_METACLASS_RO_$_MyClass:
199742a82a7Salx32	.long	3
200742a82a7Salx32	.long	40
201742a82a7Salx32	.long	40
202742a82a7Salx32	.space	4
203742a82a7Salx32	.quad	0
204742a82a7Salx32	.quad	l_OBJC_CLASS_NAME_
205742a82a7Salx32	.quad	__OBJC_$_CLASS_METHODS_MyClass
206742a82a7Salx32	.quad	0
207742a82a7Salx32	.quad	0
208742a82a7Salx32	.quad	0
209742a82a7Salx32	.quad	0
210742a82a7Salx32
211742a82a7Salx32	.section	__TEXT,__objc_methname,cstring_literals
212742a82a7Salx32l_OBJC_METH_VAR_NAME_.3:
213742a82a7Salx32	.asciz	"instance_method_00"
214742a82a7Salx32l_OBJC_METH_VAR_NAME_.4:
215742a82a7Salx32	.asciz	"instance_method_01"
216742a82a7Salx32l_OBJC_METH_VAR_NAME_.5:
217742a82a7Salx32	.asciz	"instance_method_02"
218742a82a7Salx32
219742a82a7Salx32	.section	__DATA,__objc_const
220742a82a7Salx32	.p2align	3, 0x0
221742a82a7Salx32__OBJC_$_INSTANCE_METHODS_MyClass:
222742a82a7Salx32	.long	24
223742a82a7Salx32	.long	3
224742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_.3
225742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
226742a82a7Salx32	.quad	"-[MyClass instance_method_00]"
227742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_.4
228742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
229742a82a7Salx32	.quad	"-[MyClass instance_method_01]"
230742a82a7Salx32	.quad	l_OBJC_METH_VAR_NAME_.5
231742a82a7Salx32	.quad	l_OBJC_METH_VAR_TYPE_
232742a82a7Salx32	.quad	"-[MyClass instance_method_02]"
233742a82a7Salx32	.p2align	3, 0x0
234742a82a7Salx32
235742a82a7Salx32__OBJC_CLASS_RO_$_MyClass:
236742a82a7Salx32	.long	2
237742a82a7Salx32	.long	0
238742a82a7Salx32	.long	0
239742a82a7Salx32	.space	4
240742a82a7Salx32	.quad	0
241742a82a7Salx32	.quad	l_OBJC_CLASS_NAME_
242742a82a7Salx32	.quad	__OBJC_$_INSTANCE_METHODS_MyClass
243742a82a7Salx32	.quad	0
244742a82a7Salx32	.quad	0
245742a82a7Salx32	.quad	0
246742a82a7Salx32	.quad	0
247742a82a7Salx32	.globl	__objc_empty_cache
248742a82a7Salx32
249742a82a7Salx32.zerofill __DATA,__common,__objc_empty_cache,8,3
250742a82a7Salx32	.section	__DATA,__objc_classlist,regular,no_dead_strip
251742a82a7Salx32	.p2align	3, 0x0
252742a82a7Salx32l_OBJC_LABEL_CLASS_$:
253742a82a7Salx32	.quad	_OBJC_CLASS_$_MyClass
254742a82a7Salx32	.section	__DATA,__objc_imageinfo,regular,no_dead_strip
255742a82a7Salx32L_OBJC_IMAGE_INFO:
256742a82a7Salx32	.long	0
257742a82a7Salx32	.long	64
258742a82a7Salx32.subsections_via_symbols
259