1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
// Test that we can handle calls to methods on categories.
// The following assembly defines an ObjC class Foo with an instance method
// -foo, then uses a category (Bar) to add an extra instance method -bar.
// The main function calls both -foo and -bar on an instance of Foo to check
// that the calls behave as expected.
//
// 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, 14, 0
.p2align 2
"-[Foo foo]":
mov w0, #1
ret
.p2align 2
"-[Foo(Bar) bar]":
mov w0, #1
ret
.globl _main
.p2align 2
_main:
stp x20, x19, [sp, #-32]!
stp x29, x30, [sp, #16]
add x29, sp, #16
Lloh0:
adrp x8, _OBJC_CLASSLIST_REFERENCES_$_@PAGE
Lloh1:
ldr x0, [x8, _OBJC_CLASSLIST_REFERENCES_$_@PAGEOFF]
bl _objc_alloc_init
mov x19, x0
Lloh2:
adrp x8, _OBJC_SELECTOR_REFERENCES_@PAGE
Lloh3:
ldr x1, [x8, _OBJC_SELECTOR_REFERENCES_@PAGEOFF]
bl _objc_msgSend
cmp w0, #1
b.ne LBB2_2
Lloh4:
adrp x8, _OBJC_SELECTOR_REFERENCES_.3@PAGE
Lloh5:
ldr x1, [x8, _OBJC_SELECTOR_REFERENCES_.3@PAGEOFF]
mov x0, x19
bl _objc_msgSend
cmp w0, #1
cset w0, ne
ldp x29, x30, [sp, #16]
ldp x20, x19, [sp], #32
ret
LBB2_2:
mov w0, #1
ldp x29, x30, [sp, #16]
ldp x20, x19, [sp], #32
ret
.loh AdrpLdr Lloh2, Lloh3
.loh AdrpLdr Lloh0, Lloh1
.loh AdrpLdr Lloh4, Lloh5
.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_:
.asciz "Foo"
.section __DATA,__objc_const
.p2align 3, 0x0
__OBJC_METACLASS_RO_$_Foo:
.long 1
.long 40
.long 40
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.section __DATA,__objc_data
.globl _OBJC_METACLASS_$_Foo
.p2align 3, 0x0
_OBJC_METACLASS_$_Foo:
.quad _OBJC_METACLASS_$_NSObject
.quad _OBJC_METACLASS_$_NSObject
.quad __objc_empty_cache
.quad 0
.quad __OBJC_METACLASS_RO_$_Foo
.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_:
.asciz "foo"
.section __TEXT,__objc_methtype,cstring_literals
l_OBJC_METH_VAR_TYPE_:
.asciz "i16@0:8"
.section __DATA,__objc_const
.p2align 3, 0x0
__OBJC_$_INSTANCE_METHODS_Foo:
.long 24
.long 1
.quad l_OBJC_METH_VAR_NAME_
.quad l_OBJC_METH_VAR_TYPE_
.quad "-[Foo foo]"
.p2align 3, 0x0
__OBJC_CLASS_RO_$_Foo:
.long 0
.long 8
.long 8
.space 4
.quad 0
.quad l_OBJC_CLASS_NAME_
.quad __OBJC_$_INSTANCE_METHODS_Foo
.quad 0
.quad 0
.quad 0
.quad 0
.section __DATA,__objc_data
.globl _OBJC_CLASS_$_Foo
.p2align 3, 0x0
_OBJC_CLASS_$_Foo:
.quad _OBJC_METACLASS_$_Foo
.quad _OBJC_CLASS_$_NSObject
.quad __objc_empty_cache
.quad 0
.quad __OBJC_CLASS_RO_$_Foo
.section __TEXT,__objc_classname,cstring_literals
l_OBJC_CLASS_NAME_.1:
.asciz "Bar"
.section __TEXT,__objc_methname,cstring_literals
l_OBJC_METH_VAR_NAME_.2:
.asciz "bar"
.section __DATA,__objc_const
.p2align 3, 0x0
__OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Bar:
.long 24
.long 1
.quad l_OBJC_METH_VAR_NAME_.2
.quad l_OBJC_METH_VAR_TYPE_
.quad "-[Foo(Bar) bar]"
.p2align 3, 0x0
__OBJC_$_CATEGORY_Foo_$_Bar:
.quad l_OBJC_CLASS_NAME_.1
.quad _OBJC_CLASS_$_Foo
.quad __OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Bar
.quad 0
.quad 0
.quad 0
.quad 0
.long 64
.space 4
.section __DATA,__objc_classrefs,regular,no_dead_strip
.p2align 3, 0x0
_OBJC_CLASSLIST_REFERENCES_$_:
.quad _OBJC_CLASS_$_Foo
.section __DATA,__objc_selrefs,literal_pointers,no_dead_strip
.p2align 3, 0x0
_OBJC_SELECTOR_REFERENCES_:
.quad l_OBJC_METH_VAR_NAME_
.p2align 3, 0x0
_OBJC_SELECTOR_REFERENCES_.3:
.quad l_OBJC_METH_VAR_NAME_.2
.section __DATA,__objc_classlist,regular,no_dead_strip
.p2align 3, 0x0
l_OBJC_LABEL_CLASS_$:
.quad _OBJC_CLASS_$_Foo
.section __DATA,__objc_catlist,regular,no_dead_strip
.p2align 3, 0x0
l_OBJC_LABEL_CATEGORY_$:
.quad __OBJC_$_CATEGORY_Foo_$_Bar
.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64
.subsections_via_symbols
|