From 12c74dc2c2ee306f60fb39a9b2a43000e23addcc Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sat, 13 Jul 2013 01:00:17 +0000 Subject: [PATCH] Revert commit r186217 -- this is breaking bots: http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/4328 Original commit log: Use the function attributes to pass along the stack protector buffer size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186234 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/CommandFlags.h | 4 ++++ include/llvm/Target/TargetOptions.h | 7 ++++++- lib/CodeGen/StackProtector.cpp | 26 +++++++------------------- tools/llc/llc.cpp | 1 + tools/lto/LTOModule.cpp | 6 ++++++ tools/opt/opt.cpp | 1 + 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/include/llvm/CodeGen/CommandFlags.h b/include/llvm/CodeGen/CommandFlags.h index fd1d67bdcd1..9a27661b519 100644 --- a/include/llvm/CodeGen/CommandFlags.h +++ b/include/llvm/CodeGen/CommandFlags.h @@ -220,4 +220,8 @@ cl::opt StartAfter("start-after", cl::value_desc("pass-name"), cl::init("")); +cl::opt +SSPBufferSize("stack-protector-buffer-size", cl::init(8), + cl::desc("Lower bound for a buffer to be considered for " + "stack protection")); #endif diff --git a/include/llvm/Target/TargetOptions.h b/include/llvm/Target/TargetOptions.h index 04b20801066..e240a9aeed2 100644 --- a/include/llvm/Target/TargetOptions.h +++ b/include/llvm/Target/TargetOptions.h @@ -48,7 +48,7 @@ namespace llvm { UseSoftFloat(false), NoZerosInBSS(false), JITEmitDebugInfo(false), JITEmitDebugInfoToDisk(false), GuaranteedTailCallOpt(false), DisableTailCalls(false), - StackAlignmentOverride(0), RealignStack(true), + StackAlignmentOverride(0), RealignStack(true), SSPBufferSize(0), EnableFastISel(false), PositionIndependentExecutable(false), EnableSegmentedStacks(false), UseInitArray(false), TrapFuncName(""), FloatABIType(FloatABI::Default), AllowFPOpFusion(FPOpFusion::Standard) @@ -151,6 +151,10 @@ namespace llvm { /// automatically realigned, if needed. unsigned RealignStack : 1; + /// SSPBufferSize - The minimum size of buffers that will receive stack + /// smashing protection when -fstack-protection is used. + unsigned SSPBufferSize; + /// EnableFastISel - This flag enables fast-path instruction selection /// which trades away generated code quality in favor of reducing /// compile time. @@ -220,6 +224,7 @@ inline bool operator==(const TargetOptions &LHS, ARE_EQUAL(DisableTailCalls) && ARE_EQUAL(StackAlignmentOverride) && ARE_EQUAL(RealignStack) && + ARE_EQUAL(SSPBufferSize) && ARE_EQUAL(EnableFastISel) && ARE_EQUAL(PositionIndependentExecutable) && ARE_EQUAL(EnableSegmentedStacks) && diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index bf5d0c7d9ec..1f673ab0377 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -33,7 +33,6 @@ #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetLowering.h" -#include using namespace llvm; STATISTIC(NumFunProtected, "Number of functions protected"); @@ -54,10 +53,6 @@ namespace { DominatorTree *DT; - /// \brief The minimum size of buffers that will receive stack smashing - /// protection when -fstack-protection is used. - unsigned SSPBufferSize; - /// 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 @@ -90,12 +85,11 @@ namespace { bool RequiresStackProtector(); public: static char ID; // Pass identification, replacement for typeid. - StackProtector() : FunctionPass(ID), TM(0), TLI(0), SSPBufferSize(0) { + StackProtector() : FunctionPass(ID), TM(0), TLI(0) { initializeStackProtectorPass(*PassRegistry::getPassRegistry()); } StackProtector(const TargetMachine *TM) - : FunctionPass(ID), TM(TM), TLI(0), Trip(TM->getTargetTriple()), - SSPBufferSize(8) { + : FunctionPass(ID), TM(TM), TLI(0), Trip(TM->getTargetTriple()) { initializeStackProtectorPass(*PassRegistry::getPassRegistry()); } @@ -123,12 +117,6 @@ bool StackProtector::runOnFunction(Function &Fn) { if (!RequiresStackProtector()) return false; - Attribute Attr = - Fn.getAttributes().getAttribute(AttributeSet::FunctionIndex, - "ssp-buffer-size"); - if (Attr.isStringAttribute()) - SSPBufferSize = atoi(Attr.getValueAsString().data()); - ++NumFunProtected; return InsertStackProtectors(); } @@ -144,6 +132,7 @@ bool StackProtector::ContainsProtectableArray(Type *Ty, bool Strong, // protector if (Strong) return true; + const TargetMachine &TM = TLI->getTargetMachine(); if (!AT->getElementType()->isIntegerTy(8)) { // If we're on a non-Darwin platform or we're inside of a structure, don't // add stack protectors unless the array is a character array. @@ -153,7 +142,7 @@ bool StackProtector::ContainsProtectableArray(Type *Ty, bool Strong, // If an array has more than SSPBufferSize bytes of allocated space, then we // emit stack protectors. - if (SSPBufferSize <= TLI->getDataLayout()->getTypeAllocSize(AT)) + if (TM.Options.SSPBufferSize <= TLI->getDataLayout()->getTypeAllocSize(AT)) return true; } @@ -241,14 +230,13 @@ bool StackProtector::RequiresStackProtector() { if (const ConstantInt *CI = dyn_cast(AI->getArraySize())) { - if (CI->getLimitedValue(SSPBufferSize) >= SSPBufferSize) + unsigned BufferSize = TLI->getTargetMachine().Options.SSPBufferSize; + if (CI->getLimitedValue(BufferSize) >= BufferSize) // A call to alloca with size >= SSPBufferSize requires // stack protectors. return true; - } else { - // A call to alloca with a variable size requires protectors. + } else // A call to alloca with a variable size requires protectors. return true; - } } if (ContainsProtectableArray(AI->getAllocatedType(), Strong)) diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 9f6be81fc92..bcabafc4675 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -280,6 +280,7 @@ static int compileModule(char **argv, LLVMContext &Context) { Options.PositionIndependentExecutable = EnablePIE; Options.EnableSegmentedStacks = SegmentedStacks; Options.UseInitArray = UseInitArray; + Options.SSPBufferSize = SSPBufferSize; OwningPtr target(TheTarget->createTargetMachine(TheTriple.getTriple(), diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index 5ee43ba0229..6220dd1c566 100644 --- a/tools/lto/LTOModule.cpp +++ b/tools/lto/LTOModule.cpp @@ -151,6 +151,11 @@ UseInitArray("use-init-array", cl::desc("Use .init_array instead of .ctors."), cl::init(false)); +static cl::opt +SSPBufferSize("stack-protector-buffer-size", cl::init(8), + cl::desc("Lower bound for a buffer to be considered for " + "stack protection")); + LTOModule::LTOModule(llvm::Module *m, llvm::TargetMachine *t) : _module(m), _target(t), _context(_target->getMCAsmInfo(), _target->getRegisterInfo(), NULL), @@ -256,6 +261,7 @@ void LTOModule::getTargetOptions(TargetOptions &Options) { Options.PositionIndependentExecutable = EnablePIE; Options.EnableSegmentedStacks = SegmentedStacks; Options.UseInitArray = UseInitArray; + Options.SSPBufferSize = SSPBufferSize; } LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer, diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index fa1cd436176..6fc8d6759b9 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -510,6 +510,7 @@ static TargetOptions GetTargetOptions() { Options.PositionIndependentExecutable = EnablePIE; Options.EnableSegmentedStacks = SegmentedStacks; Options.UseInitArray = UseInitArray; + Options.SSPBufferSize = SSPBufferSize; return Options; } -- 2.34.1