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
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions llvm/test/CodeGen/ARM/stack-protector-target.ll
Original file line number Diff line number Diff line change
@@ -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: {{.*}}
104 changes: 104 additions & 0 deletions llvm/test/CodeGen/LoongArch/stack-protector-target.ll
Original file line number Diff line number Diff line change
@@ -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)
164 changes: 164 additions & 0 deletions llvm/test/CodeGen/PowerPC/stack-protector-target.ll
Original file line number Diff line number Diff line change
@@ -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)
24 changes: 24 additions & 0 deletions llvm/test/CodeGen/RISCV/stack-protector-target.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
Loading
Loading