mirror of
https://git.proxmox.com/git/llvm-toolchain
synced 2025-06-28 04:56:14 +00:00
77 lines
2.9 KiB
Diff
77 lines
2.9 KiB
Diff
commit c6b09bff5671600f8e764d3847023d0996f328d9
|
|
Author: Luís Marques <luismarques@lowrisc.org>
|
|
Date: Thu Nov 14 18:27:42 2019 +0000
|
|
|
|
[RISCV] Fix wrong CFI directives
|
|
|
|
Summary: Removes CFI CFA directives that could incorrectly propagate
|
|
beyond the basic block they were inteded for. Specifically it removes
|
|
the epilogue CFI directives. See the branch_and_tail_call test for an
|
|
example of the issue. Should fix the stack unwinding issues caused by
|
|
the incorrect directives.
|
|
|
|
Reviewers: asb, lenary, shiva0217
|
|
Reviewed By: lenary
|
|
Tags: #llvm
|
|
Differential Revision: https://reviews.llvm.org/D69723
|
|
|
|
--- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
|
|
+++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
|
|
@@ -205,7 +205,6 @@
|
|
MachineFrameInfo &MFI = MF.getFrameInfo();
|
|
auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>();
|
|
DebugLoc DL = MBBI->getDebugLoc();
|
|
- const RISCVInstrInfo *TII = STI.getInstrInfo();
|
|
unsigned FPReg = getFPReg(STI);
|
|
unsigned SPReg = getSPReg(STI);
|
|
|
|
@@ -225,48 +224,9 @@
|
|
adjustReg(MBB, LastFrameDestroy, DL, SPReg, FPReg, -FPOffset,
|
|
MachineInstr::FrameDestroy);
|
|
}
|
|
-
|
|
- if (hasFP(MF)) {
|
|
- // To find the instruction restoring FP from stack.
|
|
- for (auto &I = LastFrameDestroy; I != MBBI; ++I) {
|
|
- if (I->mayLoad() && I->getOperand(0).isReg()) {
|
|
- unsigned DestReg = I->getOperand(0).getReg();
|
|
- if (DestReg == FPReg) {
|
|
- // If there is frame pointer, after restoring $fp registers, we
|
|
- // need adjust CFA to ($sp - FPOffset).
|
|
- // Emit ".cfi_def_cfa $sp, -FPOffset"
|
|
- unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa(
|
|
- nullptr, RI->getDwarfRegNum(SPReg, true), -FPOffset));
|
|
- BuildMI(MBB, std::next(I), DL,
|
|
- TII->get(TargetOpcode::CFI_INSTRUCTION))
|
|
- .addCFIIndex(CFIIndex);
|
|
- break;
|
|
- }
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- // Add CFI directives for callee-saved registers.
|
|
- const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
|
|
- // Iterate over list of callee-saved registers and emit .cfi_restore
|
|
- // directives.
|
|
- for (const auto &Entry : CSI) {
|
|
- unsigned Reg = Entry.getReg();
|
|
- unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(
|
|
- nullptr, RI->getDwarfRegNum(Reg, true)));
|
|
- BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
|
- .addCFIIndex(CFIIndex);
|
|
- }
|
|
|
|
// Deallocate stack
|
|
adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackSize, MachineInstr::FrameDestroy);
|
|
-
|
|
- // After restoring $sp, we need to adjust CFA to $(sp + 0)
|
|
- // Emit ".cfi_def_cfa_offset 0"
|
|
- unsigned CFIIndex =
|
|
- MF.addFrameInst(MCCFIInstruction::createDefCfaOffset(nullptr, 0));
|
|
- BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
|
- .addCFIIndex(CFIIndex);
|
|
}
|
|
|
|
int RISCVFrameLowering::getFrameIndexReference(const MachineFunction &MF,
|