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