From 89c5cc6c793ca420194c94361e1c6dacb6d7c446 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Thu, 6 Nov 2008 02:38:58 +0000 Subject: [PATCH] Adjust the stack protector heuristic to care about only arrays or calls to "alloca". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58792 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/StackProtector.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index 659f8a01ab7..eaf52f691c6 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -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(II)) { + if (!AI->isArrayAllocation()) continue; // Only care about arrays. + if (ConstantInt *CI = dyn_cast(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; } } }