summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp')
-rw-r--r--llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp49
1 files changed, 28 insertions, 21 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
index d183eb5b3eb..24b99e49fc6 100644
--- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
@@ -21,27 +21,27 @@
using namespace llvm;
namespace {
-// The ABI-defined register save slots, relative to the incoming stack
-// pointer.
+// The ABI-defined register save slots, relative to the CFA (i.e.
+// incoming stack pointer + SystemZMC::CallFrameSize).
static const TargetFrameLowering::SpillSlot SpillOffsetTable[] = {
- { SystemZ::R2D, 0x10 },
- { SystemZ::R3D, 0x18 },
- { SystemZ::R4D, 0x20 },
- { SystemZ::R5D, 0x28 },
- { SystemZ::R6D, 0x30 },
- { SystemZ::R7D, 0x38 },
- { SystemZ::R8D, 0x40 },
- { SystemZ::R9D, 0x48 },
- { SystemZ::R10D, 0x50 },
- { SystemZ::R11D, 0x58 },
- { SystemZ::R12D, 0x60 },
- { SystemZ::R13D, 0x68 },
- { SystemZ::R14D, 0x70 },
- { SystemZ::R15D, 0x78 },
- { SystemZ::F0D, 0x80 },
- { SystemZ::F2D, 0x88 },
- { SystemZ::F4D, 0x90 },
- { SystemZ::F6D, 0x98 }
+ { SystemZ::R2D, -SystemZMC::CallFrameSize + 0x10 },
+ { SystemZ::R3D, -SystemZMC::CallFrameSize + 0x18 },
+ { SystemZ::R4D, -SystemZMC::CallFrameSize + 0x20 },
+ { SystemZ::R5D, -SystemZMC::CallFrameSize + 0x28 },
+ { SystemZ::R6D, -SystemZMC::CallFrameSize + 0x30 },
+ { SystemZ::R7D, -SystemZMC::CallFrameSize + 0x38 },
+ { SystemZ::R8D, -SystemZMC::CallFrameSize + 0x40 },
+ { SystemZ::R9D, -SystemZMC::CallFrameSize + 0x48 },
+ { SystemZ::R10D, -SystemZMC::CallFrameSize + 0x50 },
+ { SystemZ::R11D, -SystemZMC::CallFrameSize + 0x58 },
+ { SystemZ::R12D, -SystemZMC::CallFrameSize + 0x60 },
+ { SystemZ::R13D, -SystemZMC::CallFrameSize + 0x68 },
+ { SystemZ::R14D, -SystemZMC::CallFrameSize + 0x70 },
+ { SystemZ::R15D, -SystemZMC::CallFrameSize + 0x78 },
+ { SystemZ::F0D, -SystemZMC::CallFrameSize + 0x80 },
+ { SystemZ::F2D, -SystemZMC::CallFrameSize + 0x88 },
+ { SystemZ::F4D, -SystemZMC::CallFrameSize + 0x90 },
+ { SystemZ::F6D, -SystemZMC::CallFrameSize + 0x98 }
};
} // end anonymous namespace
@@ -49,10 +49,17 @@ SystemZFrameLowering::SystemZFrameLowering()
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(8),
-SystemZMC::CallFrameSize, Align(8),
false /* StackRealignable */) {
+ // Due to the SystemZ ABI, the DWARF CFA (Canonical Frame Address) is not
+ // equal to the incoming stack pointer, but to incoming stack pointer plus
+ // 160. The getOffsetOfLocalArea() returned value is interpreted as "the
+ // offset of the local area from the CFA".
+
// Create a mapping from register number to save slot offset.
+ // These offsets are relative to the start of the register save area.
RegSpillOffsets.grow(SystemZ::NUM_TARGET_REGS);
for (unsigned I = 0, E = array_lengthof(SpillOffsetTable); I != E; ++I)
- RegSpillOffsets[SpillOffsetTable[I].Reg] = SpillOffsetTable[I].Offset;
+ RegSpillOffsets[SpillOffsetTable[I].Reg] =
+ SystemZMC::CallFrameSize + SpillOffsetTable[I].Offset;
}
const TargetFrameLowering::SpillSlot *
OpenPOWER on IntegriCloud