diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/LLVMTargetMachine.cpp | 16 | ||||
-rw-r--r-- | lib/CodeGen/StackProtector.cpp | 26 |
2 files changed, 13 insertions, 29 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index fee70b0015..2397a160e9 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -60,19 +60,6 @@ static cl::opt<cl::boolOrDefault> EnableFastISelOption("fast-isel", cl::Hidden, cl::desc("Enable the experimental \"fast\" instruction selector")); -// Enable stack protectors. -static cl::opt<SSP::StackProtectorLevel> -EnableStackProtector("enable-stack-protector", - cl::desc("Stack canary protection level: (default: off)"), - cl::init(SSP::OFF), - cl::values(clEnumValN(SSP::ALL, "all", - "All functions get stack protectors."), - clEnumValN(SSP::SOME, "some", - "Only functions requiring stack protectors get them."), - clEnumValN(SSP::OFF, "off", - "No functions get stack protectors."), - clEnumValEnd)); - FileModel::Model LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, raw_ostream &Out, @@ -178,8 +165,7 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, bool Fast) { if (!Fast) PM.add(createCodeGenPreparePass(getTargetLowering())); - if (EnableStackProtector != SSP::OFF) - PM.add(createStackProtectorPass(EnableStackProtector, getTargetLowering())); + PM.add(createStackProtectorPass(getTargetLowering())); if (PrintISelInput) PM.add(createPrintFunctionPass("\n\n" diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index 746addeba4..d724bd71f8 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -16,6 +16,7 @@ #define DEBUG_TYPE "stack-protector" #include "llvm/CodeGen/Passes.h" +#include "llvm/Attributes.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Function.h" @@ -37,9 +38,6 @@ SSPBufferSize("stack-protector-buffer-size", cl::init(8), namespace { class VISIBILITY_HIDDEN StackProtector : public FunctionPass { - /// Level - The level of stack protection. - SSP::StackProtectorLevel Level; - /// TLI - Keep a pointer of a TargetLowering to consult for determining /// target type sizes. const TargetLowering *TLI; @@ -64,9 +62,9 @@ namespace { bool RequiresStackProtector() const; public: static char ID; // Pass identification, replacement for typeid. - StackProtector() : FunctionPass(&ID), Level(SSP::OFF), TLI(0) {} - StackProtector(SSP::StackProtectorLevel lvl, const TargetLowering *tli) - : FunctionPass(&ID), Level(lvl), TLI(tli) {} + StackProtector() : FunctionPass(&ID), TLI(0) {} + StackProtector(const TargetLowering *tli) + : FunctionPass(&ID), TLI(tli) {} virtual bool runOnFunction(Function &Fn); }; @@ -76,9 +74,8 @@ char StackProtector::ID = 0; static RegisterPass<StackProtector> X("stack-protector", "Insert stack protectors"); -FunctionPass *llvm::createStackProtectorPass(SSP::StackProtectorLevel lvl, - const TargetLowering *tli) { - return new StackProtector(lvl, tli); +FunctionPass *llvm::createStackProtectorPass(const TargetLowering *tli) { + return new StackProtector(tli); } bool StackProtector::runOnFunction(Function &Fn) { @@ -193,10 +190,10 @@ BasicBlock *StackProtector::CreateFailBB() { /// add a guard variable to functions that call alloca, and functions with /// buffers larger than 8 bytes. bool StackProtector::RequiresStackProtector() const { - switch (Level) { - default: return false; - case SSP::ALL: return true; - case SSP::SOME: { + if (F->hasFnAttr(Attribute::StackProtectReq)) + return true; + + if (F->hasFnAttr(Attribute::StackProtect)) { const TargetData *TD = TLI->getTargetData(); for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) { @@ -220,5 +217,6 @@ bool StackProtector::RequiresStackProtector() const { return false; } - } + + return false; } |