Skip to content

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

arsenm
Copy link
Contributor

@arsenm arsenm commented Jul 10, 2025

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.

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.
@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-powerpc

Author: Matt Arsenault (arsenm)

Changes

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.


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:

  • (added) llvm/test/CodeGen/ARM/stack-protector-target.ll (+68)
  • (added) llvm/test/CodeGen/LoongArch/stack-protector-target.ll (+104)
  • (added) llvm/test/CodeGen/PowerPC/stack-protector-target.ll (+164)
  • (modified) llvm/test/CodeGen/RISCV/stack-protector-target.ll (+24)
  • (added) llvm/test/CodeGen/SPARC/stack-protector-target.ll (+141)
  • (added) llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll (+81)
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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-loongarch

Author: Matt Arsenault (arsenm)

Changes

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.


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:

  • (added) llvm/test/CodeGen/ARM/stack-protector-target.ll (+68)
  • (added) llvm/test/CodeGen/LoongArch/stack-protector-target.ll (+104)
  • (added) llvm/test/CodeGen/PowerPC/stack-protector-target.ll (+164)
  • (modified) llvm/test/CodeGen/RISCV/stack-protector-target.ll (+24)
  • (added) llvm/test/CodeGen/SPARC/stack-protector-target.ll (+141)
  • (added) llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll (+81)
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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-arm

Author: Matt Arsenault (arsenm)

Changes

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.


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:

  • (added) llvm/test/CodeGen/ARM/stack-protector-target.ll (+68)
  • (added) llvm/test/CodeGen/LoongArch/stack-protector-target.ll (+104)
  • (added) llvm/test/CodeGen/PowerPC/stack-protector-target.ll (+164)
  • (modified) llvm/test/CodeGen/RISCV/stack-protector-target.ll (+24)
  • (added) llvm/test/CodeGen/SPARC/stack-protector-target.ll (+141)
  • (added) llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll (+81)
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]

Copy link
Contributor

@ilovepi ilovepi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants