# REQUIRES: aarch64
# UNSUPPORTED: target=arm{{.*}}-unknown-linux-gnueabihf
# RUN: rm -rf %t; split-file %s %t && cd %t
## Compile a64_rel_dylib.o
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos10.15 -o a64_rel_dylib.o a64_simple_class.s
## Test arm64 + relative method lists
# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64
# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
## Test arm64 + relative method lists + dead-strip
# RUN: %no-lsystem-lld a64_rel_dylib.o -o a64_rel_dylib.dylib -map a64_rel_dylib.map -dylib -arch arm64 -dead_strip
# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
## Test arm64 + traditional method lists (no relative offsets)
# 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
# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
## Test arm64 + relative method lists by explicitly adding `-objc_relative_method_lists`.
# 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
# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_REL
## Test arm64 + no relative method lists by default.
# 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
# RUN: llvm-objdump --macho --objc-meta-data a64_rel_dylib.dylib | FileCheck %s --check-prefix=CHK_NO_REL
CHK_REL: Contents of (__DATA_CONST,__objc_classlist) section
CHK_REL-NEXT: _OBJC_CLASS_$_MyClass
CHK_REL: baseMethods
CHK_REL-NEXT: entsize 12 (relative)
CHK_REL-NEXT: count 3
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_00
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_00]
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_01
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_01]
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) instance_method_02
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) -[MyClass instance_method_02]
CHK_REL: Meta Class
CHK_REL-NEXT: isa 0x{{[0-9a-f]*}} _OBJC_METACLASS_$_MyClass
CHK_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
CHK_REL-NEXT: entsize 12 (relative)
CHK_REL-NEXT: count 3
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_00
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_00]
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_01
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_01]
CHK_REL-NEXT: name 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) class_method_02
CHK_REL-NEXT: types 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) v16@0:8
CHK_REL-NEXT: imp 0x{{[0-9a-f]*}} (0x{{[0-9a-f]*}}) +[MyClass class_method_02]
CHK_NO_REL-NOT: (relative)
CHK_NO_REL: Contents of (__DATA_CONST,__objc_classlist) section
CHK_NO_REL-NEXT: _OBJC_CLASS_$_MyClass
CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
CHK_NO_REL-NEXT: entsize 24
CHK_NO_REL-NEXT: count 3
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_00
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp -[MyClass instance_method_00]
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_01
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp -[MyClass instance_method_01]
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} instance_method_02
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp -[MyClass instance_method_02]
CHK_NO_REL: Meta Class
CHK_NO_REL-NEXT: _OBJC_METACLASS_$_MyClass
CHK_NO_REL: baseMethods 0x{{[0-9a-f]*}} (struct method_list_t *)
CHK_NO_REL-NEXT: entsize 24
CHK_NO_REL-NEXT: count 3
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_00
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp +[MyClass class_method_00]
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_01
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp +[MyClass class_method_01]
CHK_NO_REL-NEXT: name 0x{{[0-9a-f]*}} class_method_02
CHK_NO_REL-NEXT: types 0x{{[0-9a-f]*}} v16@0:8
CHK_NO_REL-NEXT: imp +[MyClass class_method_02]
######################## Generate a64_simple_class.s #########################
# clang -c simple_class.mm -s -o a64_simple_class.s -target arm64-apple-macos -arch arm64 -Oz
######################## simple_class.mm ########################
# __attribute__((objc_root_class))
# @interface MyClass
# - (void)instance_method_00;
# - (void)instance_method_01;
# - (void)instance_method_02;
# + (void)class_method_00;
# + (void)class_method_01;
# + (void)class_method_02;
# @end
#
# @implementation MyClass
# - (void)instance_method_00 {}
# - (void)instance_method_01 {}
# - (void)instance_method_02 {}
# + (void)class_method_00 {}
# + (void)class_method_01 {}
# + (void)class_method_02 {}
# @end
#
# void *_objc_empty_cache;
# void *_objc_empty_vtable;
#
#--- objc-macros.s
.macro .objc_selector_def name
.p2align 2
"\name":
.cfi_startproc
ret
.cfi_endproc
.endm
#--- a64_simple_class.s
.include "objc-macros.s"
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 15
.objc_selector_def "-[MyClass instance_method_00]"
.objc_selector_def "-[MyClass instance_method_01]"
.objc_selector_def "-[MyClass instance_method_02]"
.objc_selector_def "+[MyClass class_method_00]"
.objc_selector_def "+[MyClass class_method_01]"
.objc_selector_def "+[MyClass class_method_02]"
.globl __objc_empty_vtable
.zerofill __DATA,__common,__objc_empty_vtable,8,3
.section __DATA,__objc_data
.globl _OBJC_CLASS_$_MyClass
.p2align 3, 0x0
_OBJC_CLASS_$_MyClass:
.quad _OBJC_METACLASS_$_MyClass
.quad 0
.quad __objc_empty_cache
.quad __objc_empty_vtable
.quad __OBJC_CLASS_RO_$_MyClass
.globl _OBJC_METACLASS_$_MyClass
.p2align 3, 0x0
_OBJC_METACLASS_$_MyClass:
.quad _OBJC_METACLASS_$_MyClass
.quad _OBJC_CLASS_$_MyClass
.quad __objc_empty_cache
.quad __objc_empty_vtable
.quad __OBJC_METACLASS_RO_$_MyClass
.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_:
.asciz "MyClass"
.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_:
.asciz "class_method_00"
.section __TEXT,__objc_methtype,cstring_literals
l_OBJC_METH_VAR_TYPE_:
.asciz "v16@0:8"
.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_.1:
.asciz "class_method_01"
l_OBJC_METH_VAR_NAME_.2:
.asciz "class_method_02"
.section __DATA,__objc_const
.p2align 3, 0x0
__OBJC_$_CLASS_METHODS_MyClass:
.long 24
.long 3
.quad l_OBJC_METH_VAR_NAME_
.quad l_OBJC_METH_VAR_TYPE_
.quad "+[MyClass class_method_00]"
.quad l_OBJC_METH_VAR_NAME_.1
.quad l_OBJC_METH_VAR_TYPE_
.quad "+[MyClass class_method_01]"
.quad l_OBJC_METH_VAR_NAME_.2
.quad l_OBJC_METH_VAR_TYPE_
.quad "+[MyClass class_method_02]"
.p2align 3, 0x0
__OBJC_METACLASS_RO_$_MyClass:
.long 3
.long 40
.long 40
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad __OBJC_$_CLASS_METHODS_MyClass
.quad 0
.quad 0
.quad 0
.quad 0
.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_.3:
.asciz "instance_method_00"
l_OBJC_METH_VAR_NAME_.4:
.asciz "instance_method_01"
l_OBJC_METH_VAR_NAME_.5:
.asciz "instance_method_02"
.section __DATA,__objc_const
.p2align 3, 0x0
__OBJC_$_INSTANCE_METHODS_MyClass:
.long 24
.long 3
.quad l_OBJC_METH_VAR_NAME_.3
.quad l_OBJC_METH_VAR_TYPE_
.quad "-[MyClass instance_method_00]"
.quad l_OBJC_METH_VAR_NAME_.4
.quad l_OBJC_METH_VAR_TYPE_
.quad "-[MyClass instance_method_01]"
.quad l_OBJC_METH_VAR_NAME_.5
.quad l_OBJC_METH_VAR_TYPE_
.quad "-[MyClass instance_method_02]"
.p2align 3, 0x0
__OBJC_CLASS_RO_$_MyClass:
.long 2
.long 0
.long 0
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad __OBJC_$_INSTANCE_METHODS_MyClass
.quad 0
.quad 0
.quad 0
.quad 0
.globl __objc_empty_cache
.zerofill __DATA,__common,__objc_empty_cache,8,3
.section __DATA,__objc_classlist,regular,no_dead_strip
.p2align 3, 0x0
l_OBJC_LABEL_CLASS_$:
.quad _OBJC_CLASS_$_MyClass
.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64
.subsections_via_symbols