For non-Darwin platforms, we want to generate stack protectors only for

character arrays. This is in line with what GCC does.
<rdar://problem/10529227>

llvm-svn: 161446
This commit is contained in:
Bill Wendling 2012-08-07 20:59:05 +00:00
parent 301af79343
commit 06a580b5da

View File

@ -28,6 +28,7 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/ADT/Triple.h"
using namespace llvm;
// SSPBufferSize - The lower bound for a buffer to be considered for stack
@ -111,6 +112,8 @@ bool StackProtector::RequiresStackProtector() const {
return false;
const TargetData *TD = TLI->getTargetData();
const TargetMachine &TM = TLI->getTargetMachine();
Triple Trip(TM.getTargetTriple());
for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
BasicBlock *BB = I;
@ -123,11 +126,17 @@ bool StackProtector::RequiresStackProtector() const {
// protectors.
return true;
if (ArrayType *AT = dyn_cast<ArrayType>(AI->getAllocatedType()))
if (ArrayType *AT = dyn_cast<ArrayType>(AI->getAllocatedType())) {
// If we're on a non-Darwin platform, don't add stack protectors
// unless the array is a character array.
if (!Trip.isOSDarwin() && !AT->getElementType()->isIntegerTy(8))
continue;
// If an array has more than SSPBufferSize bytes of allocated space,
// then we emit stack protectors.
if (SSPBufferSize <= TD->getTypeAllocSize(AT))
return true;
}
}
}