1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00

[safestack] Fix stack guard live range.

Stack guard slot is live throughout the function.

llvm-svn: 276712
This commit is contained in:
Evgeniy Stepanov 2016-07-26 00:05:14 +00:00
parent 11e49d70ad
commit 33da06a052
3 changed files with 38 additions and 2 deletions

View File

@ -530,7 +530,7 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack(
unsigned Align =
std::max(DL->getPrefTypeAlignment(Ty), StackGuardSlot->getAlignment());
SSL.addObject(StackGuardSlot, getStaticAllocaAllocationSize(StackGuardSlot),
Align, SSC.getLiveRange(StackGuardSlot));
Align, SSC.getFullLiveRange());
}
for (Argument *Arg : ByValArguments) {

View File

@ -25,7 +25,9 @@ static cl::opt<bool> ClColoring("safe-stack-coloring",
cl::Hidden, cl::init(true));
const StackColoring::LiveRange &StackColoring::getLiveRange(AllocaInst *AI) {
return LiveRanges[AllocaNumbering[AI]];
const auto IT = AllocaNumbering.find(AI);
assert(IT != AllocaNumbering.end());
return LiveRanges[IT->second];
}
bool StackColoring::readMarker(Instruction *I, bool *IsStart) {

View File

@ -0,0 +1,34 @@
; RUN: opt -safe-stack -S -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s
; %x and %y share a stack slot between them, but not with the stack guard.
define void @f() safestack sspreq {
; CHECK-LABEL: define void @f
entry:
; CHECK: %[[USP:.*]] = load i8*, i8** @__safestack_unsafe_stack_ptr
; CHECK: getelementptr i8, i8* %[[USP]], i32 -16
; CHECK: %[[A:.*]] = getelementptr i8, i8* %[[USP]], i32 -8
; CHECK: %[[StackGuardSlot:.*]] = bitcast i8* %[[A]] to i8**
; CHECK: store i8* %{{.*}}, i8** %[[StackGuardSlot]]
%x = alloca i64, align 8
%y = alloca i64, align 8
%x0 = bitcast i64* %x to i8*
%y0 = bitcast i64* %y to i8*
call void @llvm.lifetime.start(i64 -1, i8* %x0)
; CHECK: getelementptr i8, i8* %[[USP]], i32 -16
call void @capture64(i64* %x)
call void @llvm.lifetime.end(i64 -1, i8* %x0)
call void @llvm.lifetime.start(i64 -1, i8* %y0)
; CHECK: getelementptr i8, i8* %[[USP]], i32 -16
call void @capture64(i64* %y)
call void @llvm.lifetime.end(i64 -1, i8* %y0)
ret void
}
declare void @llvm.lifetime.start(i64, i8* nocapture)
declare void @llvm.lifetime.end(i64, i8* nocapture)
declare void @capture64(i64*)