From 1b08bbca5592351a940bcd164bdec724ee954326 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 1 Feb 2008 09:10:45 +0000 Subject: [PATCH] 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 --- include/llvm/CodeGen/AsmPrinter.h | 9 ++++---- lib/CodeGen/AsmPrinter.cpp | 4 ++++ lib/CodeGen/DwarfWriter.cpp | 5 ++++ lib/CodeGen/PrologEpilogInserter.cpp | 7 ------ lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 23 +------------------ lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 20 +++++++++++----- lib/Target/PowerPC/PPCRegisterInfo.cpp | 10 -------- lib/Target/X86/X86RegisterInfo.cpp | 10 -------- 8 files changed, 29 insertions(+), 59 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 3d1344e2a25..cda213cbb99 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -276,6 +276,11 @@ namespace llvm { unsigned ForcedAlignBits = 0, bool UseFillExpr = false, 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: /// EmitZeros - Emit a block of zeros. /// @@ -299,10 +304,6 @@ namespace llvm { /// instruction that is an inline asm. 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 /// MachineBasicBlock virtual void printBasicBlockLabel(const MachineBasicBlock *MBB, diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 2b83588f9e3..2acf287988b 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -1285,6 +1285,10 @@ void AsmPrinter::printLabel(const MachineInstr *MI) const { << "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 /// instruction, using the specified assembler variant. Targets should /// overried this to format as appropriate. diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index de5709622bf..96f7c191df1 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2721,6 +2721,11 @@ public: // Assumes in correct section after the entry point. 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. diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index 34cbb2b0778..41efbef54e2 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -249,13 +249,6 @@ void PEI::saveCalleeSavedRegisters(MachineFunction &Fn) { MachineBasicBlock *MBB = Fn.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)) { for (unsigned i = 0, e = CSI.size(); i != e; ++i) { // Add the callee-saved register as live-in. It's killed at the spill. diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index aad1f87ed9e..3ecd623c813 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -711,28 +711,7 @@ void ScheduleDAG::EmitNode(SDNode *Node, unsigned InstanceNo, } } - // Now that we have emitted all operands, emit this instruction itself. - 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()) + if (II.usesCustomDAGSchedInsertionHook()) // Insert this instruction into the basic block using a target // specific inserter which may returns a new basic block. BB = DAG.getTargetLoweringInfo().EmitInstrWithCustomInserter(MI, BB); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 4d1e7ebefbd..2d883878ce5 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2641,13 +2641,21 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { } case Intrinsic::dbg_func_start: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); + if (!MMI) return 0; DbgFuncStartInst &FSI = cast(I); - if (MMI && FSI.getSubprogram() && - MMI->Verify(FSI.getSubprogram())) { - unsigned LabelID = MMI->RecordRegionStart(FSI.getSubprogram()); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), - DAG.getConstant(LabelID, MVT::i32), - DAG.getConstant(0, MVT::i32))); + Value *SP = FSI.getSubprogram(); + if (SP && MMI->Verify(SP)) { + // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is + // what (most?) gdb expects. + DebugInfoDesc *DD = MMI->getDescFor(SP); + assert(DD && "Not a debug information descriptor"); + SubprogramDesc *Subprogram = cast(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; diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index fa218263bc2..efed0727860 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -712,16 +712,6 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { // Prepare for frame info. 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, // process it. for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) { diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index 5f9f290ae7e..a0ffd33b21f 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -525,16 +525,6 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { X86FI->getCalleeSavedFrameSize() +(-TailCallReturnAddrDelta)); 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 // applies to tail call optimized functions where the callee argument stack // size is bigger than the callers.