[llvm-commits] [llvm] r161446 - /llvm/trunk/lib/CodeGen/StackProtector.cpp

Bill Wendling isanbard at gmail.com
Tue Aug 7 14:32:28 PDT 2012


I don't know GCC's rationale for it. But it's been this way since 4.2, so I imagine that it's deliberate. If I had to guess, I would say that it's for performance reasons.

Note: We don't currently add stack protectors for things like this (but GCC does):

struct S { char a[37]; };
char foo(int x) {
  struct S s;
  return s.a[x];
}

-bw

On Aug 7, 2012, at 2:20 PM, Aaron Ballman <aaron at aaronballman.com> wrote:

> Do we know why gcc does this?  I'm all for compatibility, but it seems
> like it's taking away a fairly nice safety feature so I am hoping
> there's some more logic here.
> 
> ~Aaron
> 
> On Tue, Aug 7, 2012 at 4:59 PM, Bill Wendling <isanbard at gmail.com> wrote:
>> Author: void
>> Date: Tue Aug  7 15:59:05 2012
>> New Revision: 161446
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=161446&view=rev
>> Log:
>> 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>
>> 
>> Modified:
>>    llvm/trunk/lib/CodeGen/StackProtector.cpp
>> 
>> Modified: llvm/trunk/lib/CodeGen/StackProtector.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackProtector.cpp?rev=161446&r1=161445&r2=161446&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/StackProtector.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/StackProtector.cpp Tue Aug  7 15:59:05 2012
>> @@ -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 @@
>>     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 @@
>>           // 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;
>> +        }
>>       }
>>   }
>> 
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list