Skip to content
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

Add static selectors #104

Merged
merged 30 commits into from
Jun 23, 2022
Merged
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7eb623f
Add initial static selectors
madsmtm Mar 3, 2022
81e8faf
Add static selector assembly tests
madsmtm Jun 16, 2022
4c5cbcc
Use a volatile read
madsmtm Jun 16, 2022
e650f6d
Remove a few hacks around static selectors
madsmtm Mar 3, 2022
ca065ab
Allow dead_stripping
madsmtm Mar 3, 2022
a8803e3
Use a hack to make the compiler group internal selector functions int…
madsmtm Mar 3, 2022
5ef826c
Add static selector export names with generated hashes
madsmtm Jun 16, 2022
7c34341
Add hack to set up the __objc_imageinfo section
madsmtm Mar 3, 2022
3b33d8b
Add always present image tag
madsmtm Mar 3, 2022
70fdff9
Test static selectors in CI
madsmtm Jan 2, 2022
279d458
Comment and clean up static-sel
madsmtm Mar 29, 2022
959c991
Rename feature to `unstable-static-sel`
madsmtm Jun 17, 2022
69cca77
Show docs on sel! macro with the `unstable-static-sel` feature
madsmtm Jun 17, 2022
65f0bd3
Test __hash_idents macro
madsmtm Jun 17, 2022
832d6a6
Test getting sel!(alloc) twice
madsmtm Jun 17, 2022
8c07b3a
Use v0 name mangling in assembly tests
madsmtm Jun 17, 2022
e1735b0
Better document sel! macro
madsmtm Jun 21, 2022
3122c6c
Move the statics out of the function
madsmtm Jun 21, 2022
53611a1
Add "unstable-static-sel-inlined" feature flag
madsmtm Jun 21, 2022
c338496
Refactor image info creation
madsmtm Jun 21, 2022
9f7185b
Fix image info on simulator targets
madsmtm Jun 21, 2022
8decad4
Add support for static selectors on 32bit macOS
madsmtm Jun 21, 2022
61213ad
Emit `no_dead_strip` the same places that clang does
madsmtm Jun 21, 2022
14300c3
Use UnsafeCell instead of read_volatile
madsmtm Jun 21, 2022
1142392
Fix assembly tests in CI
madsmtm Jun 22, 2022
8b53cd1
Only test static selectors in CI on the Apple runtime
madsmtm Jun 22, 2022
f9cce82
Fix assembly tests for simulator targets
madsmtm Jun 22, 2022
a3c9bcd
Emit different assembly on x86 based on if using the old or new runtime
madsmtm Jun 22, 2022
776e6c9
More documentation
madsmtm Jun 23, 2022
783a742
Add changelog entry
madsmtm Jun 23, 2022
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
2 changes: 1 addition & 1 deletion tests/assembly/test_static_sel/Cargo.toml
Original file line number Diff line number Diff line change
@@ -21,4 +21,4 @@ gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"]
gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"]

# Hack to prevent the feature flag from being enabled in the entire project
assembly-features = ["objc2/unstable-static-sel"]
assembly-features = ["objc2/unstable-static-sel-inlined"]
137 changes: 51 additions & 86 deletions tests/assembly/test_static_sel/expected/apple-aarch64.s
Original file line number Diff line number Diff line change
@@ -2,132 +2,97 @@
.globl _get_sel
.p2align 2
_get_sel:
b __RNvNvCsai54Y9dtG4h_15test_static_sel7get_sel22objc_static_workaround

.globl _get_same_sel
.p2align 2
_get_same_sel:
b __RNvNvCsai54Y9dtG4h_15test_static_sel12get_same_sel22objc_static_workaround

.globl _get_common_twice
.p2align 2
_get_common_twice:
stp x20, x19, [sp, #-32]!
stp x29, x30, [sp, #16]
add x29, sp, #16
bl __RNvNvCsai54Y9dtG4h_15test_static_sel16get_common_twice22objc_static_workaround
mov x19, x0
bl __RNvNvCsai54Y9dtG4h_15test_static_sel16get_common_twices_22objc_static_workaround
mov x1, x0
mov x0, x19
ldp x29, x30, [sp, #16]
ldp x20, x19, [sp], #32
ret

.globl _get_different_sel
.p2align 2
_get_different_sel:
b __RNvNvCsai54Y9dtG4h_15test_static_sel17get_different_sel22objc_static_workaround

.globl _unused_sel
.p2align 2
_unused_sel:
ret

.globl _use_fns
.p2align 2
_use_fns:
stp x22, x21, [sp, #-48]!
stp x20, x19, [sp, #16]
stp x29, x30, [sp, #32]
add x29, sp, #32
mov x19, x8
bl __RNvNvCsai54Y9dtG4h_15test_static_sel7get_sel22objc_static_workaround
mov x20, x0
bl __RNvNvCsai54Y9dtG4h_15test_static_sel12get_same_sel22objc_static_workaround
mov x21, x0
bl __RNvNvCsai54Y9dtG4h_15test_static_sel17get_different_sel22objc_static_workaround
mov x22, x0
bl __RNvNvCsai54Y9dtG4h_15test_static_sel7use_fns22objc_static_workaround
stp x20, x21, [x19]
stp x22, x0, [x19, #16]
ldp x29, x30, [sp, #32]
ldp x20, x19, [sp, #16]
ldp x22, x21, [sp], #48
ret

.globl _use_same_twice
.p2align 2
_use_same_twice:
stp x20, x19, [sp, #-32]!
stp x29, x30, [sp, #16]
add x29, sp, #16
mov x19, x8
bl __RNvNvCsai54Y9dtG4h_15test_static_sel7get_sel22objc_static_workaround
stp x0, x0, [x19]
ldp x29, x30, [sp, #16]
ldp x20, x19, [sp], #32
ret

.globl _use_in_loop
.p2align 2
_use_in_loop:
ret

.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel7get_sel22objc_static_workaround:
Lloh0:
adrp x8, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE
Lloh1:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF]
ret
.loh AdrpLdr Lloh0, Lloh1

.globl _get_same_sel
.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel12get_same_sel22objc_static_workaround:
_get_same_sel:
Lloh2:
adrp x8, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGE
Lloh3:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGEOFF]
ret
.loh AdrpLdr Lloh2, Lloh3

.globl _get_common_twice
.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel16get_common_twice22objc_static_workaround:
_get_common_twice:
Lloh4:
adrp x8, L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77@PAGE
Lloh5:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77@PAGEOFF]
ret
.loh AdrpLdr Lloh4, Lloh5

.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel16get_common_twices_22objc_static_workaround:
Lloh6:
adrp x8, L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7@PAGE
Lloh7:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7@PAGEOFF]
ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7@PAGEOFF]
ret
.loh AdrpLdr Lloh6, Lloh7
.loh AdrpAdrp Lloh4, Lloh6
.loh AdrpLdr Lloh4, Lloh5

.globl _get_different_sel
.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel17get_different_sel22objc_static_workaround:
_get_different_sel:
Lloh8:
adrp x8, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGE
Lloh9:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGEOFF]
ret
.loh AdrpLdr Lloh8, Lloh9

.globl _unused_sel
.p2align 2
__RNvNvCsai54Y9dtG4h_15test_static_sel7use_fns22objc_static_workaround:
_unused_sel:
ret

.globl _use_fns
.p2align 2
_use_fns:
Lloh10:
adrp x8, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGE
adrp x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE
Lloh11:
ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGEOFF]
ldr x9, [x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF]
Lloh12:
adrp x10, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGE
Lloh13:
ldr x10, [x10, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGEOFF]
Lloh14:
adrp x11, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGE
Lloh15:
ldr x11, [x11, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGEOFF]
Lloh16:
adrp x12, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGE
Lloh17:
ldr x12, [x12, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGEOFF]
stp x9, x10, [x8]
stp x11, x12, [x8, #16]
ret
.loh AdrpLdr Lloh16, Lloh17
.loh AdrpLdr Lloh14, Lloh15
.loh AdrpLdr Lloh12, Lloh13
.loh AdrpLdr Lloh10, Lloh11

.globl _use_same_twice
.p2align 2
_use_same_twice:
Lloh18:
adrp x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE
Lloh19:
ldr x9, [x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF]
stp x9, x9, [x8]
ret
.loh AdrpLdr Lloh18, Lloh19

.globl _use_in_loop
.p2align 2
_use_in_loop:
ret

.section __DATA,__objc_imageinfo,regular,no_dead_strip
.globl L_OBJC_IMAGE_INFO_68381ba894e318e9
.p2align 2
140 changes: 51 additions & 89 deletions tests/assembly/test_static_sel/expected/apple-armv7.s
Original file line number Diff line number Diff line change
@@ -4,32 +4,45 @@
.p2align 2
.code 32
_get_sel:
b __RNvNvCs8GaUp4KaTG0_15test_static_sel7get_sel22objc_static_workaround
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8))
LPC0_0:
ldr r0, [pc, r0]
bx lr

.globl _get_same_sel
.p2align 2
.code 32
_get_same_sel:
b __RNvNvCs8GaUp4KaTG0_15test_static_sel12get_same_sel22objc_static_workaround
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8))
LPC1_0:
ldr r0, [pc, r0]
bx lr

.globl _get_common_twice
.p2align 2
.code 32
_get_common_twice:
push {r4, r7, lr}
add r7, sp, #4
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel16get_common_twice22objc_static_workaround
mov r4, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel16get_common_twices_22objc_static_workaround
mov r1, r0
mov r0, r4
pop {r4, r7, pc}
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8))
LPC2_0:
ldr r0, [pc, r0]
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8))
LPC2_1:
ldr r1, [pc, r1]
bx lr

.globl _get_different_sel
.p2align 2
.code 32
_get_different_sel:
b __RNvNvCs8GaUp4KaTG0_15test_static_sel17get_different_sel22objc_static_workaround
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8))
LPC3_0:
ldr r0, [pc, r0]
bx lr

.globl _unused_sel
.p2align 2
@@ -41,96 +54,45 @@ _unused_sel:
.p2align 2
.code 32
_use_fns:
push {r4, r5, r6, r7, lr}
add r7, sp, #12
push {r8}
mov r4, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel7get_sel22objc_static_workaround
mov r8, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel12get_same_sel22objc_static_workaround
mov r6, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel17get_different_sel22objc_static_workaround
mov r5, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel7use_fns22objc_static_workaround
str r8, [r4]
str r6, [r4, #4]
str r5, [r4, #8]
str r0, [r4, #12]
pop {r8}
pop {r4, r5, r6, r7, pc}
movw r9, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8))
movt r9, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8))
LPC5_0:
ldr r9, [pc, r9]
movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8))
movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8))
LPC5_1:
ldr r2, [pc, r2]
movw r3, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8))
movt r3, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8))
LPC5_2:
ldr r3, [pc, r3]
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8))
str r2, [r0, #8]
LPC5_3:
ldr r1, [pc, r1]
str r9, [r0, #12]
stm r0, {r1, r3}
bx lr

.globl _use_same_twice
.p2align 2
.code 32
_use_same_twice:
push {r4, r7, lr}
add r7, sp, #4
mov r4, r0
bl __RNvNvCs8GaUp4KaTG0_15test_static_sel7get_sel22objc_static_workaround
str r0, [r4]
str r0, [r4, #4]
pop {r4, r7, pc}
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8))
LPC6_0:
ldr r1, [pc, r1]
str r1, [r0]
str r1, [r0, #4]
bx lr

.globl _use_in_loop
.p2align 2
.code 32
_use_in_loop:
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel7get_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC8_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC8_0+8))
LPC8_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel12get_same_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC9_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC9_0+8))
LPC9_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel16get_common_twice22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC10_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC10_0+8))
LPC10_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel16get_common_twices_22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC11_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC11_0+8))
LPC11_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel17get_different_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC12_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC12_0+8))
LPC12_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCs8GaUp4KaTG0_15test_static_sel7use_fns22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC13_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC13_0+8))
LPC13_0:
ldr r0, [pc, r0]
bx lr

.section __DATA,__objc_imageinfo,regular,no_dead_strip
.globl L_OBJC_IMAGE_INFO_68381ba894e318e9
.p2align 2
149 changes: 51 additions & 98 deletions tests/assembly/test_static_sel/expected/apple-armv7s.s
Original file line number Diff line number Diff line change
@@ -4,41 +4,45 @@
.p2align 2
.code 32
_get_sel:
push {r7, lr}
mov r7, sp
bl __RNvNvCsen0HaGRHbO4_15test_static_sel7get_sel22objc_static_workaround
pop {r7, pc}
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8))
LPC0_0:
ldr r0, [pc, r0]
bx lr

.globl _get_same_sel
.p2align 2
.code 32
_get_same_sel:
push {r7, lr}
mov r7, sp
bl __RNvNvCsen0HaGRHbO4_15test_static_sel12get_same_sel22objc_static_workaround
pop {r7, pc}
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8))
LPC1_0:
ldr r0, [pc, r0]
bx lr

.globl _get_common_twice
.p2align 2
.code 32
_get_common_twice:
push {r4, r7, lr}
add r7, sp, #4
bl __RNvNvCsen0HaGRHbO4_15test_static_sel16get_common_twice22objc_static_workaround
mov r4, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel16get_common_twices_22objc_static_workaround
mov r1, r0
mov r0, r4
pop {r4, r7, pc}
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8))
LPC2_0:
ldr r0, [pc, r0]
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8))
LPC2_1:
ldr r1, [pc, r1]
bx lr

.globl _get_different_sel
.p2align 2
.code 32
_get_different_sel:
push {r7, lr}
mov r7, sp
bl __RNvNvCsen0HaGRHbO4_15test_static_sel17get_different_sel22objc_static_workaround
pop {r7, pc}
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8))
LPC3_0:
ldr r0, [pc, r0]
bx lr

.globl _unused_sel
.p2align 2
@@ -50,96 +54,45 @@ _unused_sel:
.p2align 2
.code 32
_use_fns:
push {r4, r5, r6, r7, lr}
add r7, sp, #12
push {r8}
mov r4, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel7get_sel22objc_static_workaround
mov r8, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel12get_same_sel22objc_static_workaround
mov r6, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel17get_different_sel22objc_static_workaround
mov r5, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel7use_fns22objc_static_workaround
str r8, [r4]
str r6, [r4, #4]
str r5, [r4, #8]
str r0, [r4, #12]
pop {r8}
pop {r4, r5, r6, r7, pc}
movw r9, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8))
movt r9, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8))
LPC5_0:
ldr r9, [pc, r9]
movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8))
movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8))
LPC5_1:
ldr r2, [pc, r2]
movw r3, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8))
movt r3, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8))
LPC5_2:
ldr r3, [pc, r3]
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8))
str r2, [r0, #8]
LPC5_3:
ldr r1, [pc, r1]
str r9, [r0, #12]
stm r0, {r1, r3}
bx lr

.globl _use_same_twice
.p2align 2
.code 32
_use_same_twice:
push {r4, r7, lr}
add r7, sp, #4
mov r4, r0
bl __RNvNvCsen0HaGRHbO4_15test_static_sel7get_sel22objc_static_workaround
str r0, [r4]
str r0, [r4, #4]
pop {r4, r7, pc}
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8))
LPC6_0:
ldr r1, [pc, r1]
str r1, [r0]
str r1, [r0, #4]
bx lr

.globl _use_in_loop
.p2align 2
.code 32
_use_in_loop:
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel7get_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC8_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC8_0+8))
LPC8_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel12get_same_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC9_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC9_0+8))
LPC9_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel16get_common_twice22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC10_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC10_0+8))
LPC10_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel16get_common_twices_22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC11_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC11_0+8))
LPC11_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel17get_different_sel22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC12_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC12_0+8))
LPC12_0:
ldr r0, [pc, r0]
bx lr

.p2align 2
.code 32
__RNvNvCsen0HaGRHbO4_15test_static_sel7use_fns22objc_static_workaround:
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC13_0+8))
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC13_0+8))
LPC13_0:
ldr r0, [pc, r0]
bx lr

.section __DATA,__objc_imageinfo,regular,no_dead_strip
.globl L_OBJC_IMAGE_INFO_68381ba894e318e9
.p2align 2
144 changes: 39 additions & 105 deletions tests/assembly/test_static_sel/expected/apple-x86.s
Original file line number Diff line number Diff line change
@@ -5,31 +5,35 @@
_get_sel:
push ebp
mov ebp, esp
call L0$pb
L0$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L0$pb]
pop ebp
jmp __RNvNvCs6BnsG4fGG5c_15test_static_sel7get_sel22objc_static_workaround
ret

.globl _get_same_sel
.p2align 4, 0x90
_get_same_sel:
push ebp
mov ebp, esp
call L1$pb
L1$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L1$pb]
pop ebp
jmp __RNvNvCs6BnsG4fGG5c_15test_static_sel12get_same_sel22objc_static_workaround
ret

.globl _get_common_twice
.p2align 4, 0x90
_get_common_twice:
push ebp
mov ebp, esp
push esi
push eax
call __RNvNvCs6BnsG4fGG5c_15test_static_sel16get_common_twice22objc_static_workaround
mov esi, eax
call __RNvNvCs6BnsG4fGG5c_15test_static_sel16get_common_twices_22objc_static_workaround
mov edx, eax
mov eax, esi
add esp, 4
pop esi
call L2$pb
L2$pb:
pop ecx
mov eax, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-L2$pb]
mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-L2$pb]
pop ebp
ret

@@ -38,8 +42,12 @@ _get_common_twice:
_get_different_sel:
push ebp
mov ebp, esp
call L3$pb
L3$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L3$pb]
pop ebp
jmp __RNvNvCs6BnsG4fGG5c_15test_static_sel17get_different_sel22objc_static_workaround
ret

.globl _unused_sel
.p2align 4, 0x90
@@ -54,28 +62,22 @@ _unused_sel:
_use_fns:
push ebp
mov ebp, esp
push ebx
push edi
push esi
sub esp, 12
mov esi, dword ptr [ebp + 8]
call __RNvNvCs6BnsG4fGG5c_15test_static_sel7get_sel22objc_static_workaround
mov dword ptr [ebp - 16], eax
call __RNvNvCs6BnsG4fGG5c_15test_static_sel12get_same_sel22objc_static_workaround
mov ebx, eax
call __RNvNvCs6BnsG4fGG5c_15test_static_sel17get_different_sel22objc_static_workaround
mov edi, eax
call __RNvNvCs6BnsG4fGG5c_15test_static_sel7use_fns22objc_static_workaround
mov ecx, dword ptr [ebp - 16]
mov dword ptr [esi], ecx
mov dword ptr [esi + 4], ebx
mov dword ptr [esi + 8], edi
mov dword ptr [esi + 12], eax
mov eax, esi
add esp, 12
call L5$pb
L5$pb:
pop ecx
mov eax, dword ptr [ebp + 8]
mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L5$pb]
mov esi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L5$pb]
mov edi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L5$pb]
mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-L5$pb]
mov dword ptr [eax], edx
mov dword ptr [eax + 4], esi
mov dword ptr [eax + 8], edi
mov dword ptr [eax + 12], ecx
pop esi
pop edi
pop ebx
pop ebp
ret 4

@@ -84,15 +86,13 @@ _use_fns:
_use_same_twice:
push ebp
mov ebp, esp
push esi
push eax
mov esi, dword ptr [ebp + 8]
call __RNvNvCs6BnsG4fGG5c_15test_static_sel7get_sel22objc_static_workaround
mov dword ptr [esi], eax
mov dword ptr [esi + 4], eax
mov eax, esi
add esp, 4
pop esi
call L6$pb
L6$pb:
pop ecx
mov eax, dword ptr [ebp + 8]
mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L6$pb]
mov dword ptr [eax], ecx
mov dword ptr [eax + 4], ecx
pop ebp
ret 4

@@ -104,72 +104,6 @@ _use_in_loop:
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel7get_sel22objc_static_workaround:
push ebp
mov ebp, esp
call L8$pb
L8$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L8$pb]
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel12get_same_sel22objc_static_workaround:
push ebp
mov ebp, esp
call L9$pb
L9$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L9$pb]
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel16get_common_twice22objc_static_workaround:
push ebp
mov ebp, esp
call L10$pb
L10$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-L10$pb]
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel16get_common_twices_22objc_static_workaround:
push ebp
mov ebp, esp
call L11$pb
L11$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-L11$pb]
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel17get_different_sel22objc_static_workaround:
push ebp
mov ebp, esp
call L12$pb
L12$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L12$pb]
pop ebp
ret

.p2align 4, 0x90
__RNvNvCs6BnsG4fGG5c_15test_static_sel7use_fns22objc_static_workaround:
push ebp
mov ebp, esp
call L13$pb
L13$pb:
pop eax
mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-L13$pb]
pop ebp
ret

.section __OBJC,__image_info
.globl L_OBJC_IMAGE_INFO_68381ba894e318e9
.p2align 2
111 changes: 21 additions & 90 deletions tests/assembly/test_static_sel/expected/apple-x86_64.s
Original file line number Diff line number Diff line change
@@ -5,31 +5,26 @@
_get_sel:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9]
pop rbp
jmp __RNvNvCs3LjJa8BQyj0_15test_static_sel7get_sel22objc_static_workaround
ret

.globl _get_same_sel
.p2align 4, 0x90
_get_same_sel:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35]
pop rbp
jmp __RNvNvCs3LjJa8BQyj0_15test_static_sel12get_same_sel22objc_static_workaround
ret

.globl _get_common_twice
.p2align 4, 0x90
_get_common_twice:
push rbp
mov rbp, rsp
push rbx
push rax
call __RNvNvCs3LjJa8BQyj0_15test_static_sel16get_common_twice22objc_static_workaround
mov rbx, rax
call __RNvNvCs3LjJa8BQyj0_15test_static_sel16get_common_twices_22objc_static_workaround
mov rdx, rax
mov rax, rbx
add rsp, 8
pop rbx
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77]
mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7]
pop rbp
ret

@@ -38,8 +33,9 @@ _get_common_twice:
_get_different_sel:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0]
pop rbp
jmp __RNvNvCs3LjJa8BQyj0_15test_static_sel17get_different_sel22objc_static_workaround
ret

.globl _unused_sel
.p2align 4, 0x90
@@ -54,27 +50,15 @@ _unused_sel:
_use_fns:
push rbp
mov rbp, rsp
push r15
push r14
push r12
push rbx
mov rbx, rdi
call __RNvNvCs3LjJa8BQyj0_15test_static_sel7get_sel22objc_static_workaround
mov r14, rax
call __RNvNvCs3LjJa8BQyj0_15test_static_sel12get_same_sel22objc_static_workaround
mov r15, rax
call __RNvNvCs3LjJa8BQyj0_15test_static_sel17get_different_sel22objc_static_workaround
mov r12, rax
call __RNvNvCs3LjJa8BQyj0_15test_static_sel7use_fns22objc_static_workaround
mov qword ptr [rbx], r14
mov qword ptr [rbx + 8], r15
mov qword ptr [rbx + 16], r12
mov qword ptr [rbx + 24], rax
mov rax, rbx
pop rbx
pop r12
pop r14
pop r15
mov rax, rdi
mov rcx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9]
mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35]
mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0]
mov rdi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99]
mov qword ptr [rax], rcx
mov qword ptr [rax + 8], rdx
mov qword ptr [rax + 16], rsi
mov qword ptr [rax + 24], rdi
pop rbp
ret

@@ -83,15 +67,10 @@ _use_fns:
_use_same_twice:
push rbp
mov rbp, rsp
push rbx
push rax
mov rbx, rdi
call __RNvNvCs3LjJa8BQyj0_15test_static_sel7get_sel22objc_static_workaround
mov qword ptr [rbx], rax
mov qword ptr [rbx + 8], rax
mov rax, rbx
add rsp, 8
pop rbx
mov rax, rdi
mov rcx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9]
mov qword ptr [rdi], rcx
mov qword ptr [rdi + 8], rcx
pop rbp
ret

@@ -103,54 +82,6 @@ _use_in_loop:
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel7get_sel22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9]
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel12get_same_sel22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35]
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel16get_common_twice22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77]
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel16get_common_twices_22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7]
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel17get_different_sel22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0]
pop rbp
ret

.p2align 4, 0x90
__RNvNvCs3LjJa8BQyj0_15test_static_sel7use_fns22objc_static_workaround:
push rbp
mov rbp, rsp
mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99]
pop rbp
ret

.section __DATA,__objc_imageinfo,regular,no_dead_strip
.globl L_OBJC_IMAGE_INFO_68381ba894e318e9
.p2align 2
3 changes: 3 additions & 0 deletions tests/src/bin/test_assembly.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
//! A helper script for testing the assembly output.
//!
//! Similar to `trybuild` and `compiletest`, except specialized to our setup!
//!
//! Very limited currently, for example we can't stably test things that emits
//! mangled symbols, nor things that are emitted in different crates.
use cargo_metadata::Message;
use std::env;