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