xref: /llvm-project/lld/test/MachO/objc-relative-method-lists-simple-x86.s (revision 51ed383d3803051922ab5f7ff19a38454a415ddb)
1*51ed383dSDaniel Bertalan# REQUIRES: x86
2*51ed383dSDaniel Bertalan# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
3*51ed383dSDaniel Bertalan# RUN: rm -rf %t; split-file %s %t && cd %t
4*51ed383dSDaniel Bertalan
5*51ed383dSDaniel Bertalan## Compile rel_dylib.o
6*51ed383dSDaniel Bertalan# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o rel_dylib.o simple_class.s
7*51ed383dSDaniel Bertalan
8*51ed383dSDaniel Bertalan## Test relative method lists
9*51ed383dSDaniel Bertalan# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists
10*51ed383dSDaniel Bertalan# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_REL
11*51ed383dSDaniel Bertalan
12*51ed383dSDaniel Bertalan## Test relative method lists + dead-strip
13*51ed383dSDaniel Bertalan# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -objc_relative_method_lists -dead_strip
14*51ed383dSDaniel Bertalan# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_REL
15*51ed383dSDaniel Bertalan
16*51ed383dSDaniel Bertalan## Test traditional method lists (no relative offsets)
17*51ed383dSDaniel Bertalan# RUN: %no-lsystem-lld rel_dylib.o -o rel_dylib.dylib -map rel_dylib.map -dylib -no_objc_relative_method_lists
18*51ed383dSDaniel Bertalan# RUN: llvm-objdump --macho --objc-meta-data rel_dylib.dylib  | FileCheck %s --check-prefix=CHK_NO_REL
19*51ed383dSDaniel Bertalan
20*51ed383dSDaniel Bertalan
21*51ed383dSDaniel BertalanCHK_REL:       Contents of (__DATA_CONST,__objc_classlist) section
22*51ed383dSDaniel BertalanCHK_REL-NEXT:  _OBJC_CLASS_$_MyClass
23*51ed383dSDaniel BertalanCHK_REL:       baseMethods
24*51ed383dSDaniel BertalanCHK_REL-NEXT:  entsize 12 (relative)
25*51ed383dSDaniel BertalanCHK_REL-NEXT:  count 3
26*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_00
27*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
28*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_00]
29*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_01
30*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
31*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_01]
32*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_02
33*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
34*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]
35*51ed383dSDaniel Bertalan
36*51ed383dSDaniel BertalanCHK_REL:       Meta Class
37*51ed383dSDaniel BertalanCHK_REL-NEXT:  isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass
38*51ed383dSDaniel BertalanCHK_REL:       baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
39*51ed383dSDaniel BertalanCHK_REL-NEXT:  entsize 12 (relative)
40*51ed383dSDaniel BertalanCHK_REL-NEXT:  count 3
41*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_00
42*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
43*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_00]
44*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_01
45*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
46*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_01]
47*51ed383dSDaniel BertalanCHK_REL-NEXT:   name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  class_method_02
48*51ed383dSDaniel BertalanCHK_REL-NEXT:  types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  v16@0:8
49*51ed383dSDaniel BertalanCHK_REL-NEXT:    imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}})  +[MyClass class_method_02]
50*51ed383dSDaniel Bertalan
51*51ed383dSDaniel Bertalan
52*51ed383dSDaniel BertalanCHK_NO_REL-NOT: (relative)
53*51ed383dSDaniel Bertalan
54*51ed383dSDaniel BertalanCHK_NO_REL:           Contents of (__DATA_CONST,__objc_classlist) section
55*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:      _OBJC_CLASS_$_MyClass
56*51ed383dSDaniel Bertalan
57*51ed383dSDaniel BertalanCHK_NO_REL:            baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
58*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		   entsize 24
59*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     count 3
60*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_00
61*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
62*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp -[MyClass instance_method_00]
63*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_01
64*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
65*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp -[MyClass instance_method_01]
66*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} instance_method_02
67*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
68*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp -[MyClass instance_method_02]
69*51ed383dSDaniel Bertalan
70*51ed383dSDaniel Bertalan
71*51ed383dSDaniel BertalanCHK_NO_REL:             Meta Class
72*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:        _OBJC_METACLASS_$_MyClass
73*51ed383dSDaniel Bertalan
74*51ed383dSDaniel BertalanCHK_NO_REL:             baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
75*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		   entsize 24
76*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     count 3
77*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_00
78*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
79*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp +[MyClass class_method_00]
80*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_01
81*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
82*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp +[MyClass class_method_01]
83*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		      name 0x{{[0-9a-f]*}} class_method_02
84*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		     types 0x{{[0-9a-f]*}} v16@0:8
85*51ed383dSDaniel BertalanCHK_NO_REL-NEXT:		       imp +[MyClass class_method_02]
86*51ed383dSDaniel Bertalan
87*51ed383dSDaniel Bertalan
88*51ed383dSDaniel Bertalan######################## Generate simple_class.s #########################
89*51ed383dSDaniel Bertalan# clang -c simple_class.mm -s -o simple_class.s -target x86_64-apple-macos11 -Oz
90*51ed383dSDaniel Bertalan
91*51ed383dSDaniel Bertalan########################       simple_class.mm       ########################
92*51ed383dSDaniel Bertalan#  __attribute__((objc_root_class))
93*51ed383dSDaniel Bertalan#  @interface MyClass
94*51ed383dSDaniel Bertalan#  - (void)instance_method_00;
95*51ed383dSDaniel Bertalan#  - (void)instance_method_01;
96*51ed383dSDaniel Bertalan#  - (void)instance_method_02;
97*51ed383dSDaniel Bertalan#  + (void)class_method_00;
98*51ed383dSDaniel Bertalan#  + (void)class_method_01;
99*51ed383dSDaniel Bertalan#  + (void)class_method_02;
100*51ed383dSDaniel Bertalan#  @end
101*51ed383dSDaniel Bertalan#
102*51ed383dSDaniel Bertalan#  @implementation MyClass
103*51ed383dSDaniel Bertalan#  - (void)instance_method_00 {}
104*51ed383dSDaniel Bertalan#  - (void)instance_method_01 {}
105*51ed383dSDaniel Bertalan#  - (void)instance_method_02 {}
106*51ed383dSDaniel Bertalan#  + (void)class_method_00 {}
107*51ed383dSDaniel Bertalan#  + (void)class_method_01 {}
108*51ed383dSDaniel Bertalan#  + (void)class_method_02 {}
109*51ed383dSDaniel Bertalan#  @end
110*51ed383dSDaniel Bertalan#
111*51ed383dSDaniel Bertalan#  void *_objc_empty_cache;
112*51ed383dSDaniel Bertalan#
113*51ed383dSDaniel Bertalan
114*51ed383dSDaniel Bertalan#--- objc-macros.s
115*51ed383dSDaniel Bertalan.macro .objc_selector_def name
116*51ed383dSDaniel Bertalan	.p2align	2
117*51ed383dSDaniel Bertalan"\name":
118*51ed383dSDaniel Bertalan	.cfi_startproc
119*51ed383dSDaniel Bertalan	ret
120*51ed383dSDaniel Bertalan	.cfi_endproc
121*51ed383dSDaniel Bertalan.endm
122*51ed383dSDaniel Bertalan
123*51ed383dSDaniel Bertalan#--- simple_class.s
124*51ed383dSDaniel Bertalan.include "objc-macros.s"
125*51ed383dSDaniel Bertalan
126*51ed383dSDaniel Bertalan.section	__TEXT,__text,regular,pure_instructions
127*51ed383dSDaniel Bertalan.build_version macos, 11, 0
128*51ed383dSDaniel Bertalan
129*51ed383dSDaniel Bertalan.objc_selector_def "-[MyClass instance_method_00]"
130*51ed383dSDaniel Bertalan.objc_selector_def "-[MyClass instance_method_01]"
131*51ed383dSDaniel Bertalan.objc_selector_def "-[MyClass instance_method_02]"
132*51ed383dSDaniel Bertalan
133*51ed383dSDaniel Bertalan.objc_selector_def "+[MyClass class_method_00]"
134*51ed383dSDaniel Bertalan.objc_selector_def "+[MyClass class_method_01]"
135*51ed383dSDaniel Bertalan.objc_selector_def "+[MyClass class_method_02]"
136*51ed383dSDaniel Bertalan
137*51ed383dSDaniel Bertalan.section	__DATA,__objc_data
138*51ed383dSDaniel Bertalan.globl	_OBJC_CLASS_$_MyClass
139*51ed383dSDaniel Bertalan.p2align	3, 0x0
140*51ed383dSDaniel Bertalan_OBJC_CLASS_$_MyClass:
141*51ed383dSDaniel Bertalan	.quad	_OBJC_METACLASS_$_MyClass
142*51ed383dSDaniel Bertalan	.quad	0
143*51ed383dSDaniel Bertalan	.quad	__objc_empty_cache
144*51ed383dSDaniel Bertalan	.quad	0
145*51ed383dSDaniel Bertalan	.quad	__OBJC_CLASS_RO_$_MyClass
146*51ed383dSDaniel Bertalan
147*51ed383dSDaniel Bertalan	.globl	_OBJC_METACLASS_$_MyClass
148*51ed383dSDaniel Bertalan	.p2align	3, 0x0
149*51ed383dSDaniel Bertalan_OBJC_METACLASS_$_MyClass:
150*51ed383dSDaniel Bertalan	.quad	_OBJC_METACLASS_$_MyClass
151*51ed383dSDaniel Bertalan	.quad	_OBJC_CLASS_$_MyClass
152*51ed383dSDaniel Bertalan	.quad	__objc_empty_cache
153*51ed383dSDaniel Bertalan	.quad	0
154*51ed383dSDaniel Bertalan	.quad	__OBJC_METACLASS_RO_$_MyClass
155*51ed383dSDaniel Bertalan
156*51ed383dSDaniel Bertalan	.section	__TEXT,__objc_classname,cstring_literals
157*51ed383dSDaniel BertalanL_OBJC_CLASS_NAME_:
158*51ed383dSDaniel Bertalan	.asciz	"MyClass"
159*51ed383dSDaniel Bertalan
160*51ed383dSDaniel Bertalan	.section	__TEXT,__objc_methname,cstring_literals
161*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_:
162*51ed383dSDaniel Bertalan	.asciz	"class_method_00"
163*51ed383dSDaniel Bertalan
164*51ed383dSDaniel Bertalan	.section	__TEXT,__objc_methtype,cstring_literals
165*51ed383dSDaniel BertalanL_OBJC_METH_VAR_TYPE_:
166*51ed383dSDaniel Bertalan	.asciz	"v16@0:8"
167*51ed383dSDaniel Bertalan
168*51ed383dSDaniel Bertalan	.section	__TEXT,__objc_methname,cstring_literals
169*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_.1:
170*51ed383dSDaniel Bertalan	.asciz	"class_method_01"
171*51ed383dSDaniel Bertalan
172*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_.2:
173*51ed383dSDaniel Bertalan	.asciz	"class_method_02"
174*51ed383dSDaniel Bertalan
175*51ed383dSDaniel Bertalan	.section	__DATA,__objc_const
176*51ed383dSDaniel Bertalan	.p2align	3, 0x0
177*51ed383dSDaniel Bertalan__OBJC_$_CLASS_METHODS_MyClass:
178*51ed383dSDaniel Bertalan	.long	24
179*51ed383dSDaniel Bertalan	.long	3
180*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_
181*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
182*51ed383dSDaniel Bertalan	.quad	"+[MyClass class_method_00]"
183*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_.1
184*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
185*51ed383dSDaniel Bertalan	.quad	"+[MyClass class_method_01]"
186*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_.2
187*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
188*51ed383dSDaniel Bertalan	.quad	"+[MyClass class_method_02]"
189*51ed383dSDaniel Bertalan
190*51ed383dSDaniel Bertalan	.p2align	3, 0x0
191*51ed383dSDaniel Bertalan__OBJC_METACLASS_RO_$_MyClass:
192*51ed383dSDaniel Bertalan	.long	3
193*51ed383dSDaniel Bertalan	.long	40
194*51ed383dSDaniel Bertalan	.long	40
195*51ed383dSDaniel Bertalan	.space	4
196*51ed383dSDaniel Bertalan	.quad	0
197*51ed383dSDaniel Bertalan	.quad	L_OBJC_CLASS_NAME_
198*51ed383dSDaniel Bertalan	.quad	__OBJC_$_CLASS_METHODS_MyClass
199*51ed383dSDaniel Bertalan	.quad	0
200*51ed383dSDaniel Bertalan	.quad	0
201*51ed383dSDaniel Bertalan	.quad	0
202*51ed383dSDaniel Bertalan	.quad	0
203*51ed383dSDaniel Bertalan
204*51ed383dSDaniel Bertalan	.section	__TEXT,__objc_methname,cstring_literals
205*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_.3:
206*51ed383dSDaniel Bertalan	.asciz	"instance_method_00"
207*51ed383dSDaniel Bertalan
208*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_.4:
209*51ed383dSDaniel Bertalan	.asciz	"instance_method_01"
210*51ed383dSDaniel Bertalan
211*51ed383dSDaniel BertalanL_OBJC_METH_VAR_NAME_.5:
212*51ed383dSDaniel Bertalan	.asciz	"instance_method_02"
213*51ed383dSDaniel Bertalan
214*51ed383dSDaniel Bertalan	.section	__DATA,__objc_const
215*51ed383dSDaniel Bertalan	.p2align	3, 0x0
216*51ed383dSDaniel Bertalan__OBJC_$_INSTANCE_METHODS_MyClass:
217*51ed383dSDaniel Bertalan	.long	24
218*51ed383dSDaniel Bertalan	.long	3
219*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_.3
220*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
221*51ed383dSDaniel Bertalan	.quad	"-[MyClass instance_method_00]"
222*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_.4
223*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
224*51ed383dSDaniel Bertalan	.quad	"-[MyClass instance_method_01]"
225*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_NAME_.5
226*51ed383dSDaniel Bertalan	.quad	L_OBJC_METH_VAR_TYPE_
227*51ed383dSDaniel Bertalan	.quad	"-[MyClass instance_method_02]"
228*51ed383dSDaniel Bertalan
229*51ed383dSDaniel Bertalan	.p2align	3, 0x0
230*51ed383dSDaniel Bertalan__OBJC_CLASS_RO_$_MyClass:
231*51ed383dSDaniel Bertalan	.long	2
232*51ed383dSDaniel Bertalan	.long	0
233*51ed383dSDaniel Bertalan	.long	0
234*51ed383dSDaniel Bertalan	.space	4
235*51ed383dSDaniel Bertalan	.quad	0
236*51ed383dSDaniel Bertalan	.quad	L_OBJC_CLASS_NAME_
237*51ed383dSDaniel Bertalan	.quad	__OBJC_$_INSTANCE_METHODS_MyClass
238*51ed383dSDaniel Bertalan	.quad	0
239*51ed383dSDaniel Bertalan	.quad	0
240*51ed383dSDaniel Bertalan	.quad	0
241*51ed383dSDaniel Bertalan	.quad	0
242*51ed383dSDaniel Bertalan
243*51ed383dSDaniel Bertalan	.globl	__objc_empty_cache
244*51ed383dSDaniel Bertalan.zerofill __DATA,__common,__objc_empty_cache,8,3
245*51ed383dSDaniel Bertalan	.section	__DATA,__objc_classlist,regular,no_dead_strip
246*51ed383dSDaniel Bertalan	.p2align	3, 0x0
247*51ed383dSDaniel Bertalanl_OBJC_LABEL_CLASS_$:
248*51ed383dSDaniel Bertalan	.quad	_OBJC_CLASS_$_MyClass
249*51ed383dSDaniel Bertalan
250*51ed383dSDaniel Bertalan	.section	__DATA,__objc_imageinfo,regular,no_dead_strip
251*51ed383dSDaniel BertalanL_OBJC_IMAGE_INFO:
252*51ed383dSDaniel Bertalan	.long	0
253*51ed383dSDaniel Bertalan	.long	64
254*51ed383dSDaniel Bertalan
255*51ed383dSDaniel Bertalan.subsections_via_symbols
256