From d38fee8ddc6597555904b82b6471a446cc5fe183 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 5 Apr 2010 00:13:49 +0000 Subject: [PATCH] 1) make DIE take AsmPrinter instead of DwarfPrinter. 2) change DwarfDebug to not inherit from DwarfPrinter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100372 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 17 ++- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 7 + lib/CodeGen/AsmPrinter/DIE.cpp | 47 +++---- lib/CodeGen/AsmPrinter/DIE.h | 17 ++- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 185 +++++++++++++------------ lib/CodeGen/AsmPrinter/DwarfDebug.h | 8 +- lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 2 +- 7 files changed, 152 insertions(+), 131 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 92a9a08dbe7..e827109a538 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -51,6 +51,7 @@ namespace llvm { class Mangler; class MCAsmInfo; class TargetLoweringObjectFile; + class TargetData; class Twine; class Type; @@ -95,12 +96,6 @@ namespace llvm { /// MCSymbol *CurrentFnSym; - /// getObjFileLowering - Return information about object file lowering. - TargetLoweringObjectFile &getObjFileLowering() const; - - /// getCurrentSection() - Return the current section we are emitting to. - const MCSection *getCurrentSection() const; - private: // GCMetadataPrinters - The garbage collection metadata printer table. void *GCMetadataPrinters; // Really a DenseMap. @@ -129,6 +124,16 @@ namespace llvm { /// unsigned getFunctionNumber() const; + /// getObjFileLowering - Return information about object file lowering. + TargetLoweringObjectFile &getObjFileLowering() const; + + /// getTargetData - Return information about data layout. + const TargetData &getTargetData() const; + + /// getCurrentSection() - Return the current section we are emitting to. + const MCSection *getCurrentSection() const; + + //===------------------------------------------------------------------===// // MachineFunctionPass Implementation. //===------------------------------------------------------------------===// diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 26277652f14..5eed88cf21d 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -90,12 +90,19 @@ TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { return TM.getTargetLowering()->getObjFileLowering(); } + +/// getTargetData - Return information about data layout. +const TargetData &AsmPrinter::getTargetData() const { + return *TM.getTargetData(); +} + /// getCurrentSection() - Return the current section we are emitting to. const MCSection *AsmPrinter::getCurrentSection() const { return OutStreamer.getCurrentSection(); } + void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); diff --git a/lib/CodeGen/AsmPrinter/DIE.cpp b/lib/CodeGen/AsmPrinter/DIE.cpp index 64d3789fb94..de1785dd865 100644 --- a/lib/CodeGen/AsmPrinter/DIE.cpp +++ b/lib/CodeGen/AsmPrinter/DIE.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "DIE.h" -#include "DwarfPrinter.h" #include "llvm/ADT/Twine.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/MC/MCAsmInfo.h" @@ -54,14 +53,14 @@ void DIEAbbrev::Profile(FoldingSetNodeID &ID) const { /// Emit - Print the abbreviation using the specified asm printer. /// -void DIEAbbrev::Emit(const DwarfPrinter *DP) const { +void DIEAbbrev::Emit(AsmPrinter *AP) const { // Emit its Dwarf tag type. // FIXME: Doing work even in non-asm-verbose runs. - DP->getAsm()->EmitULEB128(Tag, dwarf::TagString(Tag)); + AP->EmitULEB128(Tag, dwarf::TagString(Tag)); // Emit whether it has children DIEs. // FIXME: Doing work even in non-asm-verbose runs. - DP->getAsm()->EmitULEB128(ChildrenFlag, dwarf::ChildrenString(ChildrenFlag)); + AP->EmitULEB128(ChildrenFlag, dwarf::ChildrenString(ChildrenFlag)); // For each attribute description. for (unsigned i = 0, N = Data.size(); i < N; ++i) { @@ -69,18 +68,18 @@ void DIEAbbrev::Emit(const DwarfPrinter *DP) const { // Emit attribute type. // FIXME: Doing work even in non-asm-verbose runs. - DP->getAsm()->EmitULEB128(AttrData.getAttribute(), + AP->EmitULEB128(AttrData.getAttribute(), dwarf::AttributeString(AttrData.getAttribute())); // Emit form type. // FIXME: Doing work even in non-asm-verbose runs. - DP->getAsm()->EmitULEB128(AttrData.getForm(), - dwarf::FormEncodingString(AttrData.getForm())); + AP->EmitULEB128(AttrData.getForm(), + dwarf::FormEncodingString(AttrData.getForm())); } // Mark end of abbreviation. - DP->getAsm()->EmitULEB128(0, "EOM(1)"); - DP->getAsm()->EmitULEB128(0, "EOM(2)"); + AP->EmitULEB128(0, "EOM(1)"); + AP->EmitULEB128(0, "EOM(2)"); } #ifndef NDEBUG @@ -188,8 +187,7 @@ void DIEValue::dump() { /// EmitValue - Emit integer of appropriate size. /// -void DIEInteger::EmitValue(DwarfPrinter *D, unsigned Form) const { - const AsmPrinter *Asm = D->getAsm(); +void DIEInteger::EmitValue(AsmPrinter *Asm, unsigned Form) const { unsigned Size = ~0U; switch (Form) { case dwarf::DW_FORM_flag: // Fall thru @@ -241,10 +239,10 @@ void DIEInteger::print(raw_ostream &O) { /// EmitValue - Emit string value. /// -void DIEString::EmitValue(DwarfPrinter *D, unsigned Form) const { - D->getAsm()->OutStreamer.EmitBytes(Str, /*addrspace*/0); +void DIEString::EmitValue(AsmPrinter *AP, unsigned Form) const { + AP->OutStreamer.EmitBytes(Str, /*addrspace*/0); // Emit nul terminator. - D->getAsm()->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); + AP->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); } #ifndef NDEBUG @@ -259,10 +257,10 @@ void DIEString::print(raw_ostream &O) { /// EmitValue - Emit label value. /// -void DIELabel::EmitValue(DwarfPrinter *D, unsigned Form) const { +void DIELabel::EmitValue(AsmPrinter *AP, unsigned Form) const { bool IsSmall = Form == dwarf::DW_FORM_data4; - unsigned Size = IsSmall ? 4 : D->getTargetData()->getPointerSize(); - D->getAsm()->OutStreamer.EmitSymbolValue(Label, Size, 0/*AddrSpace*/); + unsigned Size = IsSmall ? 4 : AP->getTargetData().getPointerSize(); + AP->OutStreamer.EmitSymbolValue(Label, Size, 0/*AddrSpace*/); } /// SizeOf - Determine size of label value in bytes. @@ -284,9 +282,9 @@ void DIELabel::print(raw_ostream &O) { /// EmitValue - Emit delta value. /// -void DIEDelta::EmitValue(DwarfPrinter *D, unsigned Form) const { - D->getAsm()->EmitLabelDifference(LabelHi, LabelLo, - SizeOf(D->getTargetData(), Form)); +void DIEDelta::EmitValue(AsmPrinter *AP, unsigned Form) const { + AP->EmitLabelDifference(LabelHi, LabelLo, + SizeOf(&AP->getTargetData(), Form)); } /// SizeOf - Determine size of delta value in bytes. @@ -308,8 +306,8 @@ void DIEDelta::print(raw_ostream &O) { /// EmitValue - Emit debug information entry offset. /// -void DIEEntry::EmitValue(DwarfPrinter *D, unsigned Form) const { - D->getAsm()->EmitInt32(Entry->getOffset()); +void DIEEntry::EmitValue(AsmPrinter *AP, unsigned Form) const { + AP->EmitInt32(Entry->getOffset()); } #ifndef NDEBUG @@ -336,8 +334,7 @@ unsigned DIEBlock::ComputeSize(const TargetData *TD) { /// EmitValue - Emit block data. /// -void DIEBlock::EmitValue(DwarfPrinter *D, unsigned Form) const { - const AsmPrinter *Asm = D->getAsm(); +void DIEBlock::EmitValue(AsmPrinter *Asm, unsigned Form) const { switch (Form) { default: assert(0 && "Improper form for block"); break; case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break; @@ -348,7 +345,7 @@ void DIEBlock::EmitValue(DwarfPrinter *D, unsigned Form) const { const SmallVector &AbbrevData = Abbrev.getData(); for (unsigned i = 0, N = Values.size(); i < N; ++i) - Values[i]->EmitValue(D, AbbrevData[i].getForm()); + Values[i]->EmitValue(Asm, AbbrevData[i].getForm()); } /// SizeOf - Determine size of block data in bytes. diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h index 8b27ed20cb6..668a74c8bae 100644 --- a/lib/CodeGen/AsmPrinter/DIE.h +++ b/lib/CodeGen/AsmPrinter/DIE.h @@ -22,7 +22,6 @@ namespace llvm { class AsmPrinter; - class DwarfPrinter; class TargetData; class MCSymbol; class raw_ostream; @@ -101,7 +100,7 @@ namespace llvm { /// Emit - Print the abbreviation using the specified asm printer. /// - void Emit(const DwarfPrinter *DP) const; + void Emit(AsmPrinter *AP) const; #ifndef NDEBUG void print(raw_ostream &O); @@ -221,7 +220,7 @@ namespace llvm { /// EmitValue - Emit value via the Dwarf writer. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const = 0; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const = 0; /// SizeOf - Return the size of a value in bytes. /// @@ -261,7 +260,7 @@ namespace llvm { /// EmitValue - Emit integer of appropriate size. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of integer value in bytes. /// @@ -287,7 +286,7 @@ namespace llvm { /// EmitValue - Emit string value. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of string value in bytes. /// @@ -314,7 +313,7 @@ namespace llvm { /// EmitValue - Emit label value. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of label value in bytes. /// @@ -341,7 +340,7 @@ namespace llvm { /// EmitValue - Emit delta value. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of delta value in bytes. /// @@ -369,7 +368,7 @@ namespace llvm { /// EmitValue - Emit debug information entry offset. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of debug information entry in bytes. /// @@ -411,7 +410,7 @@ namespace llvm { /// EmitValue - Emit block data. /// - virtual void EmitValue(DwarfPrinter *D, unsigned Form) const; + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; /// SizeOf - Determine size of block data in bytes. /// diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 29239d1505a..e30febbf793 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -300,7 +300,7 @@ DbgScope::~DbgScope() { } // end llvm namespace DwarfDebug::DwarfDebug(AsmPrinter *A) - : DwarfPrinter(A), ModuleCU(0), + : Asm(A), MMI(Asm->MMI), ModuleCU(0), AbbreviationsSet(InitAbbreviationsSetSize), shouldEmit(false), CurrentFnDbgScope(0), DebugTimer(0) { NextStringPoolNumber = 0; @@ -403,7 +403,7 @@ void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form, /// void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form, DIEBlock *Block) { - Block->ComputeSize(TD); + Block->ComputeSize(&Asm->getTargetData()); DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. Die->addValue(Attribute, Block->BestForm(), Block); } @@ -557,6 +557,7 @@ void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die, // Decode the original location, and use that as the start of the byref // variable's location. + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); @@ -697,6 +698,7 @@ void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die, // Decode the original location, and use that as the start of the byref // variable's location. + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); @@ -752,6 +754,7 @@ void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die, /// provided. void DwarfDebug::addAddress(DIE *Die, unsigned Attribute, const MachineLocation &Location) { + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); @@ -1118,7 +1121,8 @@ DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) { Offset -= FieldOffset; // Maybe we need to work from the other end. - if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size); + if (Asm->getTargetData().isLittleEndian()) + Offset = FieldSize - (Offset + Size); addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); // Here WD_AT_data_member_location points to the anonymous @@ -1276,7 +1280,7 @@ DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI, if (!Parent && !InlinedAt) { StringRef SPName = DISubprogram(N).getLinkageName(); - if (SPName == MF->getFunction()->getName()) + if (SPName == Asm->MF->getFunction()->getName()) CurrentFnDbgScope = NScope; } @@ -1320,50 +1324,51 @@ DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) { /// If there are global variables in this scope then create and insert /// DIEs for these variables. DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) { - DIE *SPDie = ModuleCU->getDIE(SPNode); - assert(SPDie && "Unable to find subprogram DIE!"); - DISubprogram SP(SPNode); + DIE *SPDie = ModuleCU->getDIE(SPNode); + assert(SPDie && "Unable to find subprogram DIE!"); + DISubprogram SP(SPNode); - // There is not any need to generate specification DIE for a function - // defined at compile unit level. If a function is defined inside another - // function then gdb prefers the definition at top level and but does not - // expect specification DIE in parent function. So avoid creating - // specification DIE for a function defined inside a function. - if (SP.isDefinition() && !SP.getContext().isCompileUnit() && - !SP.getContext().isFile() && !SP.getContext().isSubprogram()) { - addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); - - // Add arguments. - DICompositeType SPTy = SP.getType(); - DIArray Args = SPTy.getTypeArray(); - unsigned SPTag = SPTy.getTag(); - if (SPTag == dwarf::DW_TAG_subroutine_type) - for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { - DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); - DIType ATy = DIType(DIType(Args.getElement(i).getNode())); - addType(Arg, ATy); - if (ATy.isArtificial()) - addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); - SPDie->addChild(Arg); - } - DIE *SPDeclDie = SPDie; - SPDie = new DIE(dwarf::DW_TAG_subprogram); - addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, - SPDeclDie); - ModuleCU->addDie(SPDie); - } - - addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, - Asm->GetTempSymbol("func_begin", SubprogramCount)); - addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, - Asm->GetTempSymbol("func_end", SubprogramCount)); - MachineLocation Location(RI->getFrameRegister(*MF)); - addAddress(SPDie, dwarf::DW_AT_frame_base, Location); - - if (!DISubprogram(SPNode).isLocalToUnit()) - addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); - - return SPDie; + // There is not any need to generate specification DIE for a function + // defined at compile unit level. If a function is defined inside another + // function then gdb prefers the definition at top level and but does not + // expect specification DIE in parent function. So avoid creating + // specification DIE for a function defined inside a function. + if (SP.isDefinition() && !SP.getContext().isCompileUnit() && + !SP.getContext().isFile() && !SP.getContext().isSubprogram()) { + addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); + + // Add arguments. + DICompositeType SPTy = SP.getType(); + DIArray Args = SPTy.getTypeArray(); + unsigned SPTag = SPTy.getTag(); + if (SPTag == dwarf::DW_TAG_subroutine_type) + for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { + DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); + DIType ATy = DIType(DIType(Args.getElement(i).getNode())); + addType(Arg, ATy); + if (ATy.isArtificial()) + addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); + SPDie->addChild(Arg); + } + DIE *SPDeclDie = SPDie; + SPDie = new DIE(dwarf::DW_TAG_subprogram); + addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, + SPDeclDie); + ModuleCU->addDie(SPDie); + } + + addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, + Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber())); + addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, + Asm->GetTempSymbol("func_end", Asm->getFunctionNumber())); + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); + MachineLocation Location(RI->getFrameRegister(*Asm->MF)); + addAddress(SPDie, dwarf::DW_AT_frame_base, Location); + + if (!DISubprogram(SPNode).isLocalToUnit()) + addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); + + return SPDie; } /// constructLexicalScope - Construct new DW_TAG_lexical_block @@ -1381,9 +1386,10 @@ DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) { return ScopeDIE; addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, - Start ? Start : Asm->GetTempSymbol("func_begin", SubprogramCount)); + Start ? Start : Asm->GetTempSymbol("func_begin", + Asm->getFunctionNumber())); addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, - End ? End : Asm->GetTempSymbol("func_end", SubprogramCount)); + End ? End : Asm->GetTempSymbol("func_end",Asm->getFunctionNumber())); return ScopeDIE; } @@ -1523,7 +1529,8 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) { } else { MachineLocation Location; unsigned FrameReg; - int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); + int Offset = RI->getFrameIndexReference(*Asm->MF, DV->getFrameIndex(), FrameReg); Location.set(FrameReg, Offset); @@ -1784,9 +1791,7 @@ void DwarfDebug::constructSubprogramDIE(MDNode *N) { /// content. Create global DIEs and emit initial debug info sections. /// This is inovked by the target AsmPrinter. void DwarfDebug::beginModule(Module *M) { - this->M = M; - - if (!MAI->doesSupportDebugInformation()) + if (!Asm->MAI->doesSupportDebugInformation()) return; TimeRegion Timer(DebugTimer); @@ -1825,7 +1830,7 @@ void DwarfDebug::beginModule(Module *M) { // Print out .file directives to specify files for .loc directives. These are // printed out early so that they precede any .loc directives. - if (MAI->hasDotLocAndDotFile()) { + if (Asm->MAI->hasDotLocAndDotFile()) { for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) { // Remember source id starts at 1. std::pair Id = getSourceDirectoryAndFileIds(i); @@ -1981,7 +1986,7 @@ DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, void DwarfDebug::collectVariableInfo() { if (!MMI) return; - const LLVMContext &Ctx = MF->getFunction()->getContext(); + const LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), @@ -2007,7 +2012,7 @@ void DwarfDebug::collectVariableInfo() { } // Collect variable information from DBG_VALUE machine instructions; - for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); + for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); I != E; ++I) { for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); II != IE; ++II) { @@ -2059,7 +2064,7 @@ void DwarfDebug::beginScope(const MachineInstr *MI) { if (DL == PrevInstLoc) return; - MDNode *Scope = DL.getScope(MF->getFunction()->getContext()); + MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); // FIXME: Should only verify each scope once! if (!DIScope(Scope).Verify()) @@ -2152,10 +2157,10 @@ bool DwarfDebug::extractScopeInformation() { DenseMap MIIndexMap; unsigned MIIndex = 0; - LLVMContext &Ctx = MF->getFunction()->getContext(); + LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); // Scan each instruction and create scopes. First build working set of scopes. - for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); + for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); I != E; ++I) { for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); II != IE; ++II) { @@ -2179,7 +2184,7 @@ bool DwarfDebug::extractScopeInformation() { // Build scope hierarchy using working set of scopes. - for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); + for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); I != E; ++I) { for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); II != IE; ++II) { @@ -2247,19 +2252,17 @@ bool DwarfDebug::extractScopeInformation() { /// beginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. void DwarfDebug::beginFunction(const MachineFunction *MF) { - this->MF = MF; - if (!ShouldEmitDwarfDebug()) return; + + TimeRegion Timer(DebugTimer); if (!extractScopeInformation()) return; - TimeRegion Timer(DebugTimer); - collectVariableInfo(); // Assumes in correct section after the entry point. Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin", - ++SubprogramCount)); + Asm->getFunctionNumber())); // Emit label for the implicitly defined dbg.stoppoint at the start of the // function. @@ -2291,7 +2294,8 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { if (CurrentFnDbgScope) { // Define end label for subprogram. - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", SubprogramCount)); + Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", + Asm->getFunctionNumber())); // Get function line info. if (!Lines.empty()) { @@ -2311,7 +2315,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { constructScopeDIE(CurrentFnDbgScope); - DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount, + DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), MMI->getFrameMoves())); } @@ -2409,7 +2413,7 @@ DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { // Size the DIE attribute values. for (unsigned i = 0, N = Values.size(); i < N; ++i) // Size attribute value. - Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm()); + Offset += Values[i]->SizeOf(&Asm->getTargetData(), AbbrevData[i].getForm()); // Size the DIE children if any. if (!Children.empty()) { @@ -2459,7 +2463,7 @@ void DwarfDebug::EmitSectionLabels() { const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); // Dwarf sections base addresses. - if (MAI->doesDwarfRequireFrameSection()) { + if (Asm->MAI->doesDwarfRequireFrameSection()) { DwarfFrameSectionSym = EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame"); } @@ -2525,7 +2529,7 @@ void DwarfDebug::emitDIE(DIE *Die) { } default: // Emit an attribute using the defined form. - Values[i]->EmitValue(this, Form); + Values[i]->EmitValue(Asm, Form); break; } } @@ -2570,7 +2574,7 @@ void DwarfDebug::emitDebugInfo() { Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), DwarfAbbrevSectionSym); Asm->OutStreamer.AddComment("Address Size (in bytes)"); - Asm->EmitInt8(TD->getPointerSize()); + Asm->EmitInt8(Asm->getTargetData().getPointerSize()); emitDIE(Die); // FIXME - extra padding for gdb bug. @@ -2602,7 +2606,7 @@ void DwarfDebug::emitAbbreviations() const { Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); // Emit the abbreviations data. - Abbrev->Emit(this); + Abbrev->Emit(Asm); } // Mark end of abbreviations. @@ -2621,14 +2625,15 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { Asm->EmitInt8(0); Asm->OutStreamer.AddComment("Op size"); - Asm->EmitInt8(TD->getPointerSize() + 1); + Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); Asm->OutStreamer.AddComment("DW_LNE_set_address"); Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->OutStreamer.AddComment("Section end label"); Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), - TD->getPointerSize(), 0/*AddrSpace*/); + Asm->getTargetData().getPointerSize(), + 0/*AddrSpace*/); // Mark end of matrix. Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); @@ -2642,7 +2647,7 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { void DwarfDebug::emitDebugLines() { // If the target is using .loc/.file, the assembler will be emitting the // .debug_line table automatically. - if (MAI->hasDotLocAndDotFile()) + if (Asm->MAI->hasDotLocAndDotFile()) return; // Minimum line delta, thus ranging from -10..(255-10). @@ -2759,13 +2764,14 @@ void DwarfDebug::emitDebugLines() { Asm->OutStreamer.AddComment("Extended Op"); Asm->EmitInt8(0); Asm->OutStreamer.AddComment("Op size"); - Asm->EmitInt8(TD->getPointerSize() + 1); + Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); Asm->OutStreamer.AddComment("DW_LNE_set_address"); Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->OutStreamer.AddComment("Location label"); - Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(), + Asm->OutStreamer.EmitSymbolValue(Label, + Asm->getTargetData().getPointerSize(), 0/*AddrSpace*/); // If change of source, then switch to the new source. @@ -2820,13 +2826,13 @@ void DwarfDebug::emitDebugLines() { /// emitCommonDebugFrame - Emit common frame info into a debug frame section. /// void DwarfDebug::emitCommonDebugFrame() { - if (!MAI->doesDwarfRequireFrameSection()) + if (!Asm->MAI->doesDwarfRequireFrameSection()) return; - int stackGrowth = - Asm->TM.getFrameInfo()->getStackGrowthDirection() == - TargetFrameInfo::StackGrowsUp ? - TD->getPointerSize() : -TD->getPointerSize(); + int stackGrowth = Asm->getTargetData().getPointerSize(); + if (Asm->TM.getFrameInfo()->getStackGrowthDirection() == + TargetFrameInfo::StackGrowsDown) + stackGrowth *= -1; // Start the dwarf frame section. Asm->OutStreamer.SwitchSection( @@ -2847,6 +2853,7 @@ void DwarfDebug::emitCommonDebugFrame() { Asm->EmitULEB128(1, "CIE Code Alignment Factor"); Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor"); Asm->OutStreamer.AddComment("CIE RA Column"); + const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); std::vector Moves; @@ -2862,7 +2869,7 @@ void DwarfDebug::emitCommonDebugFrame() { /// section. void DwarfDebug:: emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { - if (!MAI->doesDwarfRequireFrameSection()) + if (!Asm->MAI->doesDwarfRequireFrameSection()) return; // Start the dwarf frame section. @@ -2886,12 +2893,13 @@ emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { MCSymbol *FuncBeginSym = Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number); Asm->OutStreamer.EmitSymbolValue(FuncBeginSym, - TD->getPointerSize(), 0/*AddrSpace*/); + Asm->getTargetData().getPointerSize(), + 0/*AddrSpace*/); Asm->OutStreamer.AddComment("FDE address range"); Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number), - FuncBeginSym, TD->getPointerSize()); + FuncBeginSym, Asm->getTargetData().getPointerSize()); Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false); @@ -3072,7 +3080,7 @@ void DwarfDebug::emitDebugMacInfo() { /// __debug_info section, and the low_pc is the starting address for the /// inlining instance. void DwarfDebug::emitDebugInlineInfo() { - if (!MAI->doesDwarfUsesInlineInfoSection()) + if (!Asm->MAI->doesDwarfUsesInlineInfoSection()) return; if (!ModuleCU) @@ -3090,7 +3098,7 @@ void DwarfDebug::emitDebugInlineInfo() { Asm->OutStreamer.AddComment("Dwarf Version"); Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->OutStreamer.AddComment("Address Size (in bytes)"); - Asm->EmitInt8(TD->getPointerSize()); + Asm->EmitInt8(Asm->getTargetData().getPointerSize()); for (SmallVector::iterator I = InlinedSPNodes.begin(), E = InlinedSPNodes.end(); I != E; ++I) { @@ -3121,7 +3129,8 @@ void DwarfDebug::emitDebugInlineInfo() { Asm->EmitInt32(LI->second->getOffset()); if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); - Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0); + Asm->OutStreamer.EmitSymbolValue(LI->first, + Asm->getTargetData().getPointerSize(),0); } } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 4ca1fccaa7c..320691b0592 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -15,7 +15,6 @@ #define CODEGEN_ASMPRINTER_DWARFDEBUG_H__ #include "DIE.h" -#include "DwarfPrinter.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineLocation.h" #include "llvm/Analysis/DebugInfo.h" @@ -58,7 +57,12 @@ public: MCSymbol *getLabel() const { return Label; } }; -class DwarfDebug : public DwarfPrinter { +class DwarfDebug { + /// Asm - Target of Dwarf emission. + AsmPrinter *Asm; + /// MMI - Collected machine module information. + MachineModuleInfo *MMI; + //===--------------------------------------------------------------------===// // Attributes used to construct specific Dwarf sections. // diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index 7aa928170cc..40934e80d49 100644 --- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -65,7 +65,7 @@ void DwarfWriter::EndFunction(const MachineFunction *MF) { DD->endFunction(MF); DE->EndFunction(); - if (MachineModuleInfo *MMI = DD->getMMI() ? DD->getMMI() : DE->getMMI()) + if (MachineModuleInfo *MMI = DE->getMMI()) // Clear function debug information. MMI->EndFunction(); } -- 2.34.1