diff options
author | Kai Nacke <kai.peter.nacke@ibm.com> | 2024-04-19 08:09:49 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-19 08:09:49 -0400 |
commit | 7e2c2981fbb9e609886cfbe6c95644ed58b03d08 (patch) | |
tree | 6af7a64efe70081bf5b06385c4614633801b941b /llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | |
parent | 090d03d1c7eef4f9790b9300f19176e8f49151dd (diff) | |
download | llvm-7e2c2981fbb9e609886cfbe6c95644ed58b03d08.zip llvm-7e2c2981fbb9e609886cfbe6c95644ed58b03d08.tar.gz llvm-7e2c2981fbb9e609886cfbe6c95644ed58b03d08.tar.bz2 |
[SystemZ][z/OS] Implement llvm.frameaddr for XPLINK (#89284)
The implementation follows the ELF implementation.
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp index 50ecd6e..6ec46bd 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp @@ -896,6 +896,19 @@ SystemZXPLINKFrameLowering::SystemZXPLINKFrameLowering() RegSpillOffsets[Entry.Reg] = Entry.Offset; } +int SystemZXPLINKFrameLowering::getOrCreateFramePointerSaveIndex( + MachineFunction &MF) const { + SystemZMachineFunctionInfo *ZFI = MF.getInfo<SystemZMachineFunctionInfo>(); + int FI = ZFI->getFramePointerSaveIndex(); + if (!FI) { + MachineFrameInfo &MFFrame = MF.getFrameInfo(); + FI = MFFrame.CreateFixedObject(8, 0, false); + MFFrame.setStackID(FI, TargetStackID::NoAlloc); + ZFI->setFramePointerSaveIndex(FI); + } + return FI; +} + // Checks if the function is a potential candidate for being a XPLeaf routine. static bool isXPLeafCandidate(const MachineFunction &MF) { const MachineFrameInfo &MFFrame = MF.getFrameInfo(); @@ -991,6 +1004,9 @@ bool SystemZXPLINKFrameLowering::assignCalleeSavedSpillSlots( Register HighGPR = 0; int HighOffset = -1; + // Query index of the saved frame pointer. + int FPSI = MFI->getFramePointerSaveIndex(); + for (auto &CS : CSI) { Register Reg = CS.getReg(); int Offset = RegSpillOffsets[Reg]; @@ -1013,7 +1029,10 @@ bool SystemZXPLINKFrameLowering::assignCalleeSavedSpillSlots( // the bottom of the stack and are not truly part of the "normal" stack // frame. Mark the frame index as NoAlloc to indicate it as such. unsigned RegSize = 8; - int FrameIdx = MFFrame.CreateFixedSpillStackObject(RegSize, Offset); + int FrameIdx = + (FPSI && Offset == 0) + ? FPSI + : MFFrame.CreateFixedSpillStackObject(RegSize, Offset); CS.setFrameIdx(FrameIdx); MFFrame.setStackID(FrameIdx, TargetStackID::NoAlloc); } @@ -1467,15 +1486,16 @@ void SystemZXPLINKFrameLowering::determineFrameLayout( StackSize += Regs->getCallFrameSize(); MFFrame.setStackSize(StackSize); - // We now know the stack size. Create the fixed spill stack objects for the - // register save area now. This has no impact on the stack frame layout, as - // this is already computed. However, it makes sure that all callee saved - // registers have a valid frame index assigned. - const unsigned RegSize = MF.getDataLayout().getPointerSize(); - for (auto &CS : MFFrame.getCalleeSavedInfo()) { - int Offset = RegSpillOffsets[CS.getReg()]; - if (Offset >= 0) - CS.setFrameIdx( - MFFrame.CreateFixedSpillStackObject(RegSize, Offset - StackSize)); + // We now know the stack size. Update the stack objects for the register save + // area now. This has no impact on the stack frame layout, as this is already + // computed. However, it makes sure that all callee saved registers have a + // valid offset assigned. + for (int FrameIdx = MFFrame.getObjectIndexBegin(); FrameIdx != 0; + ++FrameIdx) { + if (MFFrame.getStackID(FrameIdx) == TargetStackID::NoAlloc) { + int64_t SPOffset = MFFrame.getObjectOffset(FrameIdx); + SPOffset -= StackSize; + MFFrame.setObjectOffset(FrameIdx, SPOffset); + } } } |