diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-04-11 22:27:48 +0000 | 
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-04-11 22:27:48 +0000 | 
| commit | f17120a85ff619f2420a6b86a05bed5c5d816353 (patch) | |
| tree | 2971d0e35456c1cbea475d571eb3e9bcffacbb32 /llvm/test/Transforms/SafeStack/X86 | |
| parent | a6dea06fe3d74eb75ab58f14d7b87f068f043de0 (diff) | |
| download | bcm5719-llvm-f17120a85ff619f2420a6b86a05bed5c5d816353.tar.gz bcm5719-llvm-f17120a85ff619f2420a6b86a05bed5c5d816353.zip  | |
[safestack] Add canary to unsafe stack frames
Add StackProtector to SafeStack. This adds limited protection against
data corruption in the caller frame. Current implementation treats
all stack protector levels as -fstack-protector-all.
llvm-svn: 266004
Diffstat (limited to 'llvm/test/Transforms/SafeStack/X86')
| -rw-r--r-- | llvm/test/Transforms/SafeStack/X86/abi_ssp.ll | 19 | ||||
| -rw-r--r-- | llvm/test/Transforms/SafeStack/X86/ssp.ll | 30 | 
2 files changed, 49 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SafeStack/X86/abi_ssp.ll b/llvm/test/Transforms/SafeStack/X86/abi_ssp.ll new file mode 100644 index 00000000000..ba4ced5b882 --- /dev/null +++ b/llvm/test/Transforms/SafeStack/X86/abi_ssp.ll @@ -0,0 +1,19 @@ +; RUN: opt -safe-stack -S -mtriple=i686-pc-linux-gnu < %s -o - | FileCheck --check-prefix=TLS --check-prefix=TLS32 %s +; RUN: opt -safe-stack -S -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=TLS --check-prefix=TLS64 %s +; RUN: opt -safe-stack -S -mtriple=i686-linux-android < %s -o - | FileCheck --check-prefix=TLS --check-prefix=TLS32 %s +; RUN: opt -safe-stack -S -mtriple=x86_64-linux-android < %s -o - | FileCheck --check-prefix=TLS --check-prefix=TLS64 %s + +define void @foo() safestack sspreq { +entry: +; TLS32: %[[StackGuard:.*]] = load i8*, i8* addrspace(256)* inttoptr (i32 20 to i8* addrspace(256)*) +; TLS64: %[[StackGuard:.*]] = load i8*, i8* addrspace(257)* inttoptr (i32 40 to i8* addrspace(257)*) +; TLS:   store i8* %[[StackGuard]], i8** %[[StackGuardSlot:.*]] +  %a = alloca i8, align 1 +  call void @Capture(i8* %a) + +; TLS: %[[A:.*]] = load i8*, i8** %[[StackGuardSlot]] +; TLS: icmp ne i8* %[[StackGuard]], %[[A]] +  ret void +} + +declare void @Capture(i8*) diff --git a/llvm/test/Transforms/SafeStack/X86/ssp.ll b/llvm/test/Transforms/SafeStack/X86/ssp.ll new file mode 100644 index 00000000000..0e28878c547 --- /dev/null +++ b/llvm/test/Transforms/SafeStack/X86/ssp.ll @@ -0,0 +1,30 @@ +; RUN: opt -safe-stack -S -mtriple=x86_64-unknown < %s -o - | FileCheck %s + +define void @foo() safestack sspreq { +entry: +; CHECK: %[[USP:.*]] = load i8*, i8** @__safestack_unsafe_stack_ptr +; CHECK: %[[USST:.*]] = getelementptr i8, i8* %[[USP]], i32 -16 +; CHECK: store i8* %[[USST]], i8** @__safestack_unsafe_stack_ptr + +; CHECK: %[[A:.*]] = getelementptr i8, i8* %[[USP]], i32 -8 +; CHECK: %[[StackGuardSlot:.*]] = bitcast i8* %[[A]] to i8** +; CHECK: %[[StackGuard:.*]] = load i8*, i8** @__stack_chk_guard +; CHECK: store i8* %[[StackGuard]], i8** %[[StackGuardSlot]] +  %a = alloca i8, align 1 + +; CHECK: call void @Capture +  call void @Capture(i8* %a) + +; CHECK: %[[B:.*]] = load i8*, i8** %[[StackGuardSlot]] +; CHECK: %[[COND:.*]] = icmp ne i8* %[[StackGuard]], %[[B]] +; CHECK: br i1 %[[COND]], {{.*}} !prof + +; CHECK:      call void @__stack_chk_fail() +; CHECK-NEXT: unreachable + +; CHECK:      store i8* %[[USP]], i8** @__safestack_unsafe_stack_ptr +; CHECK-NEXT: ret void +  ret void +} + +declare void @Capture(i8*)  | 

