[llvm] r276712 - [safestack] Fix stack guard live range.

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 10 13:14:21 PDT 2016


Merged to 3.9 in r278283, as suggested on PR28863.

On Mon, Jul 25, 2016 at 5:05 PM, Evgeniy Stepanov via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: eugenis
> Date: Mon Jul 25 19:05:14 2016
> New Revision: 276712
>
> URL: http://llvm.org/viewvc/llvm-project?rev=276712&view=rev
> Log:
> [safestack] Fix stack guard live range.
>
> Stack guard slot is live throughout the function.
>
> Added:
>     llvm/trunk/test/Transforms/SafeStack/coloring-ssp.ll
> Modified:
>     llvm/trunk/lib/CodeGen/SafeStack.cpp
>     llvm/trunk/lib/CodeGen/SafeStackColoring.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SafeStack.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SafeStack.cpp?rev=276712&r1=276711&r2=276712&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SafeStack.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SafeStack.cpp Mon Jul 25 19:05:14 2016
> @@ -530,7 +530,7 @@ Value *SafeStack::moveStaticAllocasToUns
>      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) {
>
> Modified: llvm/trunk/lib/CodeGen/SafeStackColoring.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SafeStackColoring.cpp?rev=276712&r1=276711&r2=276712&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SafeStackColoring.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SafeStackColoring.cpp Mon Jul 25 19:05:14 2016
> @@ -25,7 +25,9 @@ static cl::opt<bool> ClColoring("safe-st
>                                  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) {
>
> Added: llvm/trunk/test/Transforms/SafeStack/coloring-ssp.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SafeStack/coloring-ssp.ll?rev=276712&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/SafeStack/coloring-ssp.ll (added)
> +++ llvm/trunk/test/Transforms/SafeStack/coloring-ssp.ll Mon Jul 25 19:05:14 2016
> @@ -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*)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list