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