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,28 +425,23 @@ 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 );
430429
431430 // Adjust stack.
432431 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);
432+ CFIBuilder.buildDefCFAOffset (StackSize);
439433
440434 if (MF.getFunction ().hasFnAttribute (" interrupt" ))
441435 emitInterruptPrologueStub (MF, MBB);
442436
443437 const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo ();
444438
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;
439+ // Find the instruction past the last instruction that saves a callee-saved
440+ // register to the stack.
441+ std::advance (MBBI, CSI.size ());
442+ CFIBuilder.setInsertPoint (MBBI);
450443
444+ if (!CSI.empty ()) {
451445 // Iterate over list of callee-saved registers and emit .cfi_offset
452446 // directives.
453447 for (const CalleeSavedInfo &I : CSI) {
@@ -457,45 +451,26 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
457451 // If Reg is a double precision register, emit two cfa_offsets,
458452 // one for each of the paired single precision registers.
459453 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 );
454+ MCRegister Reg0 = RegInfo.getSubReg (Reg, Mips::sub_lo);
455+ MCRegister Reg1 = RegInfo.getSubReg (Reg, Mips::sub_hi);
464456
465457 if (!STI.isLittle ())
466458 std::swap (Reg0, Reg1);
467459
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);
460+ CFIBuilder.buildOffset (Reg0, Offset);
461+ CFIBuilder.buildOffset (Reg1, Offset + 4 );
477462 } else if (Mips::FGR64RegClass.contains (Reg)) {
478- unsigned Reg0 = MRI-> getDwarfRegNum ( Reg, true ) ;
479- unsigned Reg1 = MRI-> getDwarfRegNum ( Reg, true ) + 1 ;
463+ MCRegister Reg0 = Reg;
464+ MCRegister Reg1 = Reg + 1 ;
480465
481466 if (!STI.isLittle ())
482467 std::swap (Reg0, Reg1);
483468
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);
469+ CFIBuilder.buildOffset (Reg0, Offset);
470+ CFIBuilder.buildOffset (Reg1, Offset + 4 );
493471 } else {
494472 // 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);
473+ CFIBuilder.buildOffset (Reg, Offset);
499474 }
500475 }
501476 }
@@ -513,11 +488,7 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
513488 // Emit .cfi_offset directives for eh data registers.
514489 for (int I = 0 ; I < 4 ; ++I) {
515490 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+ CFIBuilder.buildOffset (ABI.GetEhDataReg (I), Offset);
521492 }
522493 }
523494
@@ -527,11 +498,7 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
527498 BuildMI (MBB, MBBI, dl, TII.get (MOVE), FP).addReg (SP).addReg (ZERO)
528499 .setMIFlag (MachineInstr::FrameSetup);
529500
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);
501+ CFIBuilder.buildDefCFARegister (FP);
535502
536503 if (RegInfo.hasStackRealignment (MF)) {
537504 // addiu $Reg, $zero, -MaxAlignment
0 commit comments