diff options
| author | 2018-08-12 16:59:31 +0000 | |
|---|---|---|
| committer | 2018-08-12 16:59:31 +0000 | |
| commit | 072a3efe7c8d5518a5dad80d7a50ff47d8b80751 (patch) | |
| tree | 71cc11158c6298b2a35fa645bc81fe763a0175bf /gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp | |
| parent | add missing markup; (diff) | |
| download | wireguard-openbsd-072a3efe7c8d5518a5dad80d7a50ff47d8b80751.tar.xz wireguard-openbsd-072a3efe7c8d5518a5dad80d7a50ff47d8b80751.zip | |
Refactor retguard to make adding additional arches easier.
Diffstat (limited to 'gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp')
| -rw-r--r-- | gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 529fa7406a5..4517c3af031 100644 --- a/gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/gnu/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -174,10 +174,10 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) { const Function &F = Fn.getFunction(); const TargetRegisterInfo *TRI = Fn.getSubtarget().getRegisterInfo(); const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering(); + const ReturnProtectorLowering *RPL = TFI->getReturnProtector(); - // Set Return Protector in the frame - if (F.hasFnAttribute("ret-protector")) - Fn.getFrameInfo().setReturnProtector(true); + if (RPL) + RPL->setupReturnProtector(Fn); RS = TRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : nullptr; FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn); @@ -214,17 +214,8 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) { insertPrologEpilogCode(Fn); // Add Return Protectors if using them - if (Fn.getFrameInfo().hasReturnProtector()) { - std::vector<MachineBasicBlock *> ReturnBlocks; - bool insertedGuard = false; - for (auto &MBB: Fn) - if (MBB.isReturnBlock()) - ReturnBlocks.push_back(&MBB); - for (MachineBasicBlock *MBB: ReturnBlocks) - insertedGuard |= TFI->insertReturnProtectorEpilogue(Fn, *MBB); - if (insertedGuard) - TFI->insertReturnProtectorPrologue(Fn, Fn.front()); - } + if (RPL) + RPL->insertReturnProtectors(Fn); // Replace all MO_FrameIndex operands with physical register references // and actual offsets. @@ -312,6 +303,7 @@ void PEI::calculateCallFrameInfo(MachineFunction &Fn) { void PEI::calculateSaveRestoreBlocks(MachineFunction &Fn) { MachineFrameInfo &MFI = Fn.getFrameInfo(); const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering(); + const ReturnProtectorLowering *RPL = TFI->getReturnProtector(); // Even when we do not change any CSR, we still want to insert the // prologue and epilogue of the function. @@ -329,8 +321,8 @@ void PEI::calculateSaveRestoreBlocks(MachineFunction &Fn) { RestoreBlocks.push_back(RestoreBlock); // If we are adding return protectors ensure we can find a free register - if (MFI.hasReturnProtector() && - !TFI->determineReturnProtectorTempRegister(Fn, SaveBlocks, RestoreBlocks)) { + if (RPL && + !RPL->determineReturnProtectorRegister(Fn, SaveBlocks, RestoreBlocks)) { // Shrinkwrapping will prevent finding a free register SaveBlocks.clear(); RestoreBlocks.clear(); @@ -350,8 +342,8 @@ void PEI::calculateSaveRestoreBlocks(MachineFunction &Fn) { RestoreBlocks.push_back(&MBB); } - if (MFI.hasReturnProtector()) - TFI->determineReturnProtectorTempRegister(Fn, SaveBlocks, RestoreBlocks); + if (RPL) + RPL->determineReturnProtectorRegister(Fn, SaveBlocks, RestoreBlocks); } static void assignCalleeSavedSpillSlots(MachineFunction &F, @@ -374,8 +366,8 @@ static void assignCalleeSavedSpillSlots(MachineFunction &F, const TargetFrameLowering *TFI = F.getSubtarget().getFrameLowering(); MachineFrameInfo &MFI = F.getFrameInfo(); - if (MFI.hasReturnProtectorTempRegister()) - CSI.push_back(CalleeSavedInfo(MFI.getReturnProtectorTempRegister())); + if (TFI->getReturnProtector()) + TFI->getReturnProtector()->saveReturnProtectorRegister(F, CSI); if (!TFI->assignCalleeSavedSpillSlots(F, RegInfo, CSI)) { // If target doesn't implement this, use generic code. |
