-
Notifications
You must be signed in to change notification settings - Fork 14.5k
RuntimeLibcalls: Add some tests for OpenBSD stack protectors #147888
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
base: main
Are you sure you want to change the base?
RuntimeLibcalls: Add some tests for OpenBSD stack protectors #147888
Conversation
7dce16f removed a libcall for STACKPROTECTOR_CHECK_FAIL from OpenBSD but added no tests. Add a basic test copied from RISCV into all the backends on the OpenBSD page of supported architectures before I potentially break in in RuntimeLibcalls refactoring.
@llvm/pr-subscribers-backend-powerpc Author: Matt Arsenault (arsenm) Changes7dce16f removed a libcall for Add a basic test copied from RISCV into all the backends on Patch is 24.06 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/147888.diff 6 Files Affected:
diff --git a/llvm/test/CodeGen/ARM/stack-protector-target.ll b/llvm/test/CodeGen/ARM/stack-protector-target.ll
new file mode 100644
index 00000000000000..a7ec0ec69bd2c5
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/stack-protector-target.ll
@@ -0,0 +1,68 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm-unknown-linux-eabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-linux-gnueabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD %s
+
+define void @func() sspreq nounwind {
+; LINUX-LABEL: func:
+; LINUX: @ %bb.0:
+; LINUX-NEXT: .save {r11, lr}
+; LINUX-NEXT: push {r11, lr}
+; LINUX-NEXT: .pad #8
+; LINUX-NEXT: sub sp, sp, #8
+; LINUX-NEXT: ldr r0, .LCPI0_0
+; LINUX-NEXT: ldr r0, [r0]
+; LINUX-NEXT: str r0, [sp, #4]
+; LINUX-NEXT: mov r0, sp
+; LINUX-NEXT: bl capture
+; LINUX-NEXT: ldr r0, [sp, #4]
+; LINUX-NEXT: ldr r1, .LCPI0_0
+; LINUX-NEXT: ldr r1, [r1]
+; LINUX-NEXT: cmp r1, r0
+; LINUX-NEXT: addeq sp, sp, #8
+; LINUX-NEXT: popeq {r11, lr}
+; LINUX-NEXT: moveq pc, lr
+; LINUX-NEXT: .LBB0_1:
+; LINUX-NEXT: bl __stack_chk_fail
+; LINUX-NEXT: .p2align 2
+; LINUX-NEXT: @ %bb.2:
+; LINUX-NEXT: .LCPI0_0:
+; LINUX-NEXT: .long __stack_chk_guard
+;
+; OPENBSD-LABEL: func:
+; OPENBSD: @ %bb.0:
+; OPENBSD-NEXT: push {r4, lr}
+; OPENBSD-NEXT: sub sp, sp, #8
+; OPENBSD-NEXT: ldr r4, .LCPI0_0
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r0, .LCPI0_2
+; OPENBSD-NEXT: ldr r0, [r0]
+; OPENBSD-NEXT: str r0, [sp, #4]
+; OPENBSD-NEXT: mov r0, sp
+; OPENBSD-NEXT: bl capture
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r1, [sp, #4]
+; OPENBSD-NEXT: cmp r0, r1
+; OPENBSD-NEXT: addeq sp, sp, #8
+; OPENBSD-NEXT: popeq {r4, lr}
+; OPENBSD-NEXT: moveq pc, lr
+; OPENBSD-NEXT: .LBB0_1: @ %CallStackCheckFailBlk
+; OPENBSD-NEXT: ldr r0, .LCPI0_1
+; OPENBSD-NEXT: bl __stack_smash_handler
+; OPENBSD-NEXT: .p2align 2
+; OPENBSD-NEXT: @ %bb.2:
+; OPENBSD-NEXT: .LCPI0_0:
+; OPENBSD-NEXT: .long __guard_local
+; OPENBSD-NEXT: .LCPI0_1:
+; OPENBSD-NEXT: .long .LSSH
+; OPENBSD-NEXT: .LCPI0_2:
+; OPENBSD-NEXT: .long __guard_local
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; EABI: {{.*}}
+; GNUEABI: {{.*}}
diff --git a/llvm/test/CodeGen/LoongArch/stack-protector-target.ll b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
new file mode 100644
index 00000000000000..ea4569e198d02f
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
@@ -0,0 +1,104 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=loongarch32-linux-gnu < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=loongarch64-linux-gnu < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=loongarch32-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=loongarch64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: addi.w $sp, $sp, -16
+; LINUX32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LINUX32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; LINUX32-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: st.w $a0, $sp, 4
+; LINUX32-NEXT: addi.w $a0, $sp, 0
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a1, $sp, 4
+; LINUX32-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; LINUX32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LINUX32-NEXT: addi.w $sp, $sp, 16
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: addi.d $sp, $sp, -32
+; LINUX64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; LINUX64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; LINUX64-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: st.d $a0, $sp, 8
+; LINUX64-NEXT: addi.d $a0, $sp, 4
+; LINUX64-NEXT: pcaddu18i $ra, %call36(capture)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a1, $sp, 8
+; LINUX64-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; LINUX64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; LINUX64-NEXT: addi.d $sp, $sp, 32
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: pcaddu18i $ra, %call36(__stack_chk_fail)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: addi.w $sp, $sp, -16
+; OPENBSD32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; OPENBSD32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; OPENBSD32-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: st.w $a0, $sp, 4
+; OPENBSD32-NEXT: addi.w $a0, $sp, 0
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: ld.w $a1, $sp, 4
+; OPENBSD32-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; OPENBSD32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; OPENBSD32-NEXT: addi.w $sp, $sp, 16
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD32-NEXT: addi.w $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: addi.d $sp, $sp, -32
+; OPENBSD64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; OPENBSD64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; OPENBSD64-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: st.d $a0, $sp, 8
+; OPENBSD64-NEXT: addi.d $a0, $sp, 4
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(capture)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: ld.d $a1, $sp, 8
+; OPENBSD64-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; OPENBSD64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; OPENBSD64-NEXT: addi.d $sp, $sp, 32
+; OPENBSD64-NEXT: ret
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD64-NEXT: addi.d $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(__stack_smash_handler)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/PowerPC/stack-protector-target.ll b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
new file mode 100644
index 00000000000000..03ffa0b4c142b4
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
@@ -0,0 +1,164 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=powerpc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=powerpc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+; RUN: llc -mtriple=powerpc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=powerpc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX32 %s
+; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX64 %s
+
+define void @func() sspreq nounwind {
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: mflr 0
+; OPENBSD32-NEXT: stwu 1, -32(1)
+; OPENBSD32-NEXT: stw 0, 36(1)
+; OPENBSD32-NEXT: stw 30, 24(1) # 4-byte Folded Spill
+; OPENBSD32-NEXT: lis 30, __guard_local@ha
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: stw 3, 20(1)
+; OPENBSD32-NEXT: addi 3, 1, 16
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: lwz 4, 20(1)
+; OPENBSD32-NEXT: cmplw 3, 4
+; OPENBSD32-NEXT: bne- 0, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: lwz 30, 24(1) # 4-byte Folded Reload
+; OPENBSD32-NEXT: lwz 0, 36(1)
+; OPENBSD32-NEXT: addi 1, 1, 32
+; OPENBSD32-NEXT: mtlr 0
+; OPENBSD32-NEXT: blr
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: lis 3, .LSSH@ha
+; OPENBSD32-NEXT: la 3, .LSSH@l(3)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: mflr 0
+; OPENBSD64-NEXT: std 30, -16(1) # 8-byte Folded Spill
+; OPENBSD64-NEXT: stdu 1, -64(1)
+; OPENBSD64-NEXT: std 0, 80(1)
+; OPENBSD64-NEXT: addis 30, 2, __guard_local@toc@ha
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: std 3, 40(1)
+; OPENBSD64-NEXT: addi 3, 1, 36
+; OPENBSD64-NEXT: bl capture
+; OPENBSD64-NEXT: nop
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: ld 4, 40(1)
+; OPENBSD64-NEXT: cmpld 3, 4
+; OPENBSD64-NEXT: bne- 0, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: addi 1, 1, 64
+; OPENBSD64-NEXT: ld 0, 16(1)
+; OPENBSD64-NEXT: mtlr 0
+; OPENBSD64-NEXT: ld 30, -16(1) # 8-byte Folded Reload
+; OPENBSD64-NEXT: blr
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: addis 3, 2, .LSSH@toc@ha
+; OPENBSD64-NEXT: addi 3, 3, .LSSH@toc@l
+; OPENBSD64-NEXT: bl __stack_smash_handler
+; OPENBSD64-NEXT: nop
+;
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: mflr 0
+; LINUX32-NEXT: stwu 1, -16(1)
+; LINUX32-NEXT: stw 0, 20(1)
+; LINUX32-NEXT: lwz 3, -28680(2)
+; LINUX32-NEXT: stw 3, 12(1)
+; LINUX32-NEXT: addi 3, 1, 8
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: lwz 3, 12(1)
+; LINUX32-NEXT: lwz 4, -28680(2)
+; LINUX32-NEXT: cmplw 4, 3
+; LINUX32-NEXT: bne 0, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: lwz 0, 20(1)
+; LINUX32-NEXT: addi 1, 1, 16
+; LINUX32-NEXT: mtlr 0
+; LINUX32-NEXT: blr
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: mflr 0
+; LINUX64-NEXT: stdu 1, -128(1)
+; LINUX64-NEXT: std 0, 144(1)
+; LINUX64-NEXT: ld 3, -28688(13)
+; LINUX64-NEXT: std 3, 120(1)
+; LINUX64-NEXT: addi 3, 1, 116
+; LINUX64-NEXT: bl capture
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ld 3, 120(1)
+; LINUX64-NEXT: ld 4, -28688(13)
+; LINUX64-NEXT: cmpld 4, 3
+; LINUX64-NEXT: bne 0, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: addi 1, 1, 128
+; LINUX64-NEXT: ld 0, 16(1)
+; LINUX64-NEXT: mtlr 0
+; LINUX64-NEXT: blr
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: bl __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; AIX32-LABEL: func:
+; AIX32: # %bb.0:
+; AIX32-NEXT: mflr 0
+; AIX32-NEXT: stwu 1, -80(1)
+; AIX32-NEXT: stw 0, 88(1)
+; AIX32-NEXT: stw 31, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT: lwz 31, L..C0(2) # @__ssp_canary_word
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: stw 3, 72(1)
+; AIX32-NEXT: addi 3, 1, 68
+; AIX32-NEXT: bl .capture[PR]
+; AIX32-NEXT: nop
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: lwz 4, 72(1)
+; AIX32-NEXT: cmplw 3, 4
+; AIX32-NEXT: bne 0, L..BB0_2
+; AIX32-NEXT: # %bb.1:
+; AIX32-NEXT: lwz 31, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT: addi 1, 1, 80
+; AIX32-NEXT: lwz 0, 8(1)
+; AIX32-NEXT: mtlr 0
+; AIX32-NEXT: blr
+; AIX32-NEXT: L..BB0_2:
+; AIX32-NEXT: bl .__stack_chk_fail[PR]
+; AIX32-NEXT: nop
+;
+; AIX64-LABEL: func:
+; AIX64: # %bb.0:
+; AIX64-NEXT: mflr 0
+; AIX64-NEXT: stdu 1, -144(1)
+; AIX64-NEXT: std 0, 160(1)
+; AIX64-NEXT: std 31, 136(1) # 8-byte Folded Spill
+; AIX64-NEXT: ld 31, L..C0(2) # @__ssp_canary_word
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: std 3, 128(1)
+; AIX64-NEXT: addi 3, 1, 124
+; AIX64-NEXT: bl .capture[PR]
+; AIX64-NEXT: nop
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: ld 4, 128(1)
+; AIX64-NEXT: cmpld 3, 4
+; AIX64-NEXT: bne 0, L..BB0_2
+; AIX64-NEXT: # %bb.1:
+; AIX64-NEXT: ld 31, 136(1) # 8-byte Folded Reload
+; AIX64-NEXT: addi 1, 1, 144
+; AIX64-NEXT: ld 0, 16(1)
+; AIX64-NEXT: mtlr 0
+; AIX64-NEXT: blr
+; AIX64-NEXT: L..BB0_2:
+; AIX64-NEXT: bl .__stack_chk_fail[PR]
+; AIX64-NEXT: nop
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/RISCV/stack-protector-target.ll b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
index a4bd0e9ceac988..b01b044db5d6f6 100644
--- a/llvm/test/CodeGen/RISCV/stack-protector-target.ll
+++ b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
@@ -5,6 +5,7 @@
; RUN: llc -mtriple=riscv64-linux < %s | FileCheck --check-prefix=LINUX-RISCV64 %s
; RUN: llc -mtriple=riscv64-fuchsia < %s | FileCheck --check-prefix=FUCHSIA-RISCV64 %s
; RUN: llc -mtriple=riscv64-android < %s | FileCheck --check-prefix=ANDROID-RISCV64 %s
+; RUN: llc -mtriple=riscv64-openbsd < %s | FileCheck --check-prefix=OPENBSD-RISCV64 %s
define void @func() sspreq nounwind {
; LINUX-RISCV64-LABEL: func:
@@ -63,6 +64,29 @@ define void @func() sspreq nounwind {
; ANDROID-RISCV64-NEXT: ret
; ANDROID-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
; ANDROID-RISCV64-NEXT: call __stack_chk_fail
+;
+; OPENBSD-RISCV64-LABEL: func:
+; OPENBSD-RISCV64: # %bb.0:
+; OPENBSD-RISCV64-NEXT: addi sp, sp, -32
+; OPENBSD-RISCV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: lui s0, %hi(__guard_local)
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: sd a0, 8(sp)
+; OPENBSD-RISCV64-NEXT: addi a0, sp, 4
+; OPENBSD-RISCV64-NEXT: call capture
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: ld a1, 8(sp)
+; OPENBSD-RISCV64-NEXT: bne a0, a1, .LBB0_2
+; OPENBSD-RISCV64-NEXT: # %bb.1: # %SP_return
+; OPENBSD-RISCV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: addi sp, sp, 32
+; OPENBSD-RISCV64-NEXT: ret
+; OPENBSD-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD-RISCV64-NEXT: lui a0, %hi(.LSSH)
+; OPENBSD-RISCV64-NEXT: addi a0, a0, %lo(.LSSH)
+; OPENBSD-RISCV64-NEXT: call __stack_smash_handler
%1 = alloca i32, align 4
call void @capture(ptr %1)
ret void
diff --git a/llvm/test/CodeGen/SPARC/stack-protector-target.ll b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
new file mode 100644
index 00000000000000..f0e9aa8986ab86
--- /dev/null
+++ b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
@@ -0,0 +1,141 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=sparc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=sparc-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS32 %s
+; RUN: llc -mtriple=sparc64-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS64 %s
+; RUN: llc -mtriple=sparc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=sparc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: ! %bb.0:
+; LINUX32-NEXT: save %sp, -104, %sp
+; LINUX32-NEXT: ld [%g7+20], %i0
+; LINUX32-NEXT: st %i0, [%fp+-4]
+; LINUX32-NEXT: call capture
+; LINUX32-NEXT: add %fp, -8, %o0
+; LINUX32-NEXT: ld [%fp+-4], %i0
+; LINUX32-NEXT: ld [%g7+20], %i1
+; LINUX32-NEXT: cmp %i1, %i0
+; LINUX32-NEXT: bne .LBB0_2
+; LINUX32-NEXT: nop
+; LINUX32-NEXT: ! %bb.1:
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: restore
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: call __stack_chk_fail
+; LINUX32-NEXT: nop
+;
+; LINUX64-LABEL: func:
+; LINUX64: .register %g7, #ignore
+; LINUX64-NEXT: ! %bb.0:
+; LINUX64-NEXT: save %sp, -192, %sp
+; LINUX64-NEXT: ldx [%g7+40], %i0
+; LINUX64-NEXT: stx %i0, [%fp+2039]
+; LINUX64-NEXT: call capture
+; LINUX64-NEXT: add %fp, 2035, %o0
+; LINUX64-NEXT: ldx [%fp+2039], %i0
+; LINUX64-NEXT: ldx [%g7+40], %i1
+; LINUX64-NEXT: cmp %i1, %i0
+; LINUX64-NEXT: bne %xcc, .LBB0_2
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ! %bb.1:
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: restore
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: call __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; SOLARIS32-LABEL: func:
+; SOLARIS32: ! %bb.0:
+; SOLARIS32-NEXT: save %sp, -104, %sp
+; SOLARIS32-NEXT: sethi %hi(__stack_chk_guard), %i0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i1
+; SOLARIS32-NEXT: st %i1, [%fp+-4]
+; SOLARIS32-NEXT: call capture
+; SOLARIS32-NEXT: add %fp, -8, %o0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i0
+; SOLARIS32-NEXT: ld [%fp+-4], %i1
+; SOLARIS32-NEXT: cmp %i0, %i1
+; SOLARIS32-NEXT: bne .LBB0_2
+; SOLARIS32-NEXT: nop
+; SOLARIS32-NEXT: ! %bb.1:
+; SOLARIS32-NEXT: ret
+; SOLARIS32-NEXT: restore
+; SOLARIS32-NEXT: .LBB0_2:
+; SOLARIS32-NEXT: call __stack_chk_fail
+; SOLARIS32-NEXT: nop
+;
+; SOLARIS64-LABEL: func:
+; SOLARIS64: ! %bb.0:
+; SOLARIS64-NEXT: save %sp, -192, %sp
+; SOLARIS64-NEXT: sethi %h44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: add %i0, %m44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: sllx %i0, 12, %i0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i1
+; SOLARIS64-NEXT: stx %i1, [%fp+2039]
+; SOLARIS64-NEXT: call capture
+; SOLARIS64-NEXT: add %fp, 2035, %o0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i0
+; SOLARIS64-NEXT: ldx [%fp+2039], %i1
+; SOLARIS64-NEXT: cmp %i0, %i1
+; SOLARIS64-NEXT: bne %xcc, .LBB0_2
+; SOLARIS64-NEXT: nop
+; SOLARIS64-NEXT: ! %bb.1:
+; SOLARIS64-NEXT: ret
+; SOLARIS64-NEXT: restore
+; SOLARIS64-NEXT: .LBB0_2:
+; SOLARIS64-NEXT: call __stack_chk_fail
+; SOLARIS64-NEXT: nop
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: ! %bb.0:
+; OPENBSD32-NEXT: save %sp, -104, %sp
+; OPENBSD32-NEXT: sethi %hi(__guard_local), %i0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i1
+; OPENBSD32-NEXT: st %i1, [%fp+-4]
+; OPENBSD32-NEXT: call capture
+; OPENBSD32-NEXT: add %fp, -8, %o0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i0
+; OPENBSD32-NEXT: ld [%fp+-4], %i1
+; OPENBSD32-NEXT: cmp %i0, %i1
+; OPENBSD32-NEXT: bne .LBB0_2
+; OPENBSD32-NEXT: nop
+; OPENBSD32-NEXT: ! %bb.1: ! %SP_return
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: restore
+; OPENBSD32-NEXT: .LBB0_2: ! %CallStackCheckFailBlk
+; OPENBSD32-NEXT: sethi %hi(.LSSH), %i0
+; OPENBSD32-NEXT: call __stack_smash_handler
+; OPENBSD32-NEXT: add %i0, %lo(.LSSH), %o0
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: ! %bb.0:
+; OPENBSD64-NEXT: save %sp, -192, %sp
+; OPENBSD64-NEXT: sethi %h44(__guard_local), %i0
+; OPENBSD64-NEXT: add %i0, %m44(__guard_local), %i0
+; OPENBSD64-NEXT: sllx %i0, 12, %i0
+; OPENBSD64-NEXT: ldx [%i0+%l44(__guard_local)], %i1
+; OPENBSD64-NEXT: stx %i1, [%fp+2039]
+; OPENBSD64-NEXT: call capture
+; OPENBSD...
[truncated]
|
@llvm/pr-subscribers-backend-loongarch Author: Matt Arsenault (arsenm) Changes7dce16f removed a libcall for Add a basic test copied from RISCV into all the backends on Patch is 24.06 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/147888.diff 6 Files Affected:
diff --git a/llvm/test/CodeGen/ARM/stack-protector-target.ll b/llvm/test/CodeGen/ARM/stack-protector-target.ll
new file mode 100644
index 00000000000000..a7ec0ec69bd2c5
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/stack-protector-target.ll
@@ -0,0 +1,68 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm-unknown-linux-eabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-linux-gnueabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD %s
+
+define void @func() sspreq nounwind {
+; LINUX-LABEL: func:
+; LINUX: @ %bb.0:
+; LINUX-NEXT: .save {r11, lr}
+; LINUX-NEXT: push {r11, lr}
+; LINUX-NEXT: .pad #8
+; LINUX-NEXT: sub sp, sp, #8
+; LINUX-NEXT: ldr r0, .LCPI0_0
+; LINUX-NEXT: ldr r0, [r0]
+; LINUX-NEXT: str r0, [sp, #4]
+; LINUX-NEXT: mov r0, sp
+; LINUX-NEXT: bl capture
+; LINUX-NEXT: ldr r0, [sp, #4]
+; LINUX-NEXT: ldr r1, .LCPI0_0
+; LINUX-NEXT: ldr r1, [r1]
+; LINUX-NEXT: cmp r1, r0
+; LINUX-NEXT: addeq sp, sp, #8
+; LINUX-NEXT: popeq {r11, lr}
+; LINUX-NEXT: moveq pc, lr
+; LINUX-NEXT: .LBB0_1:
+; LINUX-NEXT: bl __stack_chk_fail
+; LINUX-NEXT: .p2align 2
+; LINUX-NEXT: @ %bb.2:
+; LINUX-NEXT: .LCPI0_0:
+; LINUX-NEXT: .long __stack_chk_guard
+;
+; OPENBSD-LABEL: func:
+; OPENBSD: @ %bb.0:
+; OPENBSD-NEXT: push {r4, lr}
+; OPENBSD-NEXT: sub sp, sp, #8
+; OPENBSD-NEXT: ldr r4, .LCPI0_0
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r0, .LCPI0_2
+; OPENBSD-NEXT: ldr r0, [r0]
+; OPENBSD-NEXT: str r0, [sp, #4]
+; OPENBSD-NEXT: mov r0, sp
+; OPENBSD-NEXT: bl capture
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r1, [sp, #4]
+; OPENBSD-NEXT: cmp r0, r1
+; OPENBSD-NEXT: addeq sp, sp, #8
+; OPENBSD-NEXT: popeq {r4, lr}
+; OPENBSD-NEXT: moveq pc, lr
+; OPENBSD-NEXT: .LBB0_1: @ %CallStackCheckFailBlk
+; OPENBSD-NEXT: ldr r0, .LCPI0_1
+; OPENBSD-NEXT: bl __stack_smash_handler
+; OPENBSD-NEXT: .p2align 2
+; OPENBSD-NEXT: @ %bb.2:
+; OPENBSD-NEXT: .LCPI0_0:
+; OPENBSD-NEXT: .long __guard_local
+; OPENBSD-NEXT: .LCPI0_1:
+; OPENBSD-NEXT: .long .LSSH
+; OPENBSD-NEXT: .LCPI0_2:
+; OPENBSD-NEXT: .long __guard_local
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; EABI: {{.*}}
+; GNUEABI: {{.*}}
diff --git a/llvm/test/CodeGen/LoongArch/stack-protector-target.ll b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
new file mode 100644
index 00000000000000..ea4569e198d02f
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
@@ -0,0 +1,104 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=loongarch32-linux-gnu < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=loongarch64-linux-gnu < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=loongarch32-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=loongarch64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: addi.w $sp, $sp, -16
+; LINUX32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LINUX32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; LINUX32-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: st.w $a0, $sp, 4
+; LINUX32-NEXT: addi.w $a0, $sp, 0
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a1, $sp, 4
+; LINUX32-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; LINUX32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LINUX32-NEXT: addi.w $sp, $sp, 16
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: addi.d $sp, $sp, -32
+; LINUX64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; LINUX64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; LINUX64-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: st.d $a0, $sp, 8
+; LINUX64-NEXT: addi.d $a0, $sp, 4
+; LINUX64-NEXT: pcaddu18i $ra, %call36(capture)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a1, $sp, 8
+; LINUX64-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; LINUX64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; LINUX64-NEXT: addi.d $sp, $sp, 32
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: pcaddu18i $ra, %call36(__stack_chk_fail)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: addi.w $sp, $sp, -16
+; OPENBSD32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; OPENBSD32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; OPENBSD32-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: st.w $a0, $sp, 4
+; OPENBSD32-NEXT: addi.w $a0, $sp, 0
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: ld.w $a1, $sp, 4
+; OPENBSD32-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; OPENBSD32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; OPENBSD32-NEXT: addi.w $sp, $sp, 16
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD32-NEXT: addi.w $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: addi.d $sp, $sp, -32
+; OPENBSD64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; OPENBSD64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; OPENBSD64-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: st.d $a0, $sp, 8
+; OPENBSD64-NEXT: addi.d $a0, $sp, 4
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(capture)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: ld.d $a1, $sp, 8
+; OPENBSD64-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; OPENBSD64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; OPENBSD64-NEXT: addi.d $sp, $sp, 32
+; OPENBSD64-NEXT: ret
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD64-NEXT: addi.d $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(__stack_smash_handler)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/PowerPC/stack-protector-target.ll b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
new file mode 100644
index 00000000000000..03ffa0b4c142b4
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
@@ -0,0 +1,164 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=powerpc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=powerpc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+; RUN: llc -mtriple=powerpc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=powerpc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX32 %s
+; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX64 %s
+
+define void @func() sspreq nounwind {
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: mflr 0
+; OPENBSD32-NEXT: stwu 1, -32(1)
+; OPENBSD32-NEXT: stw 0, 36(1)
+; OPENBSD32-NEXT: stw 30, 24(1) # 4-byte Folded Spill
+; OPENBSD32-NEXT: lis 30, __guard_local@ha
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: stw 3, 20(1)
+; OPENBSD32-NEXT: addi 3, 1, 16
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: lwz 4, 20(1)
+; OPENBSD32-NEXT: cmplw 3, 4
+; OPENBSD32-NEXT: bne- 0, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: lwz 30, 24(1) # 4-byte Folded Reload
+; OPENBSD32-NEXT: lwz 0, 36(1)
+; OPENBSD32-NEXT: addi 1, 1, 32
+; OPENBSD32-NEXT: mtlr 0
+; OPENBSD32-NEXT: blr
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: lis 3, .LSSH@ha
+; OPENBSD32-NEXT: la 3, .LSSH@l(3)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: mflr 0
+; OPENBSD64-NEXT: std 30, -16(1) # 8-byte Folded Spill
+; OPENBSD64-NEXT: stdu 1, -64(1)
+; OPENBSD64-NEXT: std 0, 80(1)
+; OPENBSD64-NEXT: addis 30, 2, __guard_local@toc@ha
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: std 3, 40(1)
+; OPENBSD64-NEXT: addi 3, 1, 36
+; OPENBSD64-NEXT: bl capture
+; OPENBSD64-NEXT: nop
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: ld 4, 40(1)
+; OPENBSD64-NEXT: cmpld 3, 4
+; OPENBSD64-NEXT: bne- 0, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: addi 1, 1, 64
+; OPENBSD64-NEXT: ld 0, 16(1)
+; OPENBSD64-NEXT: mtlr 0
+; OPENBSD64-NEXT: ld 30, -16(1) # 8-byte Folded Reload
+; OPENBSD64-NEXT: blr
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: addis 3, 2, .LSSH@toc@ha
+; OPENBSD64-NEXT: addi 3, 3, .LSSH@toc@l
+; OPENBSD64-NEXT: bl __stack_smash_handler
+; OPENBSD64-NEXT: nop
+;
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: mflr 0
+; LINUX32-NEXT: stwu 1, -16(1)
+; LINUX32-NEXT: stw 0, 20(1)
+; LINUX32-NEXT: lwz 3, -28680(2)
+; LINUX32-NEXT: stw 3, 12(1)
+; LINUX32-NEXT: addi 3, 1, 8
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: lwz 3, 12(1)
+; LINUX32-NEXT: lwz 4, -28680(2)
+; LINUX32-NEXT: cmplw 4, 3
+; LINUX32-NEXT: bne 0, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: lwz 0, 20(1)
+; LINUX32-NEXT: addi 1, 1, 16
+; LINUX32-NEXT: mtlr 0
+; LINUX32-NEXT: blr
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: mflr 0
+; LINUX64-NEXT: stdu 1, -128(1)
+; LINUX64-NEXT: std 0, 144(1)
+; LINUX64-NEXT: ld 3, -28688(13)
+; LINUX64-NEXT: std 3, 120(1)
+; LINUX64-NEXT: addi 3, 1, 116
+; LINUX64-NEXT: bl capture
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ld 3, 120(1)
+; LINUX64-NEXT: ld 4, -28688(13)
+; LINUX64-NEXT: cmpld 4, 3
+; LINUX64-NEXT: bne 0, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: addi 1, 1, 128
+; LINUX64-NEXT: ld 0, 16(1)
+; LINUX64-NEXT: mtlr 0
+; LINUX64-NEXT: blr
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: bl __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; AIX32-LABEL: func:
+; AIX32: # %bb.0:
+; AIX32-NEXT: mflr 0
+; AIX32-NEXT: stwu 1, -80(1)
+; AIX32-NEXT: stw 0, 88(1)
+; AIX32-NEXT: stw 31, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT: lwz 31, L..C0(2) # @__ssp_canary_word
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: stw 3, 72(1)
+; AIX32-NEXT: addi 3, 1, 68
+; AIX32-NEXT: bl .capture[PR]
+; AIX32-NEXT: nop
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: lwz 4, 72(1)
+; AIX32-NEXT: cmplw 3, 4
+; AIX32-NEXT: bne 0, L..BB0_2
+; AIX32-NEXT: # %bb.1:
+; AIX32-NEXT: lwz 31, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT: addi 1, 1, 80
+; AIX32-NEXT: lwz 0, 8(1)
+; AIX32-NEXT: mtlr 0
+; AIX32-NEXT: blr
+; AIX32-NEXT: L..BB0_2:
+; AIX32-NEXT: bl .__stack_chk_fail[PR]
+; AIX32-NEXT: nop
+;
+; AIX64-LABEL: func:
+; AIX64: # %bb.0:
+; AIX64-NEXT: mflr 0
+; AIX64-NEXT: stdu 1, -144(1)
+; AIX64-NEXT: std 0, 160(1)
+; AIX64-NEXT: std 31, 136(1) # 8-byte Folded Spill
+; AIX64-NEXT: ld 31, L..C0(2) # @__ssp_canary_word
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: std 3, 128(1)
+; AIX64-NEXT: addi 3, 1, 124
+; AIX64-NEXT: bl .capture[PR]
+; AIX64-NEXT: nop
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: ld 4, 128(1)
+; AIX64-NEXT: cmpld 3, 4
+; AIX64-NEXT: bne 0, L..BB0_2
+; AIX64-NEXT: # %bb.1:
+; AIX64-NEXT: ld 31, 136(1) # 8-byte Folded Reload
+; AIX64-NEXT: addi 1, 1, 144
+; AIX64-NEXT: ld 0, 16(1)
+; AIX64-NEXT: mtlr 0
+; AIX64-NEXT: blr
+; AIX64-NEXT: L..BB0_2:
+; AIX64-NEXT: bl .__stack_chk_fail[PR]
+; AIX64-NEXT: nop
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/RISCV/stack-protector-target.ll b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
index a4bd0e9ceac988..b01b044db5d6f6 100644
--- a/llvm/test/CodeGen/RISCV/stack-protector-target.ll
+++ b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
@@ -5,6 +5,7 @@
; RUN: llc -mtriple=riscv64-linux < %s | FileCheck --check-prefix=LINUX-RISCV64 %s
; RUN: llc -mtriple=riscv64-fuchsia < %s | FileCheck --check-prefix=FUCHSIA-RISCV64 %s
; RUN: llc -mtriple=riscv64-android < %s | FileCheck --check-prefix=ANDROID-RISCV64 %s
+; RUN: llc -mtriple=riscv64-openbsd < %s | FileCheck --check-prefix=OPENBSD-RISCV64 %s
define void @func() sspreq nounwind {
; LINUX-RISCV64-LABEL: func:
@@ -63,6 +64,29 @@ define void @func() sspreq nounwind {
; ANDROID-RISCV64-NEXT: ret
; ANDROID-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
; ANDROID-RISCV64-NEXT: call __stack_chk_fail
+;
+; OPENBSD-RISCV64-LABEL: func:
+; OPENBSD-RISCV64: # %bb.0:
+; OPENBSD-RISCV64-NEXT: addi sp, sp, -32
+; OPENBSD-RISCV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: lui s0, %hi(__guard_local)
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: sd a0, 8(sp)
+; OPENBSD-RISCV64-NEXT: addi a0, sp, 4
+; OPENBSD-RISCV64-NEXT: call capture
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: ld a1, 8(sp)
+; OPENBSD-RISCV64-NEXT: bne a0, a1, .LBB0_2
+; OPENBSD-RISCV64-NEXT: # %bb.1: # %SP_return
+; OPENBSD-RISCV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: addi sp, sp, 32
+; OPENBSD-RISCV64-NEXT: ret
+; OPENBSD-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD-RISCV64-NEXT: lui a0, %hi(.LSSH)
+; OPENBSD-RISCV64-NEXT: addi a0, a0, %lo(.LSSH)
+; OPENBSD-RISCV64-NEXT: call __stack_smash_handler
%1 = alloca i32, align 4
call void @capture(ptr %1)
ret void
diff --git a/llvm/test/CodeGen/SPARC/stack-protector-target.ll b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
new file mode 100644
index 00000000000000..f0e9aa8986ab86
--- /dev/null
+++ b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
@@ -0,0 +1,141 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=sparc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=sparc-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS32 %s
+; RUN: llc -mtriple=sparc64-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS64 %s
+; RUN: llc -mtriple=sparc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=sparc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: ! %bb.0:
+; LINUX32-NEXT: save %sp, -104, %sp
+; LINUX32-NEXT: ld [%g7+20], %i0
+; LINUX32-NEXT: st %i0, [%fp+-4]
+; LINUX32-NEXT: call capture
+; LINUX32-NEXT: add %fp, -8, %o0
+; LINUX32-NEXT: ld [%fp+-4], %i0
+; LINUX32-NEXT: ld [%g7+20], %i1
+; LINUX32-NEXT: cmp %i1, %i0
+; LINUX32-NEXT: bne .LBB0_2
+; LINUX32-NEXT: nop
+; LINUX32-NEXT: ! %bb.1:
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: restore
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: call __stack_chk_fail
+; LINUX32-NEXT: nop
+;
+; LINUX64-LABEL: func:
+; LINUX64: .register %g7, #ignore
+; LINUX64-NEXT: ! %bb.0:
+; LINUX64-NEXT: save %sp, -192, %sp
+; LINUX64-NEXT: ldx [%g7+40], %i0
+; LINUX64-NEXT: stx %i0, [%fp+2039]
+; LINUX64-NEXT: call capture
+; LINUX64-NEXT: add %fp, 2035, %o0
+; LINUX64-NEXT: ldx [%fp+2039], %i0
+; LINUX64-NEXT: ldx [%g7+40], %i1
+; LINUX64-NEXT: cmp %i1, %i0
+; LINUX64-NEXT: bne %xcc, .LBB0_2
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ! %bb.1:
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: restore
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: call __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; SOLARIS32-LABEL: func:
+; SOLARIS32: ! %bb.0:
+; SOLARIS32-NEXT: save %sp, -104, %sp
+; SOLARIS32-NEXT: sethi %hi(__stack_chk_guard), %i0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i1
+; SOLARIS32-NEXT: st %i1, [%fp+-4]
+; SOLARIS32-NEXT: call capture
+; SOLARIS32-NEXT: add %fp, -8, %o0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i0
+; SOLARIS32-NEXT: ld [%fp+-4], %i1
+; SOLARIS32-NEXT: cmp %i0, %i1
+; SOLARIS32-NEXT: bne .LBB0_2
+; SOLARIS32-NEXT: nop
+; SOLARIS32-NEXT: ! %bb.1:
+; SOLARIS32-NEXT: ret
+; SOLARIS32-NEXT: restore
+; SOLARIS32-NEXT: .LBB0_2:
+; SOLARIS32-NEXT: call __stack_chk_fail
+; SOLARIS32-NEXT: nop
+;
+; SOLARIS64-LABEL: func:
+; SOLARIS64: ! %bb.0:
+; SOLARIS64-NEXT: save %sp, -192, %sp
+; SOLARIS64-NEXT: sethi %h44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: add %i0, %m44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: sllx %i0, 12, %i0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i1
+; SOLARIS64-NEXT: stx %i1, [%fp+2039]
+; SOLARIS64-NEXT: call capture
+; SOLARIS64-NEXT: add %fp, 2035, %o0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i0
+; SOLARIS64-NEXT: ldx [%fp+2039], %i1
+; SOLARIS64-NEXT: cmp %i0, %i1
+; SOLARIS64-NEXT: bne %xcc, .LBB0_2
+; SOLARIS64-NEXT: nop
+; SOLARIS64-NEXT: ! %bb.1:
+; SOLARIS64-NEXT: ret
+; SOLARIS64-NEXT: restore
+; SOLARIS64-NEXT: .LBB0_2:
+; SOLARIS64-NEXT: call __stack_chk_fail
+; SOLARIS64-NEXT: nop
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: ! %bb.0:
+; OPENBSD32-NEXT: save %sp, -104, %sp
+; OPENBSD32-NEXT: sethi %hi(__guard_local), %i0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i1
+; OPENBSD32-NEXT: st %i1, [%fp+-4]
+; OPENBSD32-NEXT: call capture
+; OPENBSD32-NEXT: add %fp, -8, %o0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i0
+; OPENBSD32-NEXT: ld [%fp+-4], %i1
+; OPENBSD32-NEXT: cmp %i0, %i1
+; OPENBSD32-NEXT: bne .LBB0_2
+; OPENBSD32-NEXT: nop
+; OPENBSD32-NEXT: ! %bb.1: ! %SP_return
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: restore
+; OPENBSD32-NEXT: .LBB0_2: ! %CallStackCheckFailBlk
+; OPENBSD32-NEXT: sethi %hi(.LSSH), %i0
+; OPENBSD32-NEXT: call __stack_smash_handler
+; OPENBSD32-NEXT: add %i0, %lo(.LSSH), %o0
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: ! %bb.0:
+; OPENBSD64-NEXT: save %sp, -192, %sp
+; OPENBSD64-NEXT: sethi %h44(__guard_local), %i0
+; OPENBSD64-NEXT: add %i0, %m44(__guard_local), %i0
+; OPENBSD64-NEXT: sllx %i0, 12, %i0
+; OPENBSD64-NEXT: ldx [%i0+%l44(__guard_local)], %i1
+; OPENBSD64-NEXT: stx %i1, [%fp+2039]
+; OPENBSD64-NEXT: call capture
+; OPENBSD...
[truncated]
|
@llvm/pr-subscribers-backend-arm Author: Matt Arsenault (arsenm) Changes7dce16f removed a libcall for Add a basic test copied from RISCV into all the backends on Patch is 24.05 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/147888.diff 6 Files Affected:
diff --git a/llvm/test/CodeGen/ARM/stack-protector-target.ll b/llvm/test/CodeGen/ARM/stack-protector-target.ll
new file mode 100644
index 0000000000000..a7ec0ec69bd2c
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/stack-protector-target.ll
@@ -0,0 +1,68 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm-unknown-linux-eabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-linux-gnueabi < %s | FileCheck -check-prefix=LINUX %s
+; RUN: llc -mtriple=arm-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD %s
+
+define void @func() sspreq nounwind {
+; LINUX-LABEL: func:
+; LINUX: @ %bb.0:
+; LINUX-NEXT: .save {r11, lr}
+; LINUX-NEXT: push {r11, lr}
+; LINUX-NEXT: .pad #8
+; LINUX-NEXT: sub sp, sp, #8
+; LINUX-NEXT: ldr r0, .LCPI0_0
+; LINUX-NEXT: ldr r0, [r0]
+; LINUX-NEXT: str r0, [sp, #4]
+; LINUX-NEXT: mov r0, sp
+; LINUX-NEXT: bl capture
+; LINUX-NEXT: ldr r0, [sp, #4]
+; LINUX-NEXT: ldr r1, .LCPI0_0
+; LINUX-NEXT: ldr r1, [r1]
+; LINUX-NEXT: cmp r1, r0
+; LINUX-NEXT: addeq sp, sp, #8
+; LINUX-NEXT: popeq {r11, lr}
+; LINUX-NEXT: moveq pc, lr
+; LINUX-NEXT: .LBB0_1:
+; LINUX-NEXT: bl __stack_chk_fail
+; LINUX-NEXT: .p2align 2
+; LINUX-NEXT: @ %bb.2:
+; LINUX-NEXT: .LCPI0_0:
+; LINUX-NEXT: .long __stack_chk_guard
+;
+; OPENBSD-LABEL: func:
+; OPENBSD: @ %bb.0:
+; OPENBSD-NEXT: push {r4, lr}
+; OPENBSD-NEXT: sub sp, sp, #8
+; OPENBSD-NEXT: ldr r4, .LCPI0_0
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r0, .LCPI0_2
+; OPENBSD-NEXT: ldr r0, [r0]
+; OPENBSD-NEXT: str r0, [sp, #4]
+; OPENBSD-NEXT: mov r0, sp
+; OPENBSD-NEXT: bl capture
+; OPENBSD-NEXT: ldr r0, [r4]
+; OPENBSD-NEXT: ldr r1, [sp, #4]
+; OPENBSD-NEXT: cmp r0, r1
+; OPENBSD-NEXT: addeq sp, sp, #8
+; OPENBSD-NEXT: popeq {r4, lr}
+; OPENBSD-NEXT: moveq pc, lr
+; OPENBSD-NEXT: .LBB0_1: @ %CallStackCheckFailBlk
+; OPENBSD-NEXT: ldr r0, .LCPI0_1
+; OPENBSD-NEXT: bl __stack_smash_handler
+; OPENBSD-NEXT: .p2align 2
+; OPENBSD-NEXT: @ %bb.2:
+; OPENBSD-NEXT: .LCPI0_0:
+; OPENBSD-NEXT: .long __guard_local
+; OPENBSD-NEXT: .LCPI0_1:
+; OPENBSD-NEXT: .long .LSSH
+; OPENBSD-NEXT: .LCPI0_2:
+; OPENBSD-NEXT: .long __guard_local
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; EABI: {{.*}}
+; GNUEABI: {{.*}}
diff --git a/llvm/test/CodeGen/LoongArch/stack-protector-target.ll b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
new file mode 100644
index 0000000000000..ea4569e198d02
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/stack-protector-target.ll
@@ -0,0 +1,104 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=loongarch32-linux-gnu < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=loongarch64-linux-gnu < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=loongarch32-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=loongarch64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: addi.w $sp, $sp, -16
+; LINUX32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LINUX32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; LINUX32-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: st.w $a0, $sp, 4
+; LINUX32-NEXT: addi.w $a0, $sp, 0
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: ld.w $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX32-NEXT: ld.w $a1, $sp, 4
+; LINUX32-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; LINUX32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LINUX32-NEXT: addi.w $sp, $sp, 16
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: addi.d $sp, $sp, -32
+; LINUX64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; LINUX64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; LINUX64-NEXT: pcalau12i $fp, %pc_hi20(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: st.d $a0, $sp, 8
+; LINUX64-NEXT: addi.d $a0, $sp, 4
+; LINUX64-NEXT: pcaddu18i $ra, %call36(capture)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+; LINUX64-NEXT: ld.d $a0, $fp, %pc_lo12(__stack_chk_guard)
+; LINUX64-NEXT: ld.d $a1, $sp, 8
+; LINUX64-NEXT: bne $a0, $a1, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; LINUX64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; LINUX64-NEXT: addi.d $sp, $sp, 32
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: pcaddu18i $ra, %call36(__stack_chk_fail)
+; LINUX64-NEXT: jirl $ra, $ra, 0
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: addi.w $sp, $sp, -16
+; OPENBSD32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; OPENBSD32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; OPENBSD32-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: st.w $a0, $sp, 4
+; OPENBSD32-NEXT: addi.w $a0, $sp, 0
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: ld.w $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD32-NEXT: ld.w $a1, $sp, 4
+; OPENBSD32-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; OPENBSD32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; OPENBSD32-NEXT: addi.w $sp, $sp, 16
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD32-NEXT: addi.w $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: addi.d $sp, $sp, -32
+; OPENBSD64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; OPENBSD64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; OPENBSD64-NEXT: pcalau12i $fp, %pc_hi20(__guard_local)
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: st.d $a0, $sp, 8
+; OPENBSD64-NEXT: addi.d $a0, $sp, 4
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(capture)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+; OPENBSD64-NEXT: ld.d $a0, $fp, %pc_lo12(__guard_local)
+; OPENBSD64-NEXT: ld.d $a1, $sp, 8
+; OPENBSD64-NEXT: bne $a0, $a1, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; OPENBSD64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; OPENBSD64-NEXT: addi.d $sp, $sp, 32
+; OPENBSD64-NEXT: ret
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: pcalau12i $a0, %pc_hi20(.LSSH)
+; OPENBSD64-NEXT: addi.d $a0, $a0, %pc_lo12(.LSSH)
+; OPENBSD64-NEXT: pcaddu18i $ra, %call36(__stack_smash_handler)
+; OPENBSD64-NEXT: jirl $ra, $ra, 0
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/PowerPC/stack-protector-target.ll b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
new file mode 100644
index 0000000000000..03ffa0b4c142b
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/stack-protector-target.ll
@@ -0,0 +1,164 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=powerpc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=powerpc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+; RUN: llc -mtriple=powerpc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=powerpc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=powerpc-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX32 %s
+; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff < %s | FileCheck -check-prefix=AIX64 %s
+
+define void @func() sspreq nounwind {
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: mflr 0
+; OPENBSD32-NEXT: stwu 1, -32(1)
+; OPENBSD32-NEXT: stw 0, 36(1)
+; OPENBSD32-NEXT: stw 30, 24(1) # 4-byte Folded Spill
+; OPENBSD32-NEXT: lis 30, __guard_local@ha
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: stw 3, 20(1)
+; OPENBSD32-NEXT: addi 3, 1, 16
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: lwz 3, __guard_local@l(30)
+; OPENBSD32-NEXT: lwz 4, 20(1)
+; OPENBSD32-NEXT: cmplw 3, 4
+; OPENBSD32-NEXT: bne- 0, .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: lwz 30, 24(1) # 4-byte Folded Reload
+; OPENBSD32-NEXT: lwz 0, 36(1)
+; OPENBSD32-NEXT: addi 1, 1, 32
+; OPENBSD32-NEXT: mtlr 0
+; OPENBSD32-NEXT: blr
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: lis 3, .LSSH@ha
+; OPENBSD32-NEXT: la 3, .LSSH@l(3)
+; OPENBSD32-NEXT: bl __stack_smash_handler
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: mflr 0
+; OPENBSD64-NEXT: std 30, -16(1) # 8-byte Folded Spill
+; OPENBSD64-NEXT: stdu 1, -64(1)
+; OPENBSD64-NEXT: std 0, 80(1)
+; OPENBSD64-NEXT: addis 30, 2, __guard_local@toc@ha
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: std 3, 40(1)
+; OPENBSD64-NEXT: addi 3, 1, 36
+; OPENBSD64-NEXT: bl capture
+; OPENBSD64-NEXT: nop
+; OPENBSD64-NEXT: ld 3, __guard_local@toc@l(30)
+; OPENBSD64-NEXT: ld 4, 40(1)
+; OPENBSD64-NEXT: cmpld 3, 4
+; OPENBSD64-NEXT: bne- 0, .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: addi 1, 1, 64
+; OPENBSD64-NEXT: ld 0, 16(1)
+; OPENBSD64-NEXT: mtlr 0
+; OPENBSD64-NEXT: ld 30, -16(1) # 8-byte Folded Reload
+; OPENBSD64-NEXT: blr
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: addis 3, 2, .LSSH@toc@ha
+; OPENBSD64-NEXT: addi 3, 3, .LSSH@toc@l
+; OPENBSD64-NEXT: bl __stack_smash_handler
+; OPENBSD64-NEXT: nop
+;
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: mflr 0
+; LINUX32-NEXT: stwu 1, -16(1)
+; LINUX32-NEXT: stw 0, 20(1)
+; LINUX32-NEXT: lwz 3, -28680(2)
+; LINUX32-NEXT: stw 3, 12(1)
+; LINUX32-NEXT: addi 3, 1, 8
+; LINUX32-NEXT: bl capture
+; LINUX32-NEXT: lwz 3, 12(1)
+; LINUX32-NEXT: lwz 4, -28680(2)
+; LINUX32-NEXT: cmplw 4, 3
+; LINUX32-NEXT: bne 0, .LBB0_2
+; LINUX32-NEXT: # %bb.1:
+; LINUX32-NEXT: lwz 0, 20(1)
+; LINUX32-NEXT: addi 1, 1, 16
+; LINUX32-NEXT: mtlr 0
+; LINUX32-NEXT: blr
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: bl __stack_chk_fail
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: mflr 0
+; LINUX64-NEXT: stdu 1, -128(1)
+; LINUX64-NEXT: std 0, 144(1)
+; LINUX64-NEXT: ld 3, -28688(13)
+; LINUX64-NEXT: std 3, 120(1)
+; LINUX64-NEXT: addi 3, 1, 116
+; LINUX64-NEXT: bl capture
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ld 3, 120(1)
+; LINUX64-NEXT: ld 4, -28688(13)
+; LINUX64-NEXT: cmpld 4, 3
+; LINUX64-NEXT: bne 0, .LBB0_2
+; LINUX64-NEXT: # %bb.1:
+; LINUX64-NEXT: addi 1, 1, 128
+; LINUX64-NEXT: ld 0, 16(1)
+; LINUX64-NEXT: mtlr 0
+; LINUX64-NEXT: blr
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: bl __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; AIX32-LABEL: func:
+; AIX32: # %bb.0:
+; AIX32-NEXT: mflr 0
+; AIX32-NEXT: stwu 1, -80(1)
+; AIX32-NEXT: stw 0, 88(1)
+; AIX32-NEXT: stw 31, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT: lwz 31, L..C0(2) # @__ssp_canary_word
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: stw 3, 72(1)
+; AIX32-NEXT: addi 3, 1, 68
+; AIX32-NEXT: bl .capture[PR]
+; AIX32-NEXT: nop
+; AIX32-NEXT: lwz 3, 0(31)
+; AIX32-NEXT: lwz 4, 72(1)
+; AIX32-NEXT: cmplw 3, 4
+; AIX32-NEXT: bne 0, L..BB0_2
+; AIX32-NEXT: # %bb.1:
+; AIX32-NEXT: lwz 31, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT: addi 1, 1, 80
+; AIX32-NEXT: lwz 0, 8(1)
+; AIX32-NEXT: mtlr 0
+; AIX32-NEXT: blr
+; AIX32-NEXT: L..BB0_2:
+; AIX32-NEXT: bl .__stack_chk_fail[PR]
+; AIX32-NEXT: nop
+;
+; AIX64-LABEL: func:
+; AIX64: # %bb.0:
+; AIX64-NEXT: mflr 0
+; AIX64-NEXT: stdu 1, -144(1)
+; AIX64-NEXT: std 0, 160(1)
+; AIX64-NEXT: std 31, 136(1) # 8-byte Folded Spill
+; AIX64-NEXT: ld 31, L..C0(2) # @__ssp_canary_word
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: std 3, 128(1)
+; AIX64-NEXT: addi 3, 1, 124
+; AIX64-NEXT: bl .capture[PR]
+; AIX64-NEXT: nop
+; AIX64-NEXT: ld 3, 0(31)
+; AIX64-NEXT: ld 4, 128(1)
+; AIX64-NEXT: cmpld 3, 4
+; AIX64-NEXT: bne 0, L..BB0_2
+; AIX64-NEXT: # %bb.1:
+; AIX64-NEXT: ld 31, 136(1) # 8-byte Folded Reload
+; AIX64-NEXT: addi 1, 1, 144
+; AIX64-NEXT: ld 0, 16(1)
+; AIX64-NEXT: mtlr 0
+; AIX64-NEXT: blr
+; AIX64-NEXT: L..BB0_2:
+; AIX64-NEXT: bl .__stack_chk_fail[PR]
+; AIX64-NEXT: nop
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/RISCV/stack-protector-target.ll b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
index a4bd0e9ceac98..b01b044db5d6f 100644
--- a/llvm/test/CodeGen/RISCV/stack-protector-target.ll
+++ b/llvm/test/CodeGen/RISCV/stack-protector-target.ll
@@ -5,6 +5,7 @@
; RUN: llc -mtriple=riscv64-linux < %s | FileCheck --check-prefix=LINUX-RISCV64 %s
; RUN: llc -mtriple=riscv64-fuchsia < %s | FileCheck --check-prefix=FUCHSIA-RISCV64 %s
; RUN: llc -mtriple=riscv64-android < %s | FileCheck --check-prefix=ANDROID-RISCV64 %s
+; RUN: llc -mtriple=riscv64-openbsd < %s | FileCheck --check-prefix=OPENBSD-RISCV64 %s
define void @func() sspreq nounwind {
; LINUX-RISCV64-LABEL: func:
@@ -63,6 +64,29 @@ define void @func() sspreq nounwind {
; ANDROID-RISCV64-NEXT: ret
; ANDROID-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
; ANDROID-RISCV64-NEXT: call __stack_chk_fail
+;
+; OPENBSD-RISCV64-LABEL: func:
+; OPENBSD-RISCV64: # %bb.0:
+; OPENBSD-RISCV64-NEXT: addi sp, sp, -32
+; OPENBSD-RISCV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; OPENBSD-RISCV64-NEXT: lui s0, %hi(__guard_local)
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: sd a0, 8(sp)
+; OPENBSD-RISCV64-NEXT: addi a0, sp, 4
+; OPENBSD-RISCV64-NEXT: call capture
+; OPENBSD-RISCV64-NEXT: ld a0, %lo(__guard_local)(s0)
+; OPENBSD-RISCV64-NEXT: ld a1, 8(sp)
+; OPENBSD-RISCV64-NEXT: bne a0, a1, .LBB0_2
+; OPENBSD-RISCV64-NEXT: # %bb.1: # %SP_return
+; OPENBSD-RISCV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; OPENBSD-RISCV64-NEXT: addi sp, sp, 32
+; OPENBSD-RISCV64-NEXT: ret
+; OPENBSD-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD-RISCV64-NEXT: lui a0, %hi(.LSSH)
+; OPENBSD-RISCV64-NEXT: addi a0, a0, %lo(.LSSH)
+; OPENBSD-RISCV64-NEXT: call __stack_smash_handler
%1 = alloca i32, align 4
call void @capture(ptr %1)
ret void
diff --git a/llvm/test/CodeGen/SPARC/stack-protector-target.ll b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
new file mode 100644
index 0000000000000..f0e9aa8986ab8
--- /dev/null
+++ b/llvm/test/CodeGen/SPARC/stack-protector-target.ll
@@ -0,0 +1,141 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=sparc-unknown-linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=sparc-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS32 %s
+; RUN: llc -mtriple=sparc64-unknown-solaris < %s | FileCheck -check-prefixes=SOLARIS64 %s
+; RUN: llc -mtriple=sparc-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=sparc64-unknown-openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: ! %bb.0:
+; LINUX32-NEXT: save %sp, -104, %sp
+; LINUX32-NEXT: ld [%g7+20], %i0
+; LINUX32-NEXT: st %i0, [%fp+-4]
+; LINUX32-NEXT: call capture
+; LINUX32-NEXT: add %fp, -8, %o0
+; LINUX32-NEXT: ld [%fp+-4], %i0
+; LINUX32-NEXT: ld [%g7+20], %i1
+; LINUX32-NEXT: cmp %i1, %i0
+; LINUX32-NEXT: bne .LBB0_2
+; LINUX32-NEXT: nop
+; LINUX32-NEXT: ! %bb.1:
+; LINUX32-NEXT: ret
+; LINUX32-NEXT: restore
+; LINUX32-NEXT: .LBB0_2:
+; LINUX32-NEXT: call __stack_chk_fail
+; LINUX32-NEXT: nop
+;
+; LINUX64-LABEL: func:
+; LINUX64: .register %g7, #ignore
+; LINUX64-NEXT: ! %bb.0:
+; LINUX64-NEXT: save %sp, -192, %sp
+; LINUX64-NEXT: ldx [%g7+40], %i0
+; LINUX64-NEXT: stx %i0, [%fp+2039]
+; LINUX64-NEXT: call capture
+; LINUX64-NEXT: add %fp, 2035, %o0
+; LINUX64-NEXT: ldx [%fp+2039], %i0
+; LINUX64-NEXT: ldx [%g7+40], %i1
+; LINUX64-NEXT: cmp %i1, %i0
+; LINUX64-NEXT: bne %xcc, .LBB0_2
+; LINUX64-NEXT: nop
+; LINUX64-NEXT: ! %bb.1:
+; LINUX64-NEXT: ret
+; LINUX64-NEXT: restore
+; LINUX64-NEXT: .LBB0_2:
+; LINUX64-NEXT: call __stack_chk_fail
+; LINUX64-NEXT: nop
+;
+; SOLARIS32-LABEL: func:
+; SOLARIS32: ! %bb.0:
+; SOLARIS32-NEXT: save %sp, -104, %sp
+; SOLARIS32-NEXT: sethi %hi(__stack_chk_guard), %i0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i1
+; SOLARIS32-NEXT: st %i1, [%fp+-4]
+; SOLARIS32-NEXT: call capture
+; SOLARIS32-NEXT: add %fp, -8, %o0
+; SOLARIS32-NEXT: ld [%i0+%lo(__stack_chk_guard)], %i0
+; SOLARIS32-NEXT: ld [%fp+-4], %i1
+; SOLARIS32-NEXT: cmp %i0, %i1
+; SOLARIS32-NEXT: bne .LBB0_2
+; SOLARIS32-NEXT: nop
+; SOLARIS32-NEXT: ! %bb.1:
+; SOLARIS32-NEXT: ret
+; SOLARIS32-NEXT: restore
+; SOLARIS32-NEXT: .LBB0_2:
+; SOLARIS32-NEXT: call __stack_chk_fail
+; SOLARIS32-NEXT: nop
+;
+; SOLARIS64-LABEL: func:
+; SOLARIS64: ! %bb.0:
+; SOLARIS64-NEXT: save %sp, -192, %sp
+; SOLARIS64-NEXT: sethi %h44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: add %i0, %m44(__stack_chk_guard), %i0
+; SOLARIS64-NEXT: sllx %i0, 12, %i0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i1
+; SOLARIS64-NEXT: stx %i1, [%fp+2039]
+; SOLARIS64-NEXT: call capture
+; SOLARIS64-NEXT: add %fp, 2035, %o0
+; SOLARIS64-NEXT: ldx [%i0+%l44(__stack_chk_guard)], %i0
+; SOLARIS64-NEXT: ldx [%fp+2039], %i1
+; SOLARIS64-NEXT: cmp %i0, %i1
+; SOLARIS64-NEXT: bne %xcc, .LBB0_2
+; SOLARIS64-NEXT: nop
+; SOLARIS64-NEXT: ! %bb.1:
+; SOLARIS64-NEXT: ret
+; SOLARIS64-NEXT: restore
+; SOLARIS64-NEXT: .LBB0_2:
+; SOLARIS64-NEXT: call __stack_chk_fail
+; SOLARIS64-NEXT: nop
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: ! %bb.0:
+; OPENBSD32-NEXT: save %sp, -104, %sp
+; OPENBSD32-NEXT: sethi %hi(__guard_local), %i0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i1
+; OPENBSD32-NEXT: st %i1, [%fp+-4]
+; OPENBSD32-NEXT: call capture
+; OPENBSD32-NEXT: add %fp, -8, %o0
+; OPENBSD32-NEXT: ld [%i0+%lo(__guard_local)], %i0
+; OPENBSD32-NEXT: ld [%fp+-4], %i1
+; OPENBSD32-NEXT: cmp %i0, %i1
+; OPENBSD32-NEXT: bne .LBB0_2
+; OPENBSD32-NEXT: nop
+; OPENBSD32-NEXT: ! %bb.1: ! %SP_return
+; OPENBSD32-NEXT: ret
+; OPENBSD32-NEXT: restore
+; OPENBSD32-NEXT: .LBB0_2: ! %CallStackCheckFailBlk
+; OPENBSD32-NEXT: sethi %hi(.LSSH), %i0
+; OPENBSD32-NEXT: call __stack_smash_handler
+; OPENBSD32-NEXT: add %i0, %lo(.LSSH), %o0
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: ! %bb.0:
+; OPENBSD64-NEXT: save %sp, -192, %sp
+; OPENBSD64-NEXT: sethi %h44(__guard_local), %i0
+; OPENBSD64-NEXT: add %i0, %m44(__guard_local), %i0
+; OPENBSD64-NEXT: sllx %i0, 12, %i0
+; OPENBSD64-NEXT: ldx [%i0+%l44(__guard_local)], %i1
+; OPENBSD64-NEXT: stx %i1, [%fp+2039]
+; OPENBSD64-NEXT: call capture
+; OPENBSD64-NEXT: ...
[truncated]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
7dce16f removed a libcall for
STACKPROTECTOR_CHECK_FAIL from OpenBSD but added no tests.
Add a basic test copied from RISCV into all the backends on
the OpenBSD page of supported architectures before I potentially
break in in RuntimeLibcalls refactoring.