mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
[SSP] [1/3] Revert "StackProtector: Use PointerMayBeCaptured"
"Captured" and "relevant to Stack Protector" are not the same thing. This reverts commit f29366b1f594f48465c5a2754bcffac6d70fd0b1. 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
This commit is contained in:
@@ -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"
|
||||
@@ -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) {
|
||||
@@ -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([&]() {
|
||||
|
||||
Reference in New Issue
Block a user