mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200601 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user