diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 103 |
1 files changed, 50 insertions, 53 deletions
diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index 274a125126a..c35cd23b91c 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -179,24 +179,22 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { if (ArgRegsSaveSize) { emitSPUpdate(isARM, MBB, MBBI, dl, TII, -ArgRegsSaveSize, MachineInstr::FrameSetup); - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); CFAOffset -= ArgRegsSaveSize; - MMI.addFrameInst( - MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } if (!AFI->hasStackFrame()) { if (NumBytes - ArgRegsSaveSize != 0) { emitSPUpdate(isARM, MBB, MBBI, dl, TII, -(NumBytes - ArgRegsSaveSize), MachineInstr::FrameSetup); - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); CFAOffset -= NumBytes - ArgRegsSaveSize; - MMI.addFrameInst(MCCFIInstruction::createDefCfaOffset(SPLabel, - CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } return; } @@ -311,12 +309,12 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { } if (adjustedGPRCS1Size > 0) { - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, ++GPRCS1Push, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); CFAOffset -= adjustedGPRCS1Size; - MMI.addFrameInst( - MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + MachineBasicBlock::iterator Pos = ++GPRCS1Push; + BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), E = CSI.end(); I != E; ++I) { unsigned Reg = I->getReg(); @@ -339,9 +337,10 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { case ARM::R6: case ARM::R7: case ARM::LR: - MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, - MRI->getDwarfRegNum(Reg, true), - MFI->getObjectOffset(FI))); + CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset( + nullptr, MRI->getDwarfRegNum(Reg, true), MFI->getObjectOffset(FI))); + BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); break; } } @@ -357,28 +356,30 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { emitRegPlusImmediate(!AFI->isThumbFunction(), MBB, GPRCS1Push, dl, TII, FramePtr, ARM::SP, FramePtrOffsetInPush, MachineInstr::FrameSetup); - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); if (FramePtrOffsetInPush) { CFAOffset += FramePtrOffsetInPush; - MMI.addFrameInst( - MCCFIInstruction::createDefCfa(SPLabel, - MRI->getDwarfRegNum(FramePtr, true), CFAOffset)); - } else - MMI.addFrameInst( - MCCFIInstruction::createDefCfaRegister(SPLabel, - MRI->getDwarfRegNum(FramePtr, true))); + unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createDefCfa( + nullptr, MRI->getDwarfRegNum(FramePtr, true), CFAOffset)); + BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); + + } else { + unsigned CFIIndex = + MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister( + nullptr, MRI->getDwarfRegNum(FramePtr, true))); + BuildMI(MBB, GPRCS1Push, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); + } } if (GPRCS2Size > 0) { - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, ++GPRCS2Push, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); + MachineBasicBlock::iterator Pos = ++GPRCS2Push; if (!HasFP) { CFAOffset -= GPRCS2Size; - MMI.addFrameInst( - MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), E = CSI.end(); I != E; ++I) { @@ -393,8 +394,10 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { if (STI.isTargetMachO()) { unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned Offset = MFI->getObjectOffset(FI); - MMI.addFrameInst( - MCCFIInstruction::createOffset(SPLabel, DwarfReg, Offset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset)); + BuildMI(MBB, Pos, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } break; } @@ -404,24 +407,17 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { if (DPRCSSize > 0) { // Since vpush register list cannot have gaps, there may be multiple vpush // instructions in the prologue. - MCSymbol *SPLabel = NULL; do { MachineBasicBlock::iterator Push = DPRCSPush++; if (!HasFP) { - SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); CFAOffset -= sizeOfSPAdjustment(Push);; - MMI.addFrameInst( - MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } } while (DPRCSPush->getOpcode() == ARM::VSTMDDB_UPD); - if (!SPLabel) { - SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); - } for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), E = CSI.end(); I != E; ++I) { unsigned Reg = I->getReg(); @@ -430,20 +426,21 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const { (Reg < ARM::D8 || Reg >= ARM::D8 + AFI->getNumAlignedDPRCS2Regs())) { unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true); unsigned Offset = MFI->getObjectOffset(FI); - MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel, DwarfReg, - Offset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createOffset(nullptr, DwarfReg, Offset)); + BuildMI(MBB, DPRCSPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } } } if (NumBytes) { if (!HasFP) { - MCSymbol *SPLabel = Context.CreateTempSymbol(); - BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)) - .addSym(SPLabel); CFAOffset -= NumBytes; - MMI.addFrameInst( - MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset)); + unsigned CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, CFAOffset)); + BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) + .addCFIIndex(CFIIndex); } } |