mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Revert "(HEAD -> master, origin/master, arcpatch-D37582) CodeGen: Remove pipeline dependencies on StackProtector; NFC"
This was triggering pass scheduling failures. This reverts commit r336929. llvm-svn: 336934
This commit is contained in:
parent
01c5858960
commit
23f0e4e8ab
@ -70,8 +70,6 @@ public:
|
||||
.set(MachineFunctionProperties::Property::RegBankSelected);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
};
|
||||
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AnalysisUsage;
|
||||
class MachineFunction;
|
||||
class MachineInstr;
|
||||
class MachineOperand;
|
||||
@ -103,10 +102,5 @@ MachineInstr *getOpcodeDef(unsigned Opcode, unsigned Reg,
|
||||
|
||||
/// Returns an APFloat from Val converted to the appropriate size.
|
||||
APFloat getAPFloatFromSize(double Val, unsigned Size);
|
||||
|
||||
/// Modify analysis usage so it preserves passes required for the SelectionDAG
|
||||
/// fallback.
|
||||
void getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU);
|
||||
|
||||
} // End namespace llvm.
|
||||
#endif
|
||||
|
@ -87,21 +87,7 @@ public:
|
||||
///
|
||||
/// Abstract Stack Frame Information
|
||||
class MachineFrameInfo {
|
||||
public:
|
||||
/// Stack Smashing Protection (SSP) rules require that vulnerable stack
|
||||
/// allocations are located close the stack protector.
|
||||
enum SSPLayoutKind {
|
||||
SSPLK_None, ///< Did not trigger a stack protector. No effect on data
|
||||
///< layout.
|
||||
SSPLK_LargeArray, ///< Array or nested array >= SSP-buffer-size. Closest
|
||||
///< to the stack protector.
|
||||
SSPLK_SmallArray, ///< Array or nested array < SSP-buffer-size. 2nd closest
|
||||
///< to the stack protector.
|
||||
SSPLK_AddrOf ///< The address of this allocation is exposed and
|
||||
///< triggered protection. 3rd closest to the protector.
|
||||
};
|
||||
|
||||
private:
|
||||
// Represent a single object allocated on the stack.
|
||||
struct StackObject {
|
||||
// The offset of this object from the stack pointer on entry to
|
||||
@ -162,15 +148,12 @@ private:
|
||||
/// If true, the object has been zero-extended.
|
||||
bool isSExt = false;
|
||||
|
||||
uint8_t SSPLayout;
|
||||
|
||||
StackObject(uint64_t Size, unsigned Alignment, int64_t SPOffset,
|
||||
bool IsImmutable, bool IsSpillSlot, const AllocaInst *Alloca,
|
||||
bool IsAliased, uint8_t StackID = 0)
|
||||
: SPOffset(SPOffset), Size(Size), Alignment(Alignment),
|
||||
isImmutable(IsImmutable), isSpillSlot(IsSpillSlot),
|
||||
StackID(StackID), Alloca(Alloca), isAliased(IsAliased),
|
||||
SSPLayout(SSPLK_None) {}
|
||||
StackID(StackID), Alloca(Alloca), isAliased(IsAliased) {}
|
||||
};
|
||||
|
||||
/// The alignment of the stack.
|
||||
@ -505,20 +488,6 @@ public:
|
||||
Objects[ObjectIdx+NumFixedObjects].SPOffset = SPOffset;
|
||||
}
|
||||
|
||||
SSPLayoutKind getObjectSSPLayout(int ObjectIdx) const {
|
||||
assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
|
||||
"Invalid Object Idx!");
|
||||
return (SSPLayoutKind)Objects[ObjectIdx+NumFixedObjects].SSPLayout;
|
||||
}
|
||||
|
||||
void setObjectSSPLayout(int ObjectIdx, SSPLayoutKind Kind) {
|
||||
assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
|
||||
"Invalid Object Idx!");
|
||||
assert(!isDeadObjectIndex(ObjectIdx) &&
|
||||
"Setting SSP layout for a dead object?");
|
||||
Objects[ObjectIdx+NumFixedObjects].SSPLayout = Kind;
|
||||
}
|
||||
|
||||
/// Return the number of bytes that must be allocated to hold
|
||||
/// all of the fixed size frame objects. This is only valid after
|
||||
/// Prolog/Epilog code insertion has finalized the stack frame layout.
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/ValueMap.h"
|
||||
#include "llvm/Pass.h"
|
||||
@ -36,11 +35,24 @@ class TargetMachine;
|
||||
class Type;
|
||||
|
||||
class StackProtector : public FunctionPass {
|
||||
private:
|
||||
/// A mapping of AllocaInsts to their required SSP layout.
|
||||
using SSPLayoutMap = DenseMap<const AllocaInst *,
|
||||
MachineFrameInfo::SSPLayoutKind>;
|
||||
public:
|
||||
/// SSPLayoutKind. Stack Smashing Protection (SSP) rules require that
|
||||
/// vulnerable stack allocations are located close the stack protector.
|
||||
enum SSPLayoutKind {
|
||||
SSPLK_None, ///< Did not trigger a stack protector. No effect on data
|
||||
///< layout.
|
||||
SSPLK_LargeArray, ///< Array or nested array >= SSP-buffer-size. Closest
|
||||
///< to the stack protector.
|
||||
SSPLK_SmallArray, ///< Array or nested array < SSP-buffer-size. 2nd closest
|
||||
///< to the stack protector.
|
||||
SSPLK_AddrOf ///< The address of this allocation is exposed and
|
||||
///< triggered protection. 3rd closest to the protector.
|
||||
};
|
||||
|
||||
/// A mapping of AllocaInsts to their required SSP layout.
|
||||
using SSPLayoutMap = ValueMap<const AllocaInst *, SSPLayoutKind>;
|
||||
|
||||
private:
|
||||
const TargetMachine *TM = nullptr;
|
||||
|
||||
/// TLI - Keep a pointer of a TargetLowering to consult for determining
|
||||
@ -111,12 +123,14 @@ public:
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||
|
||||
SSPLayoutKind getSSPLayout(const AllocaInst *AI) const;
|
||||
|
||||
// Return true if StackProtector is supposed to be handled by SelectionDAG.
|
||||
bool shouldEmitSDCheck(const BasicBlock &BB) const;
|
||||
|
||||
bool runOnFunction(Function &Fn) override;
|
||||
void adjustForColoring(const AllocaInst *From, const AllocaInst *To);
|
||||
|
||||
void copyToMachineFrameInfo(MachineFrameInfo &MFI) const;
|
||||
bool runOnFunction(Function &Fn) override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/TargetFrameLowering.h"
|
||||
#include "llvm/CodeGen/TargetLowering.h"
|
||||
#include "llvm/CodeGen/TargetPassConfig.h"
|
||||
@ -103,9 +102,7 @@ IRTranslator::IRTranslator() : MachineFunctionPass(ID) {
|
||||
}
|
||||
|
||||
void IRTranslator::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<StackProtector>();
|
||||
AU.addRequired<TargetPassConfig>();
|
||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
@ -1653,9 +1650,5 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
|
||||
assert(&MF->front() == &NewEntryBB &&
|
||||
"New entry wasn't next in the list of basic block!");
|
||||
|
||||
// Initialize stack protector information.
|
||||
StackProtector &SP = getAnalysis<StackProtector>();
|
||||
SP.copyToMachineFrameInfo(MF->getFrameInfo());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -56,7 +56,6 @@ InstructionSelect::InstructionSelect() : MachineFunctionPass(ID) {
|
||||
|
||||
void InstructionSelect::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<TargetPassConfig>();
|
||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,6 @@ Legalizer::Legalizer() : MachineFunctionPass(ID) {
|
||||
|
||||
void Legalizer::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<TargetPassConfig>();
|
||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
|
@ -44,11 +44,6 @@ bool Localizer::shouldLocalize(const MachineInstr &MI) {
|
||||
}
|
||||
}
|
||||
|
||||
void Localizer::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
bool Localizer::isLocalUse(MachineOperand &MOUse, const MachineInstr &Def,
|
||||
MachineBasicBlock *&InsertMBB) {
|
||||
MachineInstr &MIUse = *MOUse.getParent();
|
||||
|
@ -105,7 +105,6 @@ void RegBankSelect::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<MachineBranchProbabilityInfo>();
|
||||
}
|
||||
AU.addRequired<TargetPassConfig>();
|
||||
getSelectionDAGFallbackAnalysisUsage(AU);
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/TargetInstrInfo.h"
|
||||
#include "llvm/CodeGen/TargetPassConfig.h"
|
||||
#include "llvm/CodeGen/TargetRegisterInfo.h"
|
||||
@ -234,7 +233,3 @@ APFloat llvm::getAPFloatFromSize(double Val, unsigned Size) {
|
||||
APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
|
||||
return APF;
|
||||
}
|
||||
|
||||
void llvm::getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU) {
|
||||
AU.addPreserved<StackProtector>();
|
||||
}
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/TargetFrameLowering.h"
|
||||
#include "llvm/CodeGen/TargetOpcodes.h"
|
||||
#include "llvm/CodeGen/TargetRegisterInfo.h"
|
||||
@ -98,6 +99,7 @@ namespace {
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
AU.addRequired<StackProtector>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
@ -107,7 +109,11 @@ namespace {
|
||||
char LocalStackSlotPass::ID = 0;
|
||||
|
||||
char &llvm::LocalStackSlotAllocationID = LocalStackSlotPass::ID;
|
||||
INITIALIZE_PASS(LocalStackSlotPass, DEBUG_TYPE,
|
||||
|
||||
INITIALIZE_PASS_BEGIN(LocalStackSlotPass, DEBUG_TYPE,
|
||||
"Local Stack Slot Allocation", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(StackProtector)
|
||||
INITIALIZE_PASS_END(LocalStackSlotPass, DEBUG_TYPE,
|
||||
"Local Stack Slot Allocation", false, false)
|
||||
|
||||
bool LocalStackSlotPass::runOnMachineFunction(MachineFunction &MF) {
|
||||
@ -196,6 +202,7 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
TFI.getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
|
||||
int64_t Offset = 0;
|
||||
unsigned MaxAlign = 0;
|
||||
StackProtector *SP = &getAnalysis<StackProtector>();
|
||||
|
||||
// Make sure that the stack protector comes before the local variables on the
|
||||
// stack.
|
||||
@ -215,16 +222,16 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
if (MFI.getStackProtectorIndex() == (int)i)
|
||||
continue;
|
||||
|
||||
switch (MFI.getObjectSSPLayout(i)) {
|
||||
case MachineFrameInfo::SSPLK_None:
|
||||
switch (SP->getSSPLayout(MFI.getObjectAllocation(i))) {
|
||||
case StackProtector::SSPLK_None:
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_SmallArray:
|
||||
case StackProtector::SSPLK_SmallArray:
|
||||
SmallArrayObjs.insert(i);
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_AddrOf:
|
||||
case StackProtector::SSPLK_AddrOf:
|
||||
AddrOfObjs.insert(i);
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_LargeArray:
|
||||
case StackProtector::SSPLK_LargeArray:
|
||||
LargeArrayObjs.insert(i);
|
||||
continue;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
||||
@ -84,6 +85,7 @@ void MachineFunctionPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addPreserved<MemoryDependenceWrapperPass>();
|
||||
AU.addPreserved<ScalarEvolutionWrapperPass>();
|
||||
AU.addPreserved<SCEVAAWrapperPass>();
|
||||
AU.addPreserved<StackProtector>();
|
||||
|
||||
FunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/RegisterScavenging.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/TargetFrameLowering.h"
|
||||
#include "llvm/CodeGen/TargetInstrInfo.h"
|
||||
#include "llvm/CodeGen/TargetOpcodes.h"
|
||||
@ -142,6 +143,7 @@ INITIALIZE_PASS_BEGIN(PEI, DEBUG_TYPE, "Prologue/Epilogue Insertion", false,
|
||||
false)
|
||||
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
|
||||
INITIALIZE_PASS_DEPENDENCY(StackProtector)
|
||||
INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass)
|
||||
INITIALIZE_PASS_END(PEI, DEBUG_TYPE,
|
||||
"Prologue/Epilogue Insertion & Frame Finalization", false,
|
||||
@ -158,6 +160,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
AU.addPreserved<MachineLoopInfo>();
|
||||
AU.addPreserved<MachineDominatorTree>();
|
||||
AU.addRequired<StackProtector>();
|
||||
AU.addRequired<MachineOptimizationRemarkEmitterPass>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
@ -692,6 +695,7 @@ AssignProtectedObjSet(const StackObjSet &UnassignedObjs,
|
||||
/// abstract stack objects.
|
||||
void PEI::calculateFrameObjectOffsets(MachineFunction &MF) {
|
||||
const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering();
|
||||
StackProtector *SP = &getAnalysis<StackProtector>();
|
||||
|
||||
bool StackGrowsDown =
|
||||
TFI.getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
|
||||
@ -840,16 +844,16 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &MF) {
|
||||
EHRegNodeFrameIndex == (int)i)
|
||||
continue;
|
||||
|
||||
switch (MFI.getObjectSSPLayout(i)) {
|
||||
case MachineFrameInfo::SSPLK_None:
|
||||
switch (SP->getSSPLayout(MFI.getObjectAllocation(i))) {
|
||||
case StackProtector::SSPLK_None:
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_SmallArray:
|
||||
case StackProtector::SSPLK_SmallArray:
|
||||
SmallArrayObjs.insert(i);
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_AddrOf:
|
||||
case StackProtector::SSPLK_AddrOf:
|
||||
AddrOfObjs.insert(i);
|
||||
continue;
|
||||
case MachineFrameInfo::SSPLK_LargeArray:
|
||||
case StackProtector::SSPLK_LargeArray:
|
||||
LargeArrayObjs.insert(i);
|
||||
continue;
|
||||
}
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@ -45,11 +44,6 @@ namespace {
|
||||
|
||||
StringRef getPassName() const override { return "ResetMachineFunction"; }
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addPreserved<StackProtector>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) override {
|
||||
// No matter what happened, whether we successfully selected the function
|
||||
// or not, nothing is going to use the vreg types after us. Make sure they
|
||||
|
@ -328,6 +328,7 @@ void SelectionDAGISel::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<AAResultsWrapperPass>();
|
||||
AU.addRequired<GCModuleInfo>();
|
||||
AU.addRequired<StackProtector>();
|
||||
AU.addPreserved<StackProtector>();
|
||||
AU.addPreserved<GCModuleInfo>();
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||
@ -1543,7 +1544,6 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
processDbgDeclares(FuncInfo);
|
||||
|
||||
// Iterate over all basic blocks in the function.
|
||||
StackProtector &SP = getAnalysis<StackProtector>();
|
||||
for (const BasicBlock *LLVMBB : RPOT) {
|
||||
if (OptLevel != CodeGenOpt::None) {
|
||||
bool AllPredsVisited = true;
|
||||
@ -1713,7 +1713,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
FastIS->recomputeInsertPt();
|
||||
}
|
||||
|
||||
if (SP.shouldEmitSDCheck(*LLVMBB)) {
|
||||
if (getAnalysis<StackProtector>().shouldEmitSDCheck(*LLVMBB)) {
|
||||
bool FunctionBasedInstrumentation =
|
||||
TLI->getSSPStackGuardCheck(*Fn.getParent());
|
||||
SDB->SPDescriptor.initialize(LLVMBB, FuncInfo->MBBMap[LLVMBB],
|
||||
@ -1746,8 +1746,6 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
ElidedArgCopyInstrs.clear();
|
||||
}
|
||||
|
||||
SP.copyToMachineFrameInfo(MF->getFrameInfo());
|
||||
|
||||
propagateSwiftErrorVRegs(FuncInfo);
|
||||
|
||||
delete FastIS;
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/SlotIndexes.h"
|
||||
#include "llvm/CodeGen/StackProtector.h"
|
||||
#include "llvm/CodeGen/TargetOpcodes.h"
|
||||
#include "llvm/CodeGen/WinEHFuncInfo.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
@ -422,6 +423,9 @@ class StackColoring : public MachineFunctionPass {
|
||||
/// SlotIndex analysis object.
|
||||
SlotIndexes *Indexes;
|
||||
|
||||
/// The stack protector object.
|
||||
StackProtector *SP;
|
||||
|
||||
/// The list of lifetime markers found. These markers are to be removed
|
||||
/// once the coloring is done.
|
||||
SmallVector<MachineInstr*, 8> Markers;
|
||||
@ -520,11 +524,13 @@ char &llvm::StackColoringID = StackColoring::ID;
|
||||
INITIALIZE_PASS_BEGIN(StackColoring, DEBUG_TYPE,
|
||||
"Merge disjoint stack slots", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
|
||||
INITIALIZE_PASS_DEPENDENCY(StackProtector)
|
||||
INITIALIZE_PASS_END(StackColoring, DEBUG_TYPE,
|
||||
"Merge disjoint stack slots", false, false)
|
||||
|
||||
void StackColoring::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<SlotIndexes>();
|
||||
AU.addRequired<StackProtector>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
@ -930,17 +936,9 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
|
||||
MergedAllocas.insert(From);
|
||||
MergedAllocas.insert(To);
|
||||
|
||||
// Transfer the stack protector layout tag, but make sure that SSPLK_AddrOf
|
||||
// does not overwrite SSPLK_SmallArray or SSPLK_LargeArray, and make sure
|
||||
// that SSPLK_SmallArray does not overwrite SSPLK_LargeArray.
|
||||
MachineFrameInfo::SSPLayoutKind FromKind
|
||||
= MFI->getObjectSSPLayout(SI.first);
|
||||
MachineFrameInfo::SSPLayoutKind ToKind = MFI->getObjectSSPLayout(SI.second);
|
||||
if (FromKind != MachineFrameInfo::SSPLK_None &&
|
||||
(ToKind == MachineFrameInfo::SSPLK_None ||
|
||||
(ToKind != MachineFrameInfo::SSPLK_LargeArray &&
|
||||
FromKind != MachineFrameInfo::SSPLK_AddrOf)))
|
||||
MFI->setObjectSSPLayout(SI.second, FromKind);
|
||||
// Allow the stack protector to adjust its value map to account for the
|
||||
// upcoming replacement.
|
||||
SP->adjustForColoring(From, To);
|
||||
|
||||
// The new alloca might not be valid in a llvm.dbg.declare for this
|
||||
// variable, so undef out the use to make the verifier happy.
|
||||
@ -1141,6 +1139,7 @@ bool StackColoring::runOnMachineFunction(MachineFunction &Func) {
|
||||
MF = &Func;
|
||||
MFI = &MF->getFrameInfo();
|
||||
Indexes = &getAnalysis<SlotIndexes>();
|
||||
SP = &getAnalysis<StackProtector>();
|
||||
BlockLiveness.clear();
|
||||
BasicBlocks.clear();
|
||||
BasicBlockNumbering.clear();
|
||||
|
@ -70,6 +70,32 @@ INITIALIZE_PASS_END(StackProtector, DEBUG_TYPE,
|
||||
|
||||
FunctionPass *llvm::createStackProtectorPass() { return new StackProtector(); }
|
||||
|
||||
StackProtector::SSPLayoutKind
|
||||
StackProtector::getSSPLayout(const AllocaInst *AI) const {
|
||||
return AI ? Layout.lookup(AI) : SSPLK_None;
|
||||
}
|
||||
|
||||
void StackProtector::adjustForColoring(const AllocaInst *From,
|
||||
const AllocaInst *To) {
|
||||
// When coloring replaces one alloca with another, transfer the SSPLayoutKind
|
||||
// tag from the remapped to the target alloca. The remapped alloca should
|
||||
// have a size smaller than or equal to the replacement alloca.
|
||||
SSPLayoutMap::iterator I = Layout.find(From);
|
||||
if (I != Layout.end()) {
|
||||
SSPLayoutKind Kind = I->second;
|
||||
Layout.erase(I);
|
||||
|
||||
// Transfer the tag, but make sure that SSPLK_AddrOf does not overwrite
|
||||
// SSPLK_SmallArray or SSPLK_LargeArray, and make sure that
|
||||
// SSPLK_SmallArray does not overwrite SSPLK_LargeArray.
|
||||
I = Layout.find(To);
|
||||
if (I == Layout.end())
|
||||
Layout.insert(std::make_pair(To, Kind));
|
||||
else if (I->second != SSPLK_LargeArray && Kind != SSPLK_AddrOf)
|
||||
I->second = Kind;
|
||||
}
|
||||
}
|
||||
|
||||
void StackProtector::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<TargetPassConfig>();
|
||||
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||
@ -263,21 +289,18 @@ bool StackProtector::RequiresStackProtector() {
|
||||
if (CI->getLimitedValue(SSPBufferSize) >= SSPBufferSize) {
|
||||
// A call to alloca with size >= SSPBufferSize requires
|
||||
// stack protectors.
|
||||
Layout.insert(std::make_pair(AI,
|
||||
MachineFrameInfo::SSPLK_LargeArray));
|
||||
Layout.insert(std::make_pair(AI, SSPLK_LargeArray));
|
||||
ORE.emit(RemarkBuilder);
|
||||
NeedsProtector = true;
|
||||
} else if (Strong) {
|
||||
// Require protectors for all alloca calls in strong mode.
|
||||
Layout.insert(std::make_pair(AI,
|
||||
MachineFrameInfo::SSPLK_SmallArray));
|
||||
Layout.insert(std::make_pair(AI, SSPLK_SmallArray));
|
||||
ORE.emit(RemarkBuilder);
|
||||
NeedsProtector = true;
|
||||
}
|
||||
} else {
|
||||
// A call to alloca with a variable size requires protectors.
|
||||
Layout.insert(std::make_pair(AI,
|
||||
MachineFrameInfo::SSPLK_LargeArray));
|
||||
Layout.insert(std::make_pair(AI, SSPLK_LargeArray));
|
||||
ORE.emit(RemarkBuilder);
|
||||
NeedsProtector = true;
|
||||
}
|
||||
@ -286,9 +309,8 @@ bool StackProtector::RequiresStackProtector() {
|
||||
|
||||
bool IsLarge = false;
|
||||
if (ContainsProtectableArray(AI->getAllocatedType(), IsLarge, Strong)) {
|
||||
Layout.insert(std::make_pair(AI, IsLarge
|
||||
? MachineFrameInfo::SSPLK_LargeArray
|
||||
: MachineFrameInfo::SSPLK_SmallArray));
|
||||
Layout.insert(std::make_pair(AI, IsLarge ? SSPLK_LargeArray
|
||||
: SSPLK_SmallArray));
|
||||
ORE.emit([&]() {
|
||||
return OptimizationRemark(DEBUG_TYPE, "StackProtectorBuffer", &I)
|
||||
<< "Stack protection applied to function "
|
||||
@ -302,7 +324,7 @@ bool StackProtector::RequiresStackProtector() {
|
||||
|
||||
if (Strong && HasAddressTaken(AI)) {
|
||||
++NumAddrTaken;
|
||||
Layout.insert(std::make_pair(AI, MachineFrameInfo::SSPLK_AddrOf));
|
||||
Layout.insert(std::make_pair(AI, SSPLK_AddrOf));
|
||||
ORE.emit([&]() {
|
||||
return OptimizationRemark(DEBUG_TYPE, "StackProtectorAddressTaken",
|
||||
&I)
|
||||
@ -512,23 +534,3 @@ BasicBlock *StackProtector::CreateFailBB() {
|
||||
bool StackProtector::shouldEmitSDCheck(const BasicBlock &BB) const {
|
||||
return HasPrologue && !HasIRCheck && dyn_cast<ReturnInst>(BB.getTerminator());
|
||||
}
|
||||
|
||||
void StackProtector::copyToMachineFrameInfo(MachineFrameInfo &MFI) const {
|
||||
if (Layout.empty())
|
||||
return;
|
||||
|
||||
for (int I = 0, E = MFI.getObjectIndexEnd(); I != E; ++I) {
|
||||
if (MFI.isDeadObjectIndex(I))
|
||||
continue;
|
||||
|
||||
const AllocaInst *AI = MFI.getObjectAllocation(I);
|
||||
if (!AI)
|
||||
continue;
|
||||
|
||||
SSPLayoutMap::const_iterator LI = Layout.find(AI);
|
||||
if (LI == Layout.end())
|
||||
continue;
|
||||
|
||||
MFI.setObjectSSPLayout(I, LI->second);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user