| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; REQUIRES: arm-registered-target, x86-registered-target | |
| ; RUN: opt -mtriple=armv7-unknown-linux-gnueabi -enable-selectiondag-sp=false -passes='require<libcall-lowering-info>,stack-protector' -S %s | FileCheck --check-prefix=ARM %s | |
| ; RUN: opt -mtriple=x86_64-unknown-openbsd -passes='require<libcall-lowering-info>,stack-protector' -S %s | FileCheck --check-prefix=OPENBSD %s | |
| define void @foo() sspreq { | |
| ; ARM-LABEL: define void @foo( | |
| ; ARM-SAME: ) #[[ATTR0:[0-9]+]] { | |
| ; ARM-NEXT: [[STACKGUARDSLOT:%.*]] = alloca ptr, align 4 | |
| ; ARM-NEXT: [[TMP1:%.*]] = call ptr @llvm.stackguard() | |
| ; ARM-NEXT: call void @llvm.stackprotector(ptr [[TMP1]], ptr [[STACKGUARDSLOT]]) | |
| ; ARM-NEXT: [[A:%.*]] = alloca i32, align 4 | |
| ; ARM-NEXT: call void @capture(ptr [[A]]) | |
| ; ARM-NEXT: [[TMP2:%.*]] = call ptr @llvm.stackguard() | |
| ; ARM-NEXT: [[TMP3:%.*]] = load volatile ptr, ptr [[STACKGUARDSLOT]], align 4 | |
| ; ARM-NEXT: [[TMP4:%.*]] = icmp eq ptr [[TMP2]], [[TMP3]] | |
| ; ARM-NEXT: br i1 [[TMP4]], label %[[SP_RETURN:.*]], label %[[CALLSTACKCHECKFAILBLK:.*]], !prof [[PROF0:![0-9]+]] | |
| ; ARM: [[SP_RETURN]]: | |
| ; ARM-NEXT: ret void | |
| ; ARM: [[CALLSTACKCHECKFAILBLK]]: | |
| ; ARM-NEXT: call arm_aapcscc void @__stack_chk_fail() #[[ATTR3:[0-9]+]] | |
| ; ARM-NEXT: unreachable | |
| ; | |
| ; OPENBSD-LABEL: define void @foo( | |
| ; OPENBSD-SAME: ) #[[ATTR0:[0-9]+]] { | |
| ; OPENBSD-NEXT: [[STACKGUARDSLOT:%.*]] = alloca ptr, align 8 | |
| ; OPENBSD-NEXT: [[STACKGUARD:%.*]] = load volatile ptr, ptr @__guard_local, align 8 | |
| ; OPENBSD-NEXT: call void @llvm.stackprotector(ptr [[STACKGUARD]], ptr [[STACKGUARDSLOT]]) | |
| ; OPENBSD-NEXT: [[A:%.*]] = alloca i32, align 4 | |
| ; OPENBSD-NEXT: call void @capture(ptr [[A]]) | |
| ; OPENBSD-NEXT: [[STACKGUARD1:%.*]] = load volatile ptr, ptr @__guard_local, align 8 | |
| ; OPENBSD-NEXT: [[TMP1:%.*]] = load volatile ptr, ptr [[STACKGUARDSLOT]], align 8 | |
| ; OPENBSD-NEXT: [[TMP2:%.*]] = icmp eq ptr [[STACKGUARD1]], [[TMP1]] | |
| ; OPENBSD-NEXT: br i1 [[TMP2]], label %[[SP_RETURN:.*]], label %[[CALLSTACKCHECKFAILBLK:.*]], !prof [[PROF0:![0-9]+]] | |
| ; OPENBSD: [[SP_RETURN]]: | |
| ; OPENBSD-NEXT: ret void | |
| ; OPENBSD: [[CALLSTACKCHECKFAILBLK]]: | |
| ; OPENBSD-NEXT: call void @__stack_smash_handler(ptr @SSH) #[[ATTR3:[0-9]+]] | |
| ; OPENBSD-NEXT: unreachable | |
| ; | |
| %a = alloca i32, align 4 | |
| call void @capture(ptr %a) | |
| ret void | |
| } | |
| declare void @capture(ptr) | |
| ;. | |
| ; ARM: [[PROF0]] = !{!"branch_weights", i32 2147481600, i32 2048} | |
| ;. | |
| ; OPENBSD: [[PROF0]] = !{!"branch_weights", i32 2147481600, i32 2048} | |
| ;. |