mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Call frames for intel.
llvm-svn: 33490
This commit is contained in:
parent
ebaec45158
commit
ba1dc7a8c7
@ -995,6 +995,11 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
const Function* Fn = MF.getFunction();
|
||||
const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
|
||||
MachineInstr *MI;
|
||||
MachineDebugInfo *DebugInfo = MFI->getMachineDebugInfo();
|
||||
|
||||
// Prepare for debug frame info.
|
||||
bool hasInfo = DebugInfo && DebugInfo->hasInfo();
|
||||
unsigned FrameLabelId = 0;
|
||||
|
||||
// Get the number of bytes to allocate from the FrameInfo
|
||||
unsigned NumBytes = MFI->getStackSize();
|
||||
@ -1018,6 +1023,12 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
}
|
||||
}
|
||||
|
||||
if (hasInfo) {
|
||||
// Mark effective beginning of when frame pointer becomes valid.
|
||||
FrameLabelId = DebugInfo->NextLabelID();
|
||||
BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(FrameLabelId);
|
||||
}
|
||||
|
||||
if (hasFP(MF)) {
|
||||
// Get the offset of the stack slot for the EBP register... which is
|
||||
// guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
|
||||
@ -1042,6 +1053,38 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
MBB.insert(MBBI, MI);
|
||||
}
|
||||
|
||||
if (hasInfo) {
|
||||
std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves();
|
||||
|
||||
if (NumBytes) {
|
||||
// Show update of SP.
|
||||
MachineLocation SPDst(MachineLocation::VirtualFP);
|
||||
MachineLocation SPSrc(MachineLocation::VirtualFP, -NumBytes);
|
||||
Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
|
||||
} else {
|
||||
MachineLocation SP(StackPtr);
|
||||
Moves.push_back(MachineMove(FrameLabelId, SP, SP));
|
||||
}
|
||||
|
||||
// Add callee saved registers to move list.
|
||||
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
||||
for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
|
||||
int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
|
||||
unsigned Reg = CSI[I].getReg();
|
||||
MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
|
||||
MachineLocation CSSrc(Reg);
|
||||
Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc));
|
||||
}
|
||||
|
||||
// Mark effective beginning of when frame pointer is ready.
|
||||
unsigned ReadyLabelId = DebugInfo->NextLabelID();
|
||||
BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(ReadyLabelId);
|
||||
|
||||
MachineLocation FPDst(hasFP(MF) ? FramePtr : StackPtr);
|
||||
MachineLocation FPSrc(MachineLocation::VirtualFP);
|
||||
Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
|
||||
}
|
||||
|
||||
// If it's main() on Cygwin\Mingw32 we should align stack as well
|
||||
if (Fn->hasExternalLinkage() && Fn->getName() == "main" &&
|
||||
Subtarget->isTargetCygMing()) {
|
||||
@ -1127,6 +1170,14 @@ unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const {
|
||||
return hasFP(MF) ? FramePtr : StackPtr;
|
||||
}
|
||||
|
||||
void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
|
||||
const {
|
||||
// Initial state of the frame pointer is esp.
|
||||
MachineLocation Dst(MachineLocation::VirtualFP);
|
||||
MachineLocation Src(StackPtr, 0);
|
||||
Moves.push_back(MachineMove(0, Dst, Src));
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
unsigned getX86SubSuperRegister(unsigned Reg, MVT::ValueType VT, bool High) {
|
||||
switch (VT) {
|
||||
|
@ -94,6 +94,7 @@ public:
|
||||
// Debug information queries.
|
||||
unsigned getRARegister() const;
|
||||
unsigned getFrameRegister(MachineFunction &MF) const;
|
||||
void getInitialFrameState(std::vector<MachineMove> &Moves) const;
|
||||
};
|
||||
|
||||
// getX86SubSuperRegister - X86 utility function. It returns the sub or super
|
||||
|
Loading…
Reference in New Issue
Block a user