[llvm] 3d50e1f - RuntimeLibcalls: Add some tests for OpenBSD stack protectors (#147888)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 14 23:50:58 PDT 2025
Author: Matt Arsenault
Date: 2025-07-15T15:50:54+09:00
New Revision: 3d50e1f3e83eaa77a09ab8336fac45a52ee9c1e5
URL: https://github.com/llvm/llvm-project/commit/3d50e1f3e83eaa77a09ab8336fac45a52ee9c1e5
DIFF: https://github.com/llvm/llvm-project/commit/3d50e1f3e83eaa77a09ab8336fac45a52ee9c1e5.diff
LOG: RuntimeLibcalls: Add some tests for OpenBSD stack protectors (#147888)
7dce16f69dc3e26cb74d5ad38b0648a6f47f9640 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.
Added:
llvm/test/CodeGen/ARM/stack-protector-target.ll
llvm/test/CodeGen/LoongArch/stack-protector-target.ll
llvm/test/CodeGen/PowerPC/stack-protector-target.ll
llvm/test/CodeGen/SPARC/stack-protector-target.ll
llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll
Modified:
llvm/test/CodeGen/RISCV/stack-protector-target.ll
Removed:
################################################################################
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 at ha
+; OPENBSD32-NEXT: lwz 3, __guard_local at l(30)
+; OPENBSD32-NEXT: stw 3, 20(1)
+; OPENBSD32-NEXT: addi 3, 1, 16
+; OPENBSD32-NEXT: bl capture
+; OPENBSD32-NEXT: lwz 3, __guard_local at 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 at ha
+; OPENBSD32-NEXT: la 3, .LSSH at 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 at toc@ha
+; OPENBSD64-NEXT: ld 3, __guard_local at 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 at 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 at toc@ha
+; OPENBSD64-NEXT: addi 3, 3, .LSSH at 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: add %fp, 2035, %o0
+; OPENBSD64-NEXT: ldx [%i0+%l44(__guard_local)], %i0
+; OPENBSD64-NEXT: ldx [%fp+2039], %i1
+; OPENBSD64-NEXT: cmp %i0, %i1
+; OPENBSD64-NEXT: bne %xcc, .LBB0_2
+; OPENBSD64-NEXT: nop
+; OPENBSD64-NEXT: ! %bb.1: ! %SP_return
+; OPENBSD64-NEXT: ret
+; OPENBSD64-NEXT: restore
+; OPENBSD64-NEXT: .LBB0_2: ! %CallStackCheckFailBlk
+; OPENBSD64-NEXT: sethi %h44(.LSSH), %i0
+; OPENBSD64-NEXT: add %i0, %m44(.LSSH), %i0
+; OPENBSD64-NEXT: sllx %i0, 12, %i0
+; OPENBSD64-NEXT: call __stack_smash_handler
+; OPENBSD64-NEXT: add %i0, %l44(.LSSH), %o0
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
diff --git a/llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll b/llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll
new file mode 100644
index 0000000000000..06382c6bbbbed
--- /dev/null
+++ b/llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll
@@ -0,0 +1,81 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=i386--linux < %s | FileCheck -check-prefix=LINUX32 %s
+; RUN: llc -mtriple=x86_64--linux < %s | FileCheck -check-prefix=LINUX64 %s
+; RUN: llc -mtriple=i386--openbsd < %s | FileCheck -check-prefix=OPENBSD32 %s
+; RUN: llc -mtriple=x86_64--openbsd < %s | FileCheck -check-prefix=OPENBSD64 %s
+
+define void @func() sspreq nounwind {
+; LINUX32-LABEL: func:
+; LINUX32: # %bb.0:
+; LINUX32-NEXT: subl $12, %esp
+; LINUX32-NEXT: movl %gs:20, %eax
+; LINUX32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX32-NEXT: leal {{[0-9]+}}(%esp), %eax
+; LINUX32-NEXT: movl %eax, (%esp)
+; LINUX32-NEXT: calll capture at PLT
+; LINUX32-NEXT: movl %gs:20, %eax
+; LINUX32-NEXT: cmpl {{[0-9]+}}(%esp), %eax
+; LINUX32-NEXT: jne .LBB0_2
+; LINUX32-NEXT: # %bb.1: # %SP_return
+; LINUX32-NEXT: addl $12, %esp
+; LINUX32-NEXT: retl
+; LINUX32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; LINUX32-NEXT: calll __stack_chk_fail at PLT
+;
+; LINUX64-LABEL: func:
+; LINUX64: # %bb.0:
+; LINUX64-NEXT: subq $24, %rsp
+; LINUX64-NEXT: movq %fs:40, %rax
+; LINUX64-NEXT: movq %rax, {{[0-9]+}}(%rsp)
+; LINUX64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; LINUX64-NEXT: callq capture at PLT
+; LINUX64-NEXT: movq %fs:40, %rax
+; LINUX64-NEXT: cmpq {{[0-9]+}}(%rsp), %rax
+; LINUX64-NEXT: jne .LBB0_2
+; LINUX64-NEXT: # %bb.1: # %SP_return
+; LINUX64-NEXT: addq $24, %rsp
+; LINUX64-NEXT: retq
+; LINUX64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; LINUX64-NEXT: callq __stack_chk_fail at PLT
+;
+; OPENBSD32-LABEL: func:
+; OPENBSD32: # %bb.0:
+; OPENBSD32-NEXT: subl $8, %esp
+; OPENBSD32-NEXT: movl __guard_local, %eax
+; OPENBSD32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; OPENBSD32-NEXT: movl %esp, %eax
+; OPENBSD32-NEXT: pushl %eax
+; OPENBSD32-NEXT: calll capture at PLT
+; OPENBSD32-NEXT: addl $4, %esp
+; OPENBSD32-NEXT: movl __guard_local, %eax
+; OPENBSD32-NEXT: cmpl {{[0-9]+}}(%esp), %eax
+; OPENBSD32-NEXT: jne .LBB0_2
+; OPENBSD32-NEXT: # %bb.1: # %SP_return
+; OPENBSD32-NEXT: addl $8, %esp
+; OPENBSD32-NEXT: retl
+; OPENBSD32-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD32-NEXT: pushl $.LSSH
+; OPENBSD32-NEXT: calll __stack_smash_handler at PLT
+;
+; OPENBSD64-LABEL: func:
+; OPENBSD64: # %bb.0:
+; OPENBSD64-NEXT: subq $24, %rsp
+; OPENBSD64-NEXT: movq __guard_local(%rip), %rax
+; OPENBSD64-NEXT: movq %rax, {{[0-9]+}}(%rsp)
+; OPENBSD64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; OPENBSD64-NEXT: callq capture at PLT
+; OPENBSD64-NEXT: movq __guard_local(%rip), %rax
+; OPENBSD64-NEXT: cmpq {{[0-9]+}}(%rsp), %rax
+; OPENBSD64-NEXT: jne .LBB0_2
+; OPENBSD64-NEXT: # %bb.1: # %SP_return
+; OPENBSD64-NEXT: addq $24, %rsp
+; OPENBSD64-NEXT: retq
+; OPENBSD64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; OPENBSD64-NEXT: movl $.LSSH, %edi
+; OPENBSD64-NEXT: callq __stack_smash_handler at PLT
+ %alloca = alloca i32, align 4
+ call void @capture(ptr %alloca)
+ ret void
+}
+
+declare void @capture(ptr)
More information about the llvm-commits
mailing list