Skip to content

Commit

Permalink
[SSP] [1/3] Revert "StackProtector: Use PointerMayBeCaptured"
Browse files Browse the repository at this point in the history
"Captured" and "relevant to Stack Protector" are not the same thing.

This reverts commit f29366b.
aka r363169.

Differential Revision: https://reviews.llvm.org/D67842

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373216 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
pogo59 committed Sep 30, 2019
1 parent 1b4ffe0 commit 4d6c2ab
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 148 deletions.
6 changes: 6 additions & 0 deletions include/llvm/CodeGen/StackProtector.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ class StackProtector : public FunctionPass {
/// protection when -fstack-protection is used.
unsigned SSPBufferSize = 0;

/// VisitedPHIs - The set of PHI nodes visited when determining
/// if a variable's reference has been taken. This set
/// is maintained to ensure we don't visit the same PHI node multiple
/// times.
SmallPtrSet<const PHINode *, 16> VisitedPHIs;

// A prologue is generated.
bool HasPrologue = false;

Expand Down
39 changes: 35 additions & 4 deletions lib/CodeGen/StackProtector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/EHPersonalities.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/CodeGen/Passes.h"
Expand Down Expand Up @@ -157,6 +156,40 @@ bool StackProtector::ContainsProtectableArray(Type *Ty, bool &IsLarge,
return NeedsProtector;
}

bool StackProtector::HasAddressTaken(const Instruction *AI) {
for (const User *U : AI->users()) {
if (const StoreInst *SI = dyn_cast<StoreInst>(U)) {
if (AI == SI->getValueOperand())
return true;
} else if (const PtrToIntInst *SI = dyn_cast<PtrToIntInst>(U)) {
if (AI == SI->getOperand(0))
return true;
} else if (const CallInst *CI = dyn_cast<CallInst>(U)) {
// Ignore intrinsics that are not calls. TODO: Use isLoweredToCall().
if (!isa<DbgInfoIntrinsic>(CI) && !CI->isLifetimeStartOrEnd())
return true;
} else if (isa<InvokeInst>(U)) {
return true;
} else if (const SelectInst *SI = dyn_cast<SelectInst>(U)) {
if (HasAddressTaken(SI))
return true;
} else if (const PHINode *PN = dyn_cast<PHINode>(U)) {
// Keep track of what PHI nodes we have already visited to ensure
// they are only visited once.
if (VisitedPHIs.insert(PN).second)
if (HasAddressTaken(PN))
return true;
} else if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
if (HasAddressTaken(GEP))
return true;
} else if (const BitCastInst *BI = dyn_cast<BitCastInst>(U)) {
if (HasAddressTaken(BI))
return true;
}
}
return false;
}

/// Search for the first call to the llvm.stackprotector intrinsic and return it
/// if present.
static const CallInst *findStackProtectorIntrinsic(Function &F) {
Expand Down Expand Up @@ -264,9 +297,7 @@ bool StackProtector::RequiresStackProtector() {
continue;
}

if (Strong && PointerMayBeCaptured(AI,
/* ReturnCaptures */ false,
/* StoreCaptures */ true)) {
if (Strong && HasAddressTaken(AI)) {
++NumAddrTaken;
Layout.insert(std::make_pair(AI, MachineFrameInfo::SSPLK_AddrOf));
ORE.emit([&]() {
Expand Down
4 changes: 2 additions & 2 deletions test/CodeGen/X86/stack-protector.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4087,8 +4087,8 @@ define i32 @IgnoreIntrinsicTest() #1 {
%1 = alloca i32, align 4
%2 = bitcast i32* %1 to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2)
store i32 1, i32* %1, align 4
%3 = load i32, i32* %1, align 4
store volatile i32 1, i32* %1, align 4
%3 = load volatile i32, i32* %1, align 4
%4 = mul nsw i32 %3, 42
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2)
ret i32 %4
Expand Down
139 changes: 0 additions & 139 deletions test/Transforms/StackProtector/X86/captures.ll

This file was deleted.

2 changes: 0 additions & 2 deletions test/Transforms/StackProtector/X86/lit.local.cfg

This file was deleted.

1 change: 0 additions & 1 deletion tools/opt/opt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,6 @@ int main(int argc, char **argv) {
initializeDwarfEHPreparePass(Registry);
initializeSafeStackLegacyPassPass(Registry);
initializeSjLjEHPreparePass(Registry);
initializeStackProtectorPass(Registry);
initializePreISelIntrinsicLoweringLegacyPassPass(Registry);
initializeGlobalMergePass(Registry);
initializeIndirectBrExpandPassPass(Registry);
Expand Down

0 comments on commit 4d6c2ab

Please sign in to comment.