[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