1919#include " llvm/ADT/BitVector.h"
2020#include " llvm/ADT/StringRef.h"
2121#include " llvm/ADT/StringSwitch.h"
22+ #include " llvm/CodeGen/CFIInstBuilder.h"
2223#include " llvm/CodeGen/MachineBasicBlock.h"
2324#include " llvm/CodeGen/MachineFrameInfo.h"
2425#include " llvm/CodeGen/MachineFunction.h"
3334#include " llvm/CodeGen/TargetSubtargetInfo.h"
3435#include " llvm/IR/DebugLoc.h"
3536#include " llvm/IR/Function.h"
36- #include " llvm/MC/MCDwarf.h"
37- #include " llvm/MC/MCRegisterInfo.h"
3837#include " llvm/Support/CodeGen.h"
3938#include " llvm/Support/ErrorHandling.h"
4039#include " llvm/Support/MathExtras.h"
@@ -426,76 +425,54 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
426425 // No need to allocate space on the stack.
427426 if (StackSize == 0 && !MFI.adjustsStack ()) return ;
428427
429- const MCRegisterInfo *MRI = MF.getContext ().getRegisterInfo ();
428+ CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::NoFlags);
429+ bool NeedsDwarfCFI = MF.needsFrameMoves ();
430430
431431 // Adjust stack.
432432 TII.adjustStackPtr (SP, -StackSize, MBB, MBBI);
433-
434- // emit ".cfi_def_cfa_offset StackSize"
435- unsigned CFIIndex =
436- MF.addFrameInst (MCCFIInstruction::cfiDefCfaOffset (nullptr , StackSize));
437- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
438- .addCFIIndex (CFIIndex);
433+ if (NeedsDwarfCFI)
434+ CFIBuilder.buildDefCFAOffset (StackSize);
439435
440436 if (MF.getFunction ().hasFnAttribute (" interrupt" ))
441437 emitInterruptPrologueStub (MF, MBB);
442438
443439 const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo ();
444440
445- if (!CSI.empty ()) {
446- // Find the instruction past the last instruction that saves a callee-saved
447- // register to the stack.
448- for (unsigned i = 0 ; i < CSI.size (); ++i)
449- ++MBBI;
441+ // Find the instruction past the last instruction that saves a callee-saved
442+ // register to the stack.
443+ std::advance (MBBI, CSI.size ());
444+ CFIBuilder.setInsertPoint (MBBI);
450445
451- // Iterate over list of callee-saved registers and emit .cfi_offset
452- // directives.
446+ // Iterate over list of callee-saved registers and emit .cfi_offset
447+ // directives.
448+ if (NeedsDwarfCFI) {
453449 for (const CalleeSavedInfo &I : CSI) {
454450 int64_t Offset = MFI.getObjectOffset (I.getFrameIdx ());
455451 MCRegister Reg = I.getReg ();
456452
457453 // If Reg is a double precision register, emit two cfa_offsets,
458454 // one for each of the paired single precision registers.
459455 if (Mips::AFGR64RegClass.contains (Reg)) {
460- unsigned Reg0 =
461- MRI->getDwarfRegNum (RegInfo.getSubReg (Reg, Mips::sub_lo), true );
462- unsigned Reg1 =
463- MRI->getDwarfRegNum (RegInfo.getSubReg (Reg, Mips::sub_hi), true );
456+ MCRegister Reg0 = RegInfo.getSubReg (Reg, Mips::sub_lo);
457+ MCRegister Reg1 = RegInfo.getSubReg (Reg, Mips::sub_hi);
464458
465459 if (!STI.isLittle ())
466460 std::swap (Reg0, Reg1);
467461
468- unsigned CFIIndex = MF.addFrameInst (
469- MCCFIInstruction::createOffset (nullptr , Reg0, Offset));
470- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
471- .addCFIIndex (CFIIndex);
472-
473- CFIIndex = MF.addFrameInst (
474- MCCFIInstruction::createOffset (nullptr , Reg1, Offset + 4 ));
475- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
476- .addCFIIndex (CFIIndex);
462+ CFIBuilder.buildOffset (Reg0, Offset);
463+ CFIBuilder.buildOffset (Reg1, Offset + 4 );
477464 } else if (Mips::FGR64RegClass.contains (Reg)) {
478- unsigned Reg0 = MRI-> getDwarfRegNum ( Reg, true ) ;
479- unsigned Reg1 = MRI-> getDwarfRegNum ( Reg, true ) + 1 ;
465+ MCRegister Reg0 = Reg;
466+ MCRegister Reg1 = Reg + 1 ;
480467
481468 if (!STI.isLittle ())
482469 std::swap (Reg0, Reg1);
483470
484- unsigned CFIIndex = MF.addFrameInst (
485- MCCFIInstruction::createOffset (nullptr , Reg0, Offset));
486- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
487- .addCFIIndex (CFIIndex);
488-
489- CFIIndex = MF.addFrameInst (
490- MCCFIInstruction::createOffset (nullptr , Reg1, Offset + 4 ));
491- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
492- .addCFIIndex (CFIIndex);
471+ CFIBuilder.buildOffset (Reg0, Offset);
472+ CFIBuilder.buildOffset (Reg1, Offset + 4 );
493473 } else {
494474 // Reg is either in GPR32 or FGR32.
495- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createOffset (
496- nullptr , MRI->getDwarfRegNum (Reg, true ), Offset));
497- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
498- .addCFIIndex (CFIIndex);
475+ CFIBuilder.buildOffset (Reg, Offset);
499476 }
500477 }
501478 }
@@ -511,13 +488,11 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
511488 }
512489
513490 // Emit .cfi_offset directives for eh data registers.
514- for (int I = 0 ; I < 4 ; ++I) {
515- int64_t Offset = MFI.getObjectOffset (MipsFI->getEhDataRegFI (I));
516- unsigned Reg = MRI->getDwarfRegNum (ABI.GetEhDataReg (I), true );
517- unsigned CFIIndex = MF.addFrameInst (
518- MCCFIInstruction::createOffset (nullptr , Reg, Offset));
519- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
520- .addCFIIndex (CFIIndex);
491+ if (NeedsDwarfCFI) {
492+ for (int I = 0 ; I < 4 ; ++I) {
493+ int64_t Offset = MFI.getObjectOffset (MipsFI->getEhDataRegFI (I));
494+ CFIBuilder.buildOffset (ABI.GetEhDataReg (I), Offset);
495+ }
521496 }
522497 }
523498
@@ -527,11 +502,8 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
527502 BuildMI (MBB, MBBI, dl, TII.get (MOVE), FP).addReg (SP).addReg (ZERO)
528503 .setMIFlag (MachineInstr::FrameSetup);
529504
530- // emit ".cfi_def_cfa_register $fp"
531- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createDefCfaRegister (
532- nullptr , MRI->getDwarfRegNum (FP, true )));
533- BuildMI (MBB, MBBI, dl, TII.get (TargetOpcode::CFI_INSTRUCTION))
534- .addCFIIndex (CFIIndex);
505+ if (NeedsDwarfCFI)
506+ CFIBuilder.buildDefCFARegister (FP);
535507
536508 if (RegInfo.hasStackRealignment (MF)) {
537509 // addiu $Reg, $zero, -MaxAlignment
0 commit comments