diff options
| author | 2017-01-24 08:32:59 +0000 | |
|---|---|---|
| committer | 2017-01-24 08:32:59 +0000 | |
| commit | 53d771aafdbe5b919f264f53cba3788e2c4cffd2 (patch) | |
| tree | 7eca39498be0ff1e3a6daf583cd9ca5886bb2636 /gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp | |
| parent | In preparation of compiling our kernels with -ffreestanding, explicitly map (diff) | |
| download | wireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.tar.xz wireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.zip | |
Import LLVM 4.0.0 rc1 including clang and lld to help the current
development effort on OpenBSD/arm64.
Diffstat (limited to 'gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp')
| -rw-r--r-- | gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp | 110 |
1 files changed, 55 insertions, 55 deletions
diff --git a/gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp b/gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp index 75a2eb0fdd2..e0e2e031996 100644 --- a/gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp +++ b/gnu/llvm/lib/Target/XCore/XCoreFrameLowering.cpp @@ -61,8 +61,8 @@ static bool CompareSSIOffset(const StackSlotInfo& a, const StackSlotInfo& b) { static void EmitDefCfaRegister(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, - MachineModuleInfo *MMI, unsigned DRegNum) { - unsigned CFIIndex = MMI->addFrameInst( + MachineFunction &MF, unsigned DRegNum) { + unsigned CFIIndex = MF.addFrameInst( MCCFIInstruction::createDefCfaRegister(nullptr, DRegNum)); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) .addCFIIndex(CFIIndex); @@ -71,18 +71,20 @@ static void EmitDefCfaRegister(MachineBasicBlock &MBB, static void EmitDefCfaOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, - MachineModuleInfo *MMI, int Offset) { + int Offset) { + MachineFunction &MF = *MBB.getParent(); unsigned CFIIndex = - MMI->addFrameInst(MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); + MF.addFrameInst(MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) .addCFIIndex(CFIIndex); } static void EmitCfiOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, - const TargetInstrInfo &TII, MachineModuleInfo *MMI, - unsigned DRegNum, int Offset) { - unsigned CFIIndex = MMI->addFrameInst( + const TargetInstrInfo &TII, unsigned DRegNum, + int Offset) { + MachineFunction &MF = *MBB.getParent(); + unsigned CFIIndex = MF.addFrameInst( MCCFIInstruction::createOffset(nullptr, DRegNum, Offset)); BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION)) .addCFIIndex(CFIIndex); @@ -96,9 +98,8 @@ static void EmitCfiOffset(MachineBasicBlock &MBB, /// \param [in,out] Adjusted the current SP offset from the top of the frame. static void IfNeededExtSP(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, - const TargetInstrInfo &TII, MachineModuleInfo *MMI, - int OffsetFromTop, int &Adjusted, int FrameSize, - bool emitFrameMoves) { + const TargetInstrInfo &TII, int OffsetFromTop, + int &Adjusted, int FrameSize, bool emitFrameMoves) { while (OffsetFromTop > Adjusted) { assert(Adjusted < FrameSize && "OffsetFromTop is beyond FrameSize"); int remaining = FrameSize - Adjusted; @@ -107,7 +108,7 @@ static void IfNeededExtSP(MachineBasicBlock &MBB, BuildMI(MBB, MBBI, dl, TII.get(Opcode)).addImm(OpImm); Adjusted += OpImm; if (emitFrameMoves) - EmitDefCfaOffset(MBB, MBBI, dl, TII, MMI, Adjusted*4); + EmitDefCfaOffset(MBB, MBBI, dl, TII, Adjusted*4); } } @@ -136,16 +137,16 @@ static void IfNeededLDAWSP(MachineBasicBlock &MBB, /// Registers are ordered according to their frame offset. /// As offsets are negative, the largest offsets will be first. static void GetSpillList(SmallVectorImpl<StackSlotInfo> &SpillList, - MachineFrameInfo *MFI, XCoreFunctionInfo *XFI, + MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, bool fetchLR, bool fetchFP) { if (fetchLR) { - int Offset = MFI->getObjectOffset(XFI->getLRSpillSlot()); + int Offset = MFI.getObjectOffset(XFI->getLRSpillSlot()); SpillList.push_back(StackSlotInfo(XFI->getLRSpillSlot(), Offset, XCore::LR)); } if (fetchFP) { - int Offset = MFI->getObjectOffset(XFI->getFPSpillSlot()); + int Offset = MFI.getObjectOffset(XFI->getFPSpillSlot()); SpillList.push_back(StackSlotInfo(XFI->getFPSpillSlot(), Offset, FramePtr)); @@ -158,16 +159,16 @@ static void GetSpillList(SmallVectorImpl<StackSlotInfo> &SpillList, /// Registers are ordered according to their frame offset. /// As offsets are negative, the largest offsets will be first. static void GetEHSpillList(SmallVectorImpl<StackSlotInfo> &SpillList, - MachineFrameInfo *MFI, XCoreFunctionInfo *XFI, + MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, const Constant *PersonalityFn, const TargetLowering *TL) { assert(XFI->hasEHSpillSlot() && "There are no EH register spill slots"); const int *EHSlot = XFI->getEHSpillSlot(); SpillList.push_back( - StackSlotInfo(EHSlot[0], MFI->getObjectOffset(EHSlot[0]), + StackSlotInfo(EHSlot[0], MFI.getObjectOffset(EHSlot[0]), TL->getExceptionPointerRegister(PersonalityFn))); SpillList.push_back( - StackSlotInfo(EHSlot[0], MFI->getObjectOffset(EHSlot[1]), + StackSlotInfo(EHSlot[0], MFI.getObjectOffset(EHSlot[1]), TL->getExceptionSelectorRegister(PersonalityFn))); std::sort(SpillList.begin(), SpillList.end(), CompareSSIOffset); } @@ -176,7 +177,7 @@ static MachineMemOperand *getFrameIndexMMO(MachineBasicBlock &MBB, int FrameIndex, MachineMemOperand::Flags flags) { MachineFunction *MF = MBB.getParent(); - const MachineFrameInfo &MFI = *MF->getFrameInfo(); + const MachineFrameInfo &MFI = MF->getFrameInfo(); MachineMemOperand *MMO = MF->getMachineMemOperand( MachinePointerInfo::getFixedStack(*MF, FrameIndex), flags, MFI.getObjectSize(FrameIndex), MFI.getObjectAlignment(FrameIndex)); @@ -217,14 +218,14 @@ XCoreFrameLowering::XCoreFrameLowering(const XCoreSubtarget &sti) bool XCoreFrameLowering::hasFP(const MachineFunction &MF) const { return MF.getTarget().Options.DisableFramePointerElim(MF) || - MF.getFrameInfo()->hasVarSizedObjects(); + MF.getFrameInfo().hasVarSizedObjects(); } void XCoreFrameLowering::emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const { assert(&MF.front() == &MBB && "Shrink-wrapping not yet supported"); MachineBasicBlock::iterator MBBI = MBB.begin(); - MachineFrameInfo *MFI = MF.getFrameInfo(); + MachineFrameInfo &MFI = MF.getFrameInfo(); MachineModuleInfo *MMI = &MF.getMMI(); const MCRegisterInfo *MRI = MMI->getContext().getRegisterInfo(); const XCoreInstrInfo &TII = *MF.getSubtarget<XCoreSubtarget>().getInstrInfo(); @@ -233,9 +234,9 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, // to determine the end of the prologue. DebugLoc dl; - if (MFI->getMaxAlignment() > getStackAlignment()) + if (MFI.getMaxAlignment() > getStackAlignment()) report_fatal_error("emitPrologue unsupported alignment: " - + Twine(MFI->getMaxAlignment())); + + Twine(MFI.getMaxAlignment())); const AttributeSet &PAL = MF.getFunction()->getAttributes(); if (PAL.hasAttrSomewhere(Attribute::Nest)) @@ -244,13 +245,13 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, // Work out frame sizes. // We will adjust the SP in stages towards the final FrameSize. - assert(MFI->getStackSize()%4 == 0 && "Misaligned frame size"); - const int FrameSize = MFI->getStackSize() / 4; + assert(MFI.getStackSize()%4 == 0 && "Misaligned frame size"); + const int FrameSize = MFI.getStackSize() / 4; int Adjusted = 0; bool saveLR = XFI->hasLRSpillSlot(); bool UseENTSP = saveLR && FrameSize - && (MFI->getObjectOffset(XFI->getLRSpillSlot()) == 0); + && (MFI.getObjectOffset(XFI->getLRSpillSlot()) == 0); if (UseENTSP) saveLR = false; bool FP = hasFP(MF); @@ -266,9 +267,9 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, MIB->addRegisterKilled(XCore::LR, MF.getSubtarget().getRegisterInfo(), true); if (emitFrameMoves) { - EmitDefCfaOffset(MBB, MBBI, dl, TII, MMI, Adjusted*4); + EmitDefCfaOffset(MBB, MBBI, dl, TII, Adjusted*4); unsigned DRegNum = MRI->getDwarfRegNum(XCore::LR, true); - EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, 0); + EmitCfiOffset(MBB, MBBI, dl, TII, DRegNum, 0); } } @@ -281,7 +282,7 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, assert(SpillList[i].Offset % 4 == 0 && "Misaligned stack offset"); assert(SpillList[i].Offset <= 0 && "Unexpected positive stack offset"); int OffsetFromTop = - SpillList[i].Offset/4; - IfNeededExtSP(MBB, MBBI, dl, TII, MMI, OffsetFromTop, Adjusted, FrameSize, + IfNeededExtSP(MBB, MBBI, dl, TII, OffsetFromTop, Adjusted, FrameSize, emitFrameMoves); int Offset = Adjusted - OffsetFromTop; int Opcode = isImmU6(Offset) ? XCore::STWSP_ru6 : XCore::STWSP_lru6; @@ -293,12 +294,12 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, MachineMemOperand::MOStore)); if (emitFrameMoves) { unsigned DRegNum = MRI->getDwarfRegNum(SpillList[i].Reg, true); - EmitCfiOffset(MBB, MBBI, dl, TII, MMI, DRegNum, SpillList[i].Offset); + EmitCfiOffset(MBB, MBBI, dl, TII, DRegNum, SpillList[i].Offset); } } // Complete any remaining Stack adjustment. - IfNeededExtSP(MBB, MBBI, dl, TII, MMI, FrameSize, Adjusted, FrameSize, + IfNeededExtSP(MBB, MBBI, dl, TII, FrameSize, Adjusted, FrameSize, emitFrameMoves); assert(Adjusted==FrameSize && "IfNeededExtSP has not completed adjustment"); @@ -306,7 +307,7 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, // Set the FP from the SP. BuildMI(MBB, MBBI, dl, TII.get(XCore::LDAWSP_ru6), FramePtr).addImm(0); if (emitFrameMoves) - EmitDefCfaRegister(MBB, MBBI, dl, TII, MMI, + EmitDefCfaRegister(MBB, MBBI, dl, TII, MF, MRI->getDwarfRegNum(FramePtr, true)); } @@ -316,9 +317,9 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, MachineBasicBlock::iterator Pos = SpillLabel.first; ++Pos; const CalleeSavedInfo &CSI = SpillLabel.second; - int Offset = MFI->getObjectOffset(CSI.getFrameIdx()); + int Offset = MFI.getObjectOffset(CSI.getFrameIdx()); unsigned DRegNum = MRI->getDwarfRegNum(CSI.getReg(), true); - EmitCfiOffset(MBB, Pos, dl, TII, MMI, DRegNum, Offset); + EmitCfiOffset(MBB, Pos, dl, TII, DRegNum, Offset); } if (XFI->hasEHSpillSlot()) { // The unwinder requires stack slot & CFI offsets for the exception info. @@ -330,10 +331,10 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, GetEHSpillList(SpillList, MFI, XFI, PersonalityFn, MF.getSubtarget().getTargetLowering()); assert(SpillList.size()==2 && "Unexpected SpillList size"); - EmitCfiOffset(MBB, MBBI, dl, TII, MMI, + EmitCfiOffset(MBB, MBBI, dl, TII, MRI->getDwarfRegNum(SpillList[0].Reg, true), SpillList[0].Offset); - EmitCfiOffset(MBB, MBBI, dl, TII, MMI, + EmitCfiOffset(MBB, MBBI, dl, TII, MRI->getDwarfRegNum(SpillList[1].Reg, true), SpillList[1].Offset); } @@ -342,7 +343,7 @@ void XCoreFrameLowering::emitPrologue(MachineFunction &MF, void XCoreFrameLowering::emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const { - MachineFrameInfo *MFI = MF.getFrameInfo(); + MachineFrameInfo &MFI = MF.getFrameInfo(); MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr(); const XCoreInstrInfo &TII = *MF.getSubtarget<XCoreSubtarget>().getInstrInfo(); XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>(); @@ -351,7 +352,7 @@ void XCoreFrameLowering::emitEpilogue(MachineFunction &MF, // Work out frame sizes. // We will adjust the SP in stages towards the final FrameSize. - int RemainingAdj = MFI->getStackSize(); + int RemainingAdj = MFI.getStackSize(); assert(RemainingAdj%4 == 0 && "Misaligned frame size"); RemainingAdj /= 4; @@ -377,7 +378,7 @@ void XCoreFrameLowering::emitEpilogue(MachineFunction &MF, bool restoreLR = XFI->hasLRSpillSlot(); bool UseRETSP = restoreLR && RemainingAdj - && (MFI->getObjectOffset(XFI->getLRSpillSlot()) == 0); + && (MFI.getObjectOffset(XFI->getLRSpillSlot()) == 0); if (UseRETSP) restoreLR = false; bool FP = hasFP(MF); @@ -490,8 +491,8 @@ MachineBasicBlock::iterator XCoreFrameLowering::eliminateCallFramePseudoInstr( if (!hasReservedCallFrame(MF)) { // Turn the adjcallstackdown instruction into 'extsp <amt>' and the // adjcallstackup instruction into 'ldaw sp, sp[<amt>]' - MachineInstr *Old = I; - uint64_t Amount = Old->getOperand(0).getImm(); + MachineInstr &Old = *I; + uint64_t Amount = Old.getOperand(0).getImm(); if (Amount != 0) { // We need to keep the stack aligned properly. To do this, we round the // amount of space needed for the outgoing arguments up to the next @@ -513,15 +514,14 @@ MachineBasicBlock::iterator XCoreFrameLowering::eliminateCallFramePseudoInstr( } MachineInstr *New; - if (Old->getOpcode() == XCore::ADJCALLSTACKDOWN) { + if (Old.getOpcode() == XCore::ADJCALLSTACKDOWN) { int Opcode = isU6 ? XCore::EXTSP_u6 : XCore::EXTSP_lu6; - New=BuildMI(MF, Old->getDebugLoc(), TII.get(Opcode)) - .addImm(Amount); + New = BuildMI(MF, Old.getDebugLoc(), TII.get(Opcode)).addImm(Amount); } else { - assert(Old->getOpcode() == XCore::ADJCALLSTACKUP); + assert(Old.getOpcode() == XCore::ADJCALLSTACKUP); int Opcode = isU6 ? XCore::LDAWSP_ru6 : XCore::LDAWSP_lru6; - New=BuildMI(MF, Old->getDebugLoc(), TII.get(Opcode), XCore::SP) - .addImm(Amount); + New = BuildMI(MF, Old.getDebugLoc(), TII.get(Opcode), XCore::SP) + .addImm(Amount); } // Replace the pseudo instruction with a new instruction... @@ -543,12 +543,12 @@ void XCoreFrameLowering::determineCalleeSaves(MachineFunction &MF, bool LRUsed = MRI.isPhysRegModified(XCore::LR); if (!LRUsed && !MF.getFunction()->isVarArg() && - MF.getFrameInfo()->estimateStackSize(MF)) + MF.getFrameInfo().estimateStackSize(MF)) // If we need to extend the stack it is more efficient to use entsp / retsp. // We force the LR to be saved so these instructions are used. LRUsed = true; - if (MF.getMMI().callsUnwindInit() || MF.getMMI().callsEHReturn()) { + if (MF.callsUnwindInit() || MF.callsEHReturn()) { // The unwinder expects to find spill slots for the exception info regs R0 // & R1. These are used during llvm.eh.return() to 'restore' the exception // info. N.B. we do not spill or restore R0, R1 during normal operation. @@ -574,7 +574,7 @@ void XCoreFrameLowering:: processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS) const { assert(RS && "requiresRegisterScavenging failed"); - MachineFrameInfo *MFI = MF.getFrameInfo(); + MachineFrameInfo &MFI = MF.getFrameInfo(); const TargetRegisterClass *RC = &XCore::GRRegsRegClass; XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>(); // Reserve slots close to SP or frame pointer for Scavenging spills. @@ -582,11 +582,11 @@ processFunctionBeforeFrameFinalized(MachineFunction &MF, // When using SP for large frames, we may need 2 scratch registers. // When using FP, for large or small frames, we may need 1 scratch register. if (XFI->isLargeFrame(MF) || hasFP(MF)) - RS->addScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(), - RC->getAlignment(), - false)); + RS->addScavengingFrameIndex(MFI.CreateStackObject(RC->getSize(), + RC->getAlignment(), + false)); if (XFI->isLargeFrame(MF) && !hasFP(MF)) - RS->addScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(), - RC->getAlignment(), - false)); + RS->addScavengingFrameIndex(MFI.CreateStackObject(RC->getSize(), + RC->getAlignment(), + false)); } |
