From 20e81d517258754f403f3df16b3c5f86d487d195 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 10 Jul 2025 00:05:00 +0900 Subject: [PATCH] RuntimeLibcalls: Add some tests for OpenBSD stack protectors 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. --- .../CodeGen/ARM/stack-protector-target.ll | 68 ++++++++ .../LoongArch/stack-protector-target.ll | 104 +++++++++++ .../CodeGen/PowerPC/stack-protector-target.ll | 164 ++++++++++++++++++ .../CodeGen/RISCV/stack-protector-target.ll | 24 +++ .../CodeGen/SPARC/stack-protector-target.ll | 141 +++++++++++++++ .../X86/stack-protector-target-openbsd.ll | 81 +++++++++ 6 files changed, 582 insertions(+) create mode 100644 llvm/test/CodeGen/ARM/stack-protector-target.ll create mode 100644 llvm/test/CodeGen/LoongArch/stack-protector-target.ll create mode 100644 llvm/test/CodeGen/PowerPC/stack-protector-target.ll create mode 100644 llvm/test/CodeGen/SPARC/stack-protector-target.ll create mode 100644 llvm/test/CodeGen/X86/stack-protector-target-openbsd.ll 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: 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@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@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@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@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@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@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@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@PLT + %alloca = alloca i32, align 4 + call void @capture(ptr %alloca) + ret void +} + +declare void @capture(ptr)