259 lines · plain
1# REQUIRES: aarch642# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf3# RUN: rm -rf %t; split-file %s %t && cd %t4 5## Compile a64_rel_dylib.o6# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos10.15 -o a64_rel_dylib.o a64_simple_class.s7 8## Test arm64 + relative method lists9# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm6410# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL11 12## Test arm64 + relative method lists + dead-strip13# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -dead_strip14# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL15 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_lists18# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL19 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_lists22# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL23 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.1526# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL27 28 29CHK_REL: Contents of (__DATA_CONST,__objc_classlist) section30CHK_REL-NEXT: _OBJC_CLASS_$_MyClass31CHK_REL: baseMethods32CHK_REL-NEXT: entsize 12 (relative)33CHK_REL-NEXT: count 334CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_0035CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:836CHK_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_0138CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:839CHK_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_0241CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:842CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]43 44CHK_REL: Meta Class45CHK_REL-NEXT: isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass46CHK_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)47CHK_REL-NEXT: entsize 12 (relative)48CHK_REL-NEXT: count 349CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_0050CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:851CHK_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_0153CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:854CHK_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_0256CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:857CHK_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) section63CHK_NO_REL-NEXT: _OBJC_CLASS_$_MyClass64 65CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)66CHK_NO_REL-NEXT: entsize 2467CHK_NO_REL-NEXT: count 368CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_0069CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:870CHK_NO_REL-NEXT: imp -[MyClass instance_method_00]71CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_0172CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:873CHK_NO_REL-NEXT: imp -[MyClass instance_method_01]74CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_0275CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:876CHK_NO_REL-NEXT: imp -[MyClass instance_method_02]77 78 79CHK_NO_REL: Meta Class80CHK_NO_REL-NEXT: _OBJC_METACLASS_$_MyClass81 82CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)83CHK_NO_REL-NEXT: entsize 2484CHK_NO_REL-NEXT: count 385CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_0086CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:887CHK_NO_REL-NEXT: imp +[MyClass class_method_00]88CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_0189CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:890CHK_NO_REL-NEXT: imp +[MyClass class_method_01]91CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_0292CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:893CHK_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 -Oz98 99######################## simple_class.mm ########################100# __attribute__((objc_root_class))101# @interface MyClass102# - (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# @end109#110# @implementation MyClass111# - (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# @end118#119# void *_objc_empty_cache;120# void *_objc_empty_vtable;121#122 123#--- objc-macros.s124.macro .objc_selector_def name125 .p2align 2126"\name":127 .cfi_startproc128 ret129 .cfi_endproc130.endm131 132#--- a64_simple_class.s133.include "objc-macros.s"134 135.section __TEXT,__text,regular,pure_instructions136.build_version macos, 10, 15137 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_vtable147.zerofill __DATA,__common,__objc_empty_vtable,8,3148.section __DATA,__objc_data149.globl _OBJC_CLASS_$_MyClass150.p2align 3, 0x0151 152_OBJC_CLASS_$_MyClass:153 .quad _OBJC_METACLASS_$_MyClass154 .quad 0155 .quad __objc_empty_cache156 .quad __objc_empty_vtable157 .quad __OBJC_CLASS_RO_$_MyClass158 .globl _OBJC_METACLASS_$_MyClass159 .p2align 3, 0x0160 161_OBJC_METACLASS_$_MyClass:162 .quad _OBJC_METACLASS_$_MyClass163 .quad _OBJC_CLASS_$_MyClass164 .quad __objc_empty_cache165 .quad __objc_empty_vtable166 .quad __OBJC_METACLASS_RO_$_MyClass167 168 .section __TEXT,__objc_classname,cstring_literals169l_OBJC_CLASS_NAME_:170 .asciz "MyClass"171 .section __TEXT,__objc_methname,cstring_literals172l_OBJC_METH_VAR_NAME_:173 .asciz "class_method_00"174 .section __TEXT,__objc_methtype,cstring_literals175l_OBJC_METH_VAR_TYPE_:176 .asciz "v16@0:8"177 .section __TEXT,__objc_methname,cstring_literals178l_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_const183 .p2align 3, 0x0184__OBJC_$_CLASS_METHODS_MyClass:185 .long 24186 .long 3187 .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_.1191 .quad l_OBJC_METH_VAR_TYPE_192 .quad "+[MyClass class_method_01]"193 .quad l_OBJC_METH_VAR_NAME_.2194 .quad l_OBJC_METH_VAR_TYPE_195 .quad "+[MyClass class_method_02]"196 .p2align 3, 0x0197 198__OBJC_METACLASS_RO_$_MyClass:199 .long 3200 .long 40201 .long 40202 .space 4203 .quad 0204 .quad l_OBJC_CLASS_NAME_205 .quad __OBJC_$_CLASS_METHODS_MyClass206 .quad 0207 .quad 0208 .quad 0209 .quad 0210 211 .section __TEXT,__objc_methname,cstring_literals212l_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_const220 .p2align 3, 0x0221__OBJC_$_INSTANCE_METHODS_MyClass:222 .long 24223 .long 3224 .quad l_OBJC_METH_VAR_NAME_.3225 .quad l_OBJC_METH_VAR_TYPE_226 .quad "-[MyClass instance_method_00]"227 .quad l_OBJC_METH_VAR_NAME_.4228 .quad l_OBJC_METH_VAR_TYPE_229 .quad "-[MyClass instance_method_01]"230 .quad l_OBJC_METH_VAR_NAME_.5231 .quad l_OBJC_METH_VAR_TYPE_232 .quad "-[MyClass instance_method_02]"233 .p2align 3, 0x0234 235__OBJC_CLASS_RO_$_MyClass:236 .long 2237 .long 0238 .long 0239 .space 4240 .quad 0241 .quad l_OBJC_CLASS_NAME_242 .quad __OBJC_$_INSTANCE_METHODS_MyClass243 .quad 0244 .quad 0245 .quad 0246 .quad 0247 .globl __objc_empty_cache248 249.zerofill __DATA,__common,__objc_empty_cache,8,3250 .section __DATA,__objc_classlist,regular,no_dead_strip251 .p2align 3, 0x0252l_OBJC_LABEL_CLASS_$:253 .quad _OBJC_CLASS_$_MyClass254 .section __DATA,__objc_imageinfo,regular,no_dead_strip255L_OBJC_IMAGE_INFO:256 .long 0257 .long 64258.subsections_via_symbols259