LLVM
8.0.1
|
#include "XCoreFrameLowering.h"
#include "XCore.h"
#include "XCoreInstrInfo.h"
#include "XCoreMachineFunctionInfo.h"
#include "XCoreSubtarget.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetOptions.h"
#include <algorithm>
Go to the source code of this file.
Functions | |
static bool | isImmU6 (unsigned val) |
static bool | isImmU16 (unsigned val) |
static bool | CompareSSIOffset (const StackSlotInfo &a, const StackSlotInfo &b) |
static void | EmitDefCfaRegister (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, MachineFunction &MF, unsigned DRegNum) |
static void | EmitDefCfaOffset (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int Offset) |
static void | EmitCfiOffset (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, unsigned DRegNum, int Offset) |
static void | IfNeededExtSP (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int OffsetFromTop, int &Adjusted, int FrameSize, bool emitFrameMoves) |
The SP register is moved in steps of 'MaxImmU16' towards the bottom of the frame. More... | |
static void | IfNeededLDAWSP (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int OffsetFromTop, int &RemainingAdj) |
The SP register is moved in steps of 'MaxImmU16' towards the top of the frame. More... | |
static void | GetSpillList (SmallVectorImpl< StackSlotInfo > &SpillList, MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, bool fetchLR, bool fetchFP) |
Creates an ordered list of registers that are spilled during the emitPrologue/emitEpilogue. More... | |
static void | GetEHSpillList (SmallVectorImpl< StackSlotInfo > &SpillList, MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, const Constant *PersonalityFn, const TargetLowering *TL) |
Creates an ordered list of EH info register 'spills'. More... | |
static MachineMemOperand * | getFrameIndexMMO (MachineBasicBlock &MBB, int FrameIndex, MachineMemOperand::Flags flags) |
static void | RestoreSpillList (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int &RemainingAdj, SmallVectorImpl< StackSlotInfo > &SpillList) |
Restore clobbered registers with their spill slot value. More... | |
Variables | |
static const unsigned | FramePtr = XCore::R10 |
static const int | MaxImmU16 = (1<<16) - 1 |
Definition at line 57 of file XCoreFrameLowering.cpp.
Referenced by GetEHSpillList(), and GetSpillList().
|
static |
Definition at line 82 of file XCoreFrameLowering.cpp.
References llvm::MachineFunction::addFrameInst(), llvm::BuildMI(), llvm::MCCFIInstruction::createOffset(), llvm::MCInstrInfo::get(), and llvm::MachineBasicBlock::getParent().
Referenced by llvm::XCoreFrameLowering::emitPrologue().
|
static |
Definition at line 71 of file XCoreFrameLowering.cpp.
References llvm::MachineFunction::addFrameInst(), llvm::BuildMI(), llvm::MCCFIInstruction::createDefCfaOffset(), llvm::MCInstrInfo::get(), and llvm::MachineBasicBlock::getParent().
Referenced by llvm::XCoreFrameLowering::emitPrologue(), and IfNeededExtSP().
|
static |
Definition at line 61 of file XCoreFrameLowering.cpp.
References llvm::MachineFunction::addFrameInst(), llvm::BuildMI(), llvm::MCCFIInstruction::createDefCfaRegister(), and llvm::MCInstrInfo::get().
Referenced by llvm::XCoreFrameLowering::emitPrologue().
|
static |
Creates an ordered list of EH info register 'spills'.
These slots are only used by the unwinder and calls to llvm.eh.return(). Registers are ordered according to their frame offset. As offsets are negative, the largest offsets will be first.
Definition at line 161 of file XCoreFrameLowering.cpp.
References assert(), CompareSSIOffset(), llvm::XCoreFunctionInfo::getEHSpillSlot(), llvm::TargetLoweringBase::getExceptionPointerRegister(), llvm::TargetLoweringBase::getExceptionSelectorRegister(), llvm::MachineFrameInfo::getObjectOffset(), llvm::XCoreFunctionInfo::hasEHSpillSlot(), llvm::SmallVectorTemplateBase< T >::push_back(), and llvm::sort().
Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and llvm::XCoreFrameLowering::emitPrologue().
|
static |
Definition at line 176 of file XCoreFrameLowering.cpp.
References llvm::MachinePointerInfo::getFixedStack(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getMachineMemOperand(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::MachineFrameInfo::getObjectSize(), and llvm::MachineBasicBlock::getParent().
Referenced by llvm::XCoreFrameLowering::emitPrologue(), and RestoreSpillList().
|
static |
Creates an ordered list of registers that are spilled during the emitPrologue/emitEpilogue.
Registers are ordered according to their frame offset. As offsets are negative, the largest offsets will be first.
Definition at line 139 of file XCoreFrameLowering.cpp.
References CompareSSIOffset(), llvm::XCoreFunctionInfo::getFPSpillSlot(), llvm::XCoreFunctionInfo::getLRSpillSlot(), llvm::MachineFrameInfo::getObjectOffset(), llvm::SmallVectorTemplateBase< T >::push_back(), and llvm::sort().
Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and llvm::XCoreFrameLowering::emitPrologue().
|
static |
The SP register is moved in steps of 'MaxImmU16' towards the bottom of the frame.
During these steps, it may be necessary to spill registers. IfNeededExtSP emits the necessary EXTSP instructions to move the SP only as far as to make 'OffsetFromBottom' reachable using an STWSP_lru6.
OffsetFromTop | the spill offset from the top of the frame. | |
[in,out] | Adjusted | the current SP offset from the top of the frame. |
Definition at line 99 of file XCoreFrameLowering.cpp.
References assert(), llvm::BuildMI(), EmitDefCfaOffset(), llvm::MCInstrInfo::get(), isImmU6(), and MaxImmU16.
Referenced by llvm::XCoreFrameLowering::emitPrologue().
|
static |
The SP register is moved in steps of 'MaxImmU16' towards the top of the frame.
During these steps, it may be necessary to re-load registers. IfNeededLDAWSP emits the necessary LDAWSP instructions to move the SP only as far as to make 'OffsetFromTop' reachable using an LDAWSP_lru6.
OffsetFromTop | the spill offset from the top of the frame. | |
[in,out] | RemainingAdj | the current SP offset from the top of the frame. |
Definition at line 122 of file XCoreFrameLowering.cpp.
References assert(), llvm::BuildMI(), llvm::MCInstrInfo::get(), isImmU6(), and MaxImmU16.
Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and RestoreSpillList().
Definition at line 43 of file XCoreFrameLowering.cpp.
References Reg.
Referenced by llvm::XCoreFrameLowering::eliminateCallFramePseudoInstr().
Definition at line 39 of file XCoreFrameLowering.cpp.
Referenced by llvm::XCoreFrameLowering::eliminateCallFramePseudoInstr(), llvm::XCoreFrameLowering::emitEpilogue(), llvm::XCoreFrameLowering::emitPrologue(), IfNeededExtSP(), IfNeededLDAWSP(), and RestoreSpillList().
|
static |
Restore clobbered registers with their spill slot value.
The SP will be adjusted at the same time, thus the SpillList must be ordered with the largest (negative) offsets first.
Definition at line 191 of file XCoreFrameLowering.cpp.
References llvm::MachineInstrBuilder::addMemOperand(), assert(), llvm::BuildMI(), llvm::MCInstrInfo::get(), getFrameIndexMMO(), IfNeededLDAWSP(), isImmU6(), llvm::MachineMemOperand::MOLoad, and llvm::SmallVectorBase::size().
Referenced by llvm::XCoreFrameLowering::emitEpilogue().
Definition at line 35 of file XCoreFrameLowering.cpp.
Referenced by llvm::CodeViewDebug::beginFunctionImpl(), llvm::ARMAsmPrinter::EmitInstruction(), and llvm::ARMAsmPrinter::EmitJumpTableTBInst().
|
static |
Definition at line 36 of file XCoreFrameLowering.cpp.
Referenced by llvm::XCoreFrameLowering::emitPrologue(), IfNeededExtSP(), and IfNeededLDAWSP().