Adjust the stack protector heuristic to care about only arrays or calls to
authorBill Wendling <isanbard@gmail.com>
Thu, 6 Nov 2008 02:38:58 +0000 (02:38 +0000)
committerBill Wendling <isanbard@gmail.com>
Thu, 6 Nov 2008 02:38:58 +0000 (02:38 +0000)
"alloca".

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58792 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StackProtector.cpp

index 659f8a01ab7fbc5ef386264ad9bd90fd6432a177..eaf52f691c6363df0efb0f21a32ac4287c9cc954 100644 (file)
@@ -184,7 +184,9 @@ BasicBlock *StackProtector::CreateFailBB() {
 }
 
 /// RequiresStackProtector - Check whether or not this function needs a stack
-/// protector based upon the stack protector level.
+/// 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
+/// buffers larger than 8 bytes.
 bool StackProtector::RequiresStackProtector() const {
   switch (Level) {
   default: return false;
@@ -201,6 +203,8 @@ bool StackProtector::RequiresStackProtector() const {
       for (BasicBlock::iterator
              II = BB->begin(), IE = BB->end(); II != IE; ++II)
         if (AllocaInst *AI = dyn_cast<AllocaInst>(II)) {
+          if (!AI->isArrayAllocation()) continue; // Only care about arrays.
+
           if (ConstantInt *CI = dyn_cast<ConstantInt>(AI->getArraySize())) {
             const Type *Ty = AI->getAllocatedType();
             uint64_t TySize = TD->getABITypeSize(Ty);
@@ -208,6 +212,10 @@ bool StackProtector::RequiresStackProtector() const {
 
             if (SSPBufferSize <= StackSize)
               return true;
+          } else {
+            // This is a call to alloca with a variable size. Default to adding
+            // stack protectors.
+            return true;
           }
         }
     }