Skip to content

[ORC][MachO] Register objc protolist, protorefs, nlclslist metadata sections #95144

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions compiler-rt/test/orc/TestCases/Darwin/arm64/objc-nonlazy-class.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// Test that we register non-lazy classes by ensuring a +load is called even if
// the class is never referenced.
//
// RUN: %clang -c -o %t.o %s
// RUN: %llvm_jitlink -preload libobjc.A.dylib %t.o
//
// REQUIRES: jit-compatible-osx-swift-runtime


.section __TEXT,__text,regular,pure_instructions
.build_version macos, 15, 0 sdk_version 15, 0
.p2align 2 ; -- Begin function +[C load]
"+[C load]": ; @"\01+[C load]"
.cfi_startproc
; %bb.0:
sub sp, sp, #16
.cfi_def_cfa_offset 16
str x0, [sp, #8]
str x1, [sp]
adrp x9, _x@PAGE
mov w8, #7 ; =0x7
str w8, [x9, _x@PAGEOFF]
add sp, sp, #16
ret
.cfi_endproc
; -- End function
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #16
.cfi_def_cfa_offset 16
str wzr, [sp, #12]
adrp x8, _x@PAGE
ldr w8, [x8, _x@PAGEOFF]
subs w8, w8, #7
cset w8, eq
and w8, w8, #0x1
ands w8, w8, #0x1
cset w0, eq
add sp, sp, #16
ret
.cfi_endproc
; -- End function
.globl _x ; @x
.zerofill __DATA,__common,_x,4,2
.section __DATA,__objc_data
.globl _OBJC_CLASS_$_C ; @"OBJC_CLASS_$_C"
.p2align 3, 0x0
_OBJC_CLASS_$_C:
.quad _OBJC_METACLASS_$_C
.quad 0
.quad __objc_empty_cache
.quad 0
.quad __OBJC_CLASS_RO_$_C

.globl _OBJC_METACLASS_$_C ; @"OBJC_METACLASS_$_C"
.p2align 3, 0x0
_OBJC_METACLASS_$_C:
.quad _OBJC_METACLASS_$_C
.quad _OBJC_CLASS_$_C
.quad __objc_empty_cache
.quad 0
.quad __OBJC_METACLASS_RO_$_C

.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_
.asciz "C"

.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_: ; @OBJC_METH_VAR_NAME_
.asciz "load"

.section __TEXT,__objc_methtype,cstring_literals
l_OBJC_METH_VAR_TYPE_: ; @OBJC_METH_VAR_TYPE_
.asciz "v16@0:8"

.section __DATA,__objc_const
.p2align 3, 0x0 ; @"_OBJC_$_CLASS_METHODS_C"
__OBJC_$_CLASS_METHODS_C:
.long 24 ; 0x18
.long 1 ; 0x1
.quad l_OBJC_METH_VAR_NAME_
.quad l_OBJC_METH_VAR_TYPE_
.quad "+[C load]"

.p2align 3, 0x0 ; @"_OBJC_METACLASS_RO_$_C"
__OBJC_METACLASS_RO_$_C:
.long 3 ; 0x3
.long 40 ; 0x28
.long 40 ; 0x28
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad __OBJC_$_CLASS_METHODS_C
.quad 0
.quad 0
.quad 0
.quad 0

.p2align 3, 0x0 ; @"_OBJC_CLASS_RO_$_C"
__OBJC_CLASS_RO_$_C:
.long 2 ; 0x2
.long 0 ; 0x0
.long 0 ; 0x0
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0

.section __DATA,__objc_classlist,regular,no_dead_strip
.p2align 3, 0x0 ; @"OBJC_LABEL_CLASS_$"
l_OBJC_LABEL_CLASS_$:
.quad _OBJC_CLASS_$_C

.section __DATA,__objc_nlclslist,regular,no_dead_strip
.p2align 3, 0x0 ; @"OBJC_LABEL_NONLAZY_CLASS_$"
l_OBJC_LABEL_NONLAZY_CLASS_$:
.quad _OBJC_CLASS_$_C

.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64

.subsections_via_symbols
93 changes: 93 additions & 0 deletions compiler-rt/test/orc/TestCases/Darwin/arm64/objc-protocol-ref.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
// Test that we register protocol reference metadata. Without registration,
// protocol pointers will not be uniqued correctly and @protocol(NSObject) will
// not match the runtime's pointer.
//
// RUN: %clang -c -o %t.o %s
// RUN: %llvm_jitlink -preload libobjc.A.dylib %t.o
//
// REQUIRES: jit-compatible-osx-swift-runtime

.section __TEXT,__text,regular,pure_instructions
.build_version macos, 15, 0 sdk_version 15, 0
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #32
stp x29, x30, [sp, #16] ; 16-byte Folded Spill
add x29, sp, #16
.cfi_def_cfa w29, 16
.cfi_offset w30, -8
.cfi_offset w29, -16
stur wzr, [x29, #-4]
adrp x8, __OBJC_PROTOCOL_REFERENCE_$_NSObject@PAGE
ldr x8, [x8, __OBJC_PROTOCOL_REFERENCE_$_NSObject@PAGEOFF]
str x8, [sp] ; 8-byte Folded Spill
adrp x0, l_.str@PAGE
add x0, x0, l_.str@PAGEOFF
bl _objc_getProtocol
ldr x8, [sp] ; 8-byte Folded Reload
subs x8, x8, x0
cset w8, eq
and w8, w8, #0x1
ands w8, w8, #0x1
cset w0, eq
ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
add sp, sp, #32
ret
.cfi_endproc
; -- End function
.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_
.asciz "NSObject"

.private_extern __OBJC_PROTOCOL_$_NSObject ; @"_OBJC_PROTOCOL_$_NSObject"
.section __DATA,__data
.globl __OBJC_PROTOCOL_$_NSObject
.weak_definition __OBJC_PROTOCOL_$_NSObject
.p2align 3, 0x0
__OBJC_PROTOCOL_$_NSObject:
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.long 96 ; 0x60
.long 0 ; 0x0
.quad 0
.quad 0
.quad 0

.private_extern __OBJC_LABEL_PROTOCOL_$_NSObject ; @"_OBJC_LABEL_PROTOCOL_$_NSObject"
.section __DATA,__objc_protolist,coalesced,no_dead_strip
.globl __OBJC_LABEL_PROTOCOL_$_NSObject
.weak_definition __OBJC_LABEL_PROTOCOL_$_NSObject
.p2align 3, 0x0
__OBJC_LABEL_PROTOCOL_$_NSObject:
.quad __OBJC_PROTOCOL_$_NSObject

.private_extern __OBJC_PROTOCOL_REFERENCE_$_NSObject ; @"_OBJC_PROTOCOL_REFERENCE_$_NSObject"
.section __DATA,__objc_protorefs,coalesced,no_dead_strip
.globl __OBJC_PROTOCOL_REFERENCE_$_NSObject
.weak_definition __OBJC_PROTOCOL_REFERENCE_$_NSObject
.p2align 3, 0x0
__OBJC_PROTOCOL_REFERENCE_$_NSObject:
.quad __OBJC_PROTOCOL_$_NSObject

.section __TEXT,__cstring,cstring_literals
l_.str: ; @.str
.asciz "NSObject"

.no_dead_strip __OBJC_PROTOCOL_$_NSObject
.no_dead_strip __OBJC_LABEL_PROTOCOL_$_NSObject
.no_dead_strip __OBJC_PROTOCOL_REFERENCE_$_NSObject
.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64

.subsections_via_symbols
82 changes: 82 additions & 0 deletions compiler-rt/test/orc/TestCases/Darwin/arm64/objc-protocol.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Test that we register protocol metadata. Without registration, messaging
// a protocol metatype object crashes.
//
// RUN: %clang -c -o %t.o %s
// RUN: %llvm_jitlink -preload libobjc.A.dylib %t.o
//
// REQUIRES: jit-compatible-osx-swift-runtime

.section __TEXT,__text,regular,pure_instructions
.build_version macos, 15, 0 sdk_version 15, 0
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #32
stp x29, x30, [sp, #16] ; 16-byte Folded Spill
add x29, sp, #16
.cfi_def_cfa w29, 16
.cfi_offset w30, -8
.cfi_offset w29, -16
mov w8, #0 ; =0x0
str w8, [sp, #8] ; 4-byte Folded Spill
stur wzr, [x29, #-4]
adrp x8, __OBJC_PROTOCOL_REFERENCE_$_P@PAGE
ldr x0, [x8, __OBJC_PROTOCOL_REFERENCE_$_P@PAGEOFF]
bl _objc_retain
ldr w0, [sp, #8] ; 4-byte Folded Reload
ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
add sp, sp, #32
ret
.cfi_endproc
; -- End function
.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_
.asciz "P"

.private_extern __OBJC_PROTOCOL_$_P ; @"_OBJC_PROTOCOL_$_P"
.section __DATA,__data
.globl __OBJC_PROTOCOL_$_P
.weak_definition __OBJC_PROTOCOL_$_P
.p2align 3, 0x0
__OBJC_PROTOCOL_$_P:
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.long 96 ; 0x60
.long 0 ; 0x0
.quad 0
.quad 0
.quad 0

.private_extern __OBJC_LABEL_PROTOCOL_$_P ; @"_OBJC_LABEL_PROTOCOL_$_P"
.section __DATA,__objc_protolist,coalesced,no_dead_strip
.globl __OBJC_LABEL_PROTOCOL_$_P
.weak_definition __OBJC_LABEL_PROTOCOL_$_P
.p2align 3, 0x0
__OBJC_LABEL_PROTOCOL_$_P:
.quad __OBJC_PROTOCOL_$_P

.private_extern __OBJC_PROTOCOL_REFERENCE_$_P ; @"_OBJC_PROTOCOL_REFERENCE_$_P"
.section __DATA,__objc_protorefs,coalesced,no_dead_strip
.globl __OBJC_PROTOCOL_REFERENCE_$_P
.weak_definition __OBJC_PROTOCOL_REFERENCE_$_P
.p2align 3, 0x0
__OBJC_PROTOCOL_REFERENCE_$_P:
.quad __OBJC_PROTOCOL_$_P

.no_dead_strip __OBJC_PROTOCOL_$_P
.no_dead_strip __OBJC_LABEL_PROTOCOL_$_P
.no_dead_strip __OBJC_PROTOCOL_REFERENCE_$_P
.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64

.subsections_via_symbols
Loading
Loading