mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
Implement stack protectors for structures with character arrays in them.
<rdar://problem/10545247> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162131 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a7fb3f6804
commit
a67eda76c0
@ -61,6 +61,11 @@ namespace {
|
|||||||
/// check fails.
|
/// check fails.
|
||||||
BasicBlock *CreateFailBB();
|
BasicBlock *CreateFailBB();
|
||||||
|
|
||||||
|
/// ContainsProtectableArray - Check whether the type either is an array or
|
||||||
|
/// contains an array of sufficient size so that we need stack protectors
|
||||||
|
/// for it.
|
||||||
|
bool ContainsProtectableArray(Type *Ty, bool InStruct = false) const;
|
||||||
|
|
||||||
/// RequiresStackProtector - Check whether or not this function needs a
|
/// RequiresStackProtector - Check whether or not this function needs a
|
||||||
/// stack protector based upon the stack protector level.
|
/// stack protector based upon the stack protector level.
|
||||||
bool RequiresStackProtector() const;
|
bool RequiresStackProtector() const;
|
||||||
@ -100,6 +105,39 @@ bool StackProtector::runOnFunction(Function &Fn) {
|
|||||||
return InsertStackProtectors();
|
return InsertStackProtectors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ContainsProtectableArray - Check whether the type either is an array or
|
||||||
|
/// contains a char array of sufficient size so that we need stack protectors
|
||||||
|
/// for it.
|
||||||
|
bool StackProtector::ContainsProtectableArray(Type *Ty, bool InStruct) const {
|
||||||
|
if (!Ty) return false;
|
||||||
|
if (ArrayType *AT = dyn_cast<ArrayType>(Ty)) {
|
||||||
|
if (!AT->getElementType()->isIntegerTy(8)) {
|
||||||
|
const TargetMachine &TM = TLI->getTargetMachine();
|
||||||
|
Triple Trip(TM.getTargetTriple());
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
if (InStruct || !Trip.isOSDarwin())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an array has more than SSPBufferSize bytes of allocated space, then we
|
||||||
|
// emit stack protectors.
|
||||||
|
if (SSPBufferSize <= TLI->getTargetData()->getTypeAllocSize(AT))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const StructType *ST = dyn_cast<StructType>(Ty);
|
||||||
|
if (!ST) return false;
|
||||||
|
|
||||||
|
for (StructType::element_iterator I = ST->element_begin(),
|
||||||
|
E = ST->element_end(); I != E; ++I)
|
||||||
|
if (ContainsProtectableArray(*I, true))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// RequiresStackProtector - Check whether or not this function needs a stack
|
/// RequiresStackProtector - Check whether or not this function needs a stack
|
||||||
/// protector based upon the stack protector level. The heuristic we use is to
|
/// protector based upon the stack protector level. The heuristic we use is to
|
||||||
/// add a guard variable to functions that call alloca, and functions with
|
/// add a guard variable to functions that call alloca, and functions with
|
||||||
@ -111,10 +149,6 @@ bool StackProtector::RequiresStackProtector() const {
|
|||||||
if (!F->hasFnAttr(Attribute::StackProtect))
|
if (!F->hasFnAttr(Attribute::StackProtect))
|
||||||
return false;
|
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) {
|
for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
|
||||||
BasicBlock *BB = I;
|
BasicBlock *BB = I;
|
||||||
|
|
||||||
@ -126,17 +160,8 @@ bool StackProtector::RequiresStackProtector() const {
|
|||||||
// protectors.
|
// protectors.
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (ArrayType *AT = dyn_cast<ArrayType>(AI->getAllocatedType())) {
|
if (ContainsProtectableArray(AI->getAllocatedType()))
|
||||||
// If we're on a non-Darwin platform, don't add stack protectors
|
return true;
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user