mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-28 07:17:32 +00:00
Remove the nasty LABEL hack with a much less evil one. Now llvm.dbg.func.start implies a stoppoint is set. SelectionDAGISel records a new source line but does not create a ISD::LABEL node for this special stoppoint. Asm printer will magically print this label. This ensures nothing is emitted before.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46635 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -276,6 +276,11 @@ namespace llvm {
|
|||||||
unsigned ForcedAlignBits = 0, bool UseFillExpr = false,
|
unsigned ForcedAlignBits = 0, bool UseFillExpr = false,
|
||||||
unsigned FillValue = 0) const;
|
unsigned FillValue = 0) const;
|
||||||
|
|
||||||
|
/// printLabel - This method prints a local label used by debug and
|
||||||
|
/// exception handling tables.
|
||||||
|
void printLabel(const MachineInstr *MI) const;
|
||||||
|
void printLabel(unsigned Id) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// EmitZeros - Emit a block of zeros.
|
/// EmitZeros - Emit a block of zeros.
|
||||||
///
|
///
|
||||||
@@ -299,10 +304,6 @@ namespace llvm {
|
|||||||
/// instruction that is an inline asm.
|
/// instruction that is an inline asm.
|
||||||
void printInlineAsm(const MachineInstr *MI) const;
|
void printInlineAsm(const MachineInstr *MI) const;
|
||||||
|
|
||||||
/// printLabel - This method prints a local label used by debug and
|
|
||||||
/// exception handling tables.
|
|
||||||
void printLabel(const MachineInstr *MI) const;
|
|
||||||
|
|
||||||
/// printBasicBlockLabel - This method prints the label for the specified
|
/// printBasicBlockLabel - This method prints the label for the specified
|
||||||
/// MachineBasicBlock
|
/// MachineBasicBlock
|
||||||
virtual void printBasicBlockLabel(const MachineBasicBlock *MBB,
|
virtual void printBasicBlockLabel(const MachineBasicBlock *MBB,
|
||||||
|
@@ -1285,6 +1285,10 @@ void AsmPrinter::printLabel(const MachineInstr *MI) const {
|
|||||||
<< "label" << MI->getOperand(0).getImm() << ":\n";
|
<< "label" << MI->getOperand(0).getImm() << ":\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AsmPrinter::printLabel(unsigned Id) const {
|
||||||
|
O << "\n" << TAI->getPrivateGlobalPrefix() << "label" << Id << ":\n";
|
||||||
|
}
|
||||||
|
|
||||||
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
|
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
|
||||||
/// instruction, using the specified assembler variant. Targets should
|
/// instruction, using the specified assembler variant. Targets should
|
||||||
/// overried this to format as appropriate.
|
/// overried this to format as appropriate.
|
||||||
|
@@ -2721,6 +2721,11 @@ public:
|
|||||||
|
|
||||||
// Assumes in correct section after the entry point.
|
// Assumes in correct section after the entry point.
|
||||||
EmitLabel("func_begin", ++SubprogramCount);
|
EmitLabel("func_begin", ++SubprogramCount);
|
||||||
|
|
||||||
|
// Emit label for the implicitly defined dbg.stoppoint at the start of
|
||||||
|
// the function.
|
||||||
|
const SourceLineInfo &LineInfo = MMI->getSourceLines()[0];
|
||||||
|
Asm->printLabel(LineInfo.getLabelID());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EndFunction - Gather and emit post-function debug information.
|
/// EndFunction - Gather and emit post-function debug information.
|
||||||
|
@@ -249,13 +249,6 @@ void PEI::saveCalleeSavedRegisters(MachineFunction &Fn) {
|
|||||||
MachineBasicBlock *MBB = Fn.begin();
|
MachineBasicBlock *MBB = Fn.begin();
|
||||||
MachineBasicBlock::iterator I = MBB->begin();
|
MachineBasicBlock::iterator I = MBB->begin();
|
||||||
|
|
||||||
// Do not insert prologue code before debug LABELs at the start of the
|
|
||||||
// entry block.
|
|
||||||
MachineModuleInfo *MMI = FFI->getMachineModuleInfo();
|
|
||||||
if (MMI && MMI->hasDebugInfo())
|
|
||||||
while (I != MBB->end() && I->isDebugLabel())
|
|
||||||
++I;
|
|
||||||
|
|
||||||
if (!TII.spillCalleeSavedRegisters(*MBB, I, CSI)) {
|
if (!TII.spillCalleeSavedRegisters(*MBB, I, CSI)) {
|
||||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||||
// Add the callee-saved register as live-in. It's killed at the spill.
|
// Add the callee-saved register as live-in. It's killed at the spill.
|
||||||
|
@@ -711,28 +711,7 @@ void ScheduleDAG::EmitNode(SDNode *Node, unsigned InstanceNo,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that we have emitted all operands, emit this instruction itself.
|
if (II.usesCustomDAGSchedInsertionHook())
|
||||||
if (ISD::isDebugLabel(Node) &&
|
|
||||||
!BB->empty() && &MF->front() == BB) {
|
|
||||||
// If we are inserting a debug label and this happens to be the first
|
|
||||||
// debug label in the entry block, it is the "function start" label.
|
|
||||||
// Make sure there are no other instructions before it.
|
|
||||||
unsigned NumLabels = 0;
|
|
||||||
MachineBasicBlock::iterator MBBI = BB->begin();
|
|
||||||
while (MBBI != BB->end()) {
|
|
||||||
// FIXME: This is a nasty short term workaround. For now, we are
|
|
||||||
// assuming there are two debug labels at the beginning of the
|
|
||||||
// entry block: one for dbg_func_start, one for the first
|
|
||||||
// dbg_stoppoint before actual code.
|
|
||||||
if (!MBBI->isDebugLabel() || ++NumLabels > 1)
|
|
||||||
break;
|
|
||||||
++MBBI;
|
|
||||||
}
|
|
||||||
if (NumLabels <= 1)
|
|
||||||
BB->insert(BB->begin(), MI);
|
|
||||||
else
|
|
||||||
BB->push_back(MI);
|
|
||||||
} else if (II.usesCustomDAGSchedInsertionHook())
|
|
||||||
// Insert this instruction into the basic block using a target
|
// Insert this instruction into the basic block using a target
|
||||||
// specific inserter which may returns a new basic block.
|
// specific inserter which may returns a new basic block.
|
||||||
BB = DAG.getTargetLoweringInfo().EmitInstrWithCustomInserter(MI, BB);
|
BB = DAG.getTargetLoweringInfo().EmitInstrWithCustomInserter(MI, BB);
|
||||||
|
@@ -2641,13 +2641,21 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
}
|
}
|
||||||
case Intrinsic::dbg_func_start: {
|
case Intrinsic::dbg_func_start: {
|
||||||
MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
|
MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
|
||||||
|
if (!MMI) return 0;
|
||||||
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
||||||
if (MMI && FSI.getSubprogram() &&
|
Value *SP = FSI.getSubprogram();
|
||||||
MMI->Verify(FSI.getSubprogram())) {
|
if (SP && MMI->Verify(SP)) {
|
||||||
unsigned LabelID = MMI->RecordRegionStart(FSI.getSubprogram());
|
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
||||||
DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
|
// what (most?) gdb expects.
|
||||||
DAG.getConstant(LabelID, MVT::i32),
|
DebugInfoDesc *DD = MMI->getDescFor(SP);
|
||||||
DAG.getConstant(0, MVT::i32)));
|
assert(DD && "Not a debug information descriptor");
|
||||||
|
SubprogramDesc *Subprogram = cast<SubprogramDesc>(DD);
|
||||||
|
const CompileUnitDesc *CompileUnit = Subprogram->getFile();
|
||||||
|
unsigned SrcFile = MMI->RecordSource(CompileUnit->getDirectory(),
|
||||||
|
CompileUnit->getFileName());
|
||||||
|
// Record the source line but does create a label. It will be emitted
|
||||||
|
// at asm emission time.
|
||||||
|
MMI->RecordSourceLine(Subprogram->getLine(), 0, SrcFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -712,16 +712,6 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
// Prepare for frame info.
|
// Prepare for frame info.
|
||||||
unsigned FrameLabelId = 0;
|
unsigned FrameLabelId = 0;
|
||||||
|
|
||||||
// Skip over the debug labels which mark the beginning of the function.
|
|
||||||
if (MMI && MMI->needsFrameInfo()) {
|
|
||||||
unsigned NumLabels = 0;
|
|
||||||
while (NumLabels <= 1 &&
|
|
||||||
MBBI != MBB.end() && MBBI->isDebugLabel()) {
|
|
||||||
++NumLabels;
|
|
||||||
++MBBI;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it,
|
// Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it,
|
||||||
// process it.
|
// process it.
|
||||||
for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) {
|
for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) {
|
||||||
|
@@ -525,16 +525,6 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta));
|
X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta));
|
||||||
uint64_t NumBytes = StackSize - X86FI->getCalleeSavedFrameSize();
|
uint64_t NumBytes = StackSize - X86FI->getCalleeSavedFrameSize();
|
||||||
|
|
||||||
// Skip over the debug labels which mark the beginning of the function.
|
|
||||||
if (MMI && MMI->needsFrameInfo()) {
|
|
||||||
unsigned NumLabels = 0;
|
|
||||||
while (NumLabels <= 1 &&
|
|
||||||
MBBI != MBB.end() && MBBI->isDebugLabel()) {
|
|
||||||
++NumLabels;
|
|
||||||
++MBBI;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert stack pointer adjustment for later moving of return addr. Only
|
// Insert stack pointer adjustment for later moving of return addr. Only
|
||||||
// applies to tail call optimized functions where the callee argument stack
|
// applies to tail call optimized functions where the callee argument stack
|
||||||
// size is bigger than the callers.
|
// size is bigger than the callers.
|
||||||
|
Reference in New Issue
Block a user