19
19
#include " llvm/ADT/BitVector.h"
20
20
#include " llvm/ADT/StringRef.h"
21
21
#include " llvm/ADT/StringSwitch.h"
22
+ #include " llvm/CodeGen/CFIInstBuilder.h"
22
23
#include " llvm/CodeGen/MachineBasicBlock.h"
23
24
#include " llvm/CodeGen/MachineFrameInfo.h"
24
25
#include " llvm/CodeGen/MachineFunction.h"
33
34
#include " llvm/CodeGen/TargetSubtargetInfo.h"
34
35
#include " llvm/IR/DebugLoc.h"
35
36
#include " llvm/IR/Function.h"
36
- #include " llvm/MC/MCDwarf.h"
37
- #include " llvm/MC/MCRegisterInfo.h"
38
37
#include " llvm/Support/CodeGen.h"
39
38
#include " llvm/Support/ErrorHandling.h"
40
39
#include " llvm/Support/MathExtras.h"
@@ -426,28 +425,23 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
426
425
// No need to allocate space on the stack.
427
426
if (StackSize == 0 && !MFI.adjustsStack ()) return ;
428
427
429
- const MCRegisterInfo *MRI = MF. getContext (). getRegisterInfo ( );
428
+ CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::NoFlags );
430
429
431
430
// Adjust stack.
432
431
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);
439
433
440
434
if (MF.getFunction ().hasFnAttribute (" interrupt" ))
441
435
emitInterruptPrologueStub (MF, MBB);
442
436
443
437
const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo ();
444
438
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);
450
443
444
+ if (!CSI.empty ()) {
451
445
// Iterate over list of callee-saved registers and emit .cfi_offset
452
446
// directives.
453
447
for (const CalleeSavedInfo &I : CSI) {
@@ -457,45 +451,26 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
457
451
// If Reg is a double precision register, emit two cfa_offsets,
458
452
// one for each of the paired single precision registers.
459
453
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);
464
456
465
457
if (!STI.isLittle ())
466
458
std::swap (Reg0, Reg1);
467
459
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 );
477
462
} 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 ;
480
465
481
466
if (!STI.isLittle ())
482
467
std::swap (Reg0, Reg1);
483
468
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 );
493
471
} else {
494
472
// 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);
499
474
}
500
475
}
501
476
}
@@ -513,11 +488,7 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
513
488
// Emit .cfi_offset directives for eh data registers.
514
489
for (int I = 0 ; I < 4 ; ++I) {
515
490
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);
521
492
}
522
493
}
523
494
@@ -527,11 +498,7 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
527
498
BuildMI (MBB, MBBI, dl, TII.get (MOVE), FP).addReg (SP).addReg (ZERO)
528
499
.setMIFlag (MachineInstr::FrameSetup);
529
500
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);
535
502
536
503
if (RegInfo.hasStackRealignment (MF)) {
537
504
// addiu $Reg, $zero, -MaxAlignment
0 commit comments