diff options
| author | Josh Magee <joshua_magee@playstation.sony.com> | 2014-02-01 01:36:16 +0000 | 
|---|---|---|
| committer | Josh Magee <joshua_magee@playstation.sony.com> | 2014-02-01 01:36:16 +0000 | 
| commit | 24c7f063333b0654fb3d6667d0096ce97141b82e (patch) | |
| tree | 7332ef67a673107e3d0cf9bcabe73dd2e9d743c4 /llvm/lib | |
| parent | 31cb474e2d0dea9eb4298b6cbfe5887bbde7e3cf (diff) | |
| download | bcm5719-llvm-24c7f063333b0654fb3d6667d0096ce97141b82e.tar.gz bcm5719-llvm-24c7f063333b0654fb3d6667d0096ce97141b82e.zip  | |
[stackprotector] Implement the sspstrong rules for stack layout.
This changes the PrologueEpilogInserter and LocalStackSlotAllocation passes to
follow the extended stack layout rules for sspstrong and sspreq.
The sspstrong layout rules are:
 1. Large arrays and structures containing large arrays (>= ssp-buffer-size)
are closest to the stack protector.
 2. Small arrays and structures containing small arrays (< ssp-buffer-size) are
2nd closest to the protector.
 3. Variables that have had their address taken are 3rd closest to the
protector.
Differential Revision: http://llvm-reviews.chandlerc.com/D2546
llvm-svn: 200601
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/LocalStackSlotAllocation.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 11 | 
2 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/LocalStackSlotAllocation.cpp b/llvm/lib/CodeGen/LocalStackSlotAllocation.cpp index f521548b213..08f0cc2f011 100644 --- a/llvm/lib/CodeGen/LocalStackSlotAllocation.cpp +++ b/llvm/lib/CodeGen/LocalStackSlotAllocation.cpp @@ -194,6 +194,9 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) {    SmallSet<int, 16> ProtectedObjs;    if (MFI->getStackProtectorIndex() >= 0) {      StackObjSet LargeArrayObjs; +    StackObjSet SmallArrayObjs; +    StackObjSet AddrOfObjs; +      AdjustStackOffset(MFI, MFI->getStackProtectorIndex(), Offset,                        StackGrowsDown, MaxAlign); @@ -206,8 +209,12 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) {        switch (SP->getSSPLayout(MFI->getObjectAllocation(i))) {        case StackProtector::SSPLK_None: +        continue;        case StackProtector::SSPLK_SmallArray: +        SmallArrayObjs.insert(i); +        continue;        case StackProtector::SSPLK_AddrOf: +        AddrOfObjs.insert(i);          continue;        case StackProtector::SSPLK_LargeArray:          LargeArrayObjs.insert(i); @@ -218,6 +225,10 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) {      AssignProtectedObjSet(LargeArrayObjs, ProtectedObjs, MFI, StackGrowsDown,                            Offset, MaxAlign); +    AssignProtectedObjSet(SmallArrayObjs, ProtectedObjs, MFI, StackGrowsDown, +                          Offset, MaxAlign); +    AssignProtectedObjSet(AddrOfObjs, ProtectedObjs, MFI, StackGrowsDown, +                          Offset, MaxAlign);    }    // Then assign frame offsets to stack objects that are not used to spill diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 488e7ecf8cd..1215e5a5d16 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -553,6 +553,9 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {    SmallSet<int, 16> ProtectedObjs;    if (MFI->getStackProtectorIndex() >= 0) {      StackObjSet LargeArrayObjs; +    StackObjSet SmallArrayObjs; +    StackObjSet AddrOfObjs; +      AdjustStackOffset(MFI, MFI->getStackProtectorIndex(), StackGrowsDown,                        Offset, MaxAlign); @@ -572,8 +575,12 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {        switch (SP->getSSPLayout(MFI->getObjectAllocation(i))) {        case StackProtector::SSPLK_None: +        continue;        case StackProtector::SSPLK_SmallArray: +        SmallArrayObjs.insert(i); +        continue;        case StackProtector::SSPLK_AddrOf: +        AddrOfObjs.insert(i);          continue;        case StackProtector::SSPLK_LargeArray:          LargeArrayObjs.insert(i); @@ -584,6 +591,10 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {      AssignProtectedObjSet(LargeArrayObjs, ProtectedObjs, MFI, StackGrowsDown,                            Offset, MaxAlign); +    AssignProtectedObjSet(SmallArrayObjs, ProtectedObjs, MFI, StackGrowsDown, +                          Offset, MaxAlign); +    AssignProtectedObjSet(AddrOfObjs, ProtectedObjs, MFI, StackGrowsDown, +                          Offset, MaxAlign);    }    // Then assign frame offsets to stack objects that are not used to spill  | 

