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
This commit is contained in:
Chris Lattner
2010-04-05 00:13:49 +00:00
parent 02b86b93dc
commit d38fee8ddc
7 changed files with 151 additions and 130 deletions

View File

@@ -51,6 +51,7 @@ namespace llvm {
class Mangler; class Mangler;
class MCAsmInfo; class MCAsmInfo;
class TargetLoweringObjectFile; class TargetLoweringObjectFile;
class TargetData;
class Twine; class Twine;
class Type; class Type;
@@ -95,12 +96,6 @@ namespace llvm {
/// ///
MCSymbol *CurrentFnSym; 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: private:
// GCMetadataPrinters - The garbage collection metadata printer table. // GCMetadataPrinters - The garbage collection metadata printer table.
void *GCMetadataPrinters; // Really a DenseMap. void *GCMetadataPrinters; // Really a DenseMap.
@@ -129,6 +124,16 @@ namespace llvm {
/// ///
unsigned getFunctionNumber() const; 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. // MachineFunctionPass Implementation.
//===------------------------------------------------------------------===// //===------------------------------------------------------------------===//

View File

@@ -90,12 +90,19 @@ TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
return TM.getTargetLowering()->getObjFileLowering(); 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. /// getCurrentSection() - Return the current section we are emitting to.
const MCSection *AsmPrinter::getCurrentSection() const { const MCSection *AsmPrinter::getCurrentSection() const {
return OutStreamer.getCurrentSection(); return OutStreamer.getCurrentSection();
} }
void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll(); AU.setPreservesAll();
MachineFunctionPass::getAnalysisUsage(AU); MachineFunctionPass::getAnalysisUsage(AU);

View File

@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "DIE.h" #include "DIE.h"
#include "DwarfPrinter.h"
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/MC/MCAsmInfo.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. /// 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. // Emit its Dwarf tag type.
// FIXME: Doing work even in non-asm-verbose runs. // 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. // Emit whether it has children DIEs.
// FIXME: Doing work even in non-asm-verbose runs. // 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 each attribute description.
for (unsigned i = 0, N = Data.size(); i < N; ++i) { for (unsigned i = 0, N = Data.size(); i < N; ++i) {
@@ -69,18 +68,18 @@ void DIEAbbrev::Emit(const DwarfPrinter *DP) const {
// Emit attribute type. // Emit attribute type.
// FIXME: Doing work even in non-asm-verbose runs. // FIXME: Doing work even in non-asm-verbose runs.
DP->getAsm()->EmitULEB128(AttrData.getAttribute(), AP->EmitULEB128(AttrData.getAttribute(),
dwarf::AttributeString(AttrData.getAttribute())); dwarf::AttributeString(AttrData.getAttribute()));
// Emit form type. // Emit form type.
// FIXME: Doing work even in non-asm-verbose runs. // FIXME: Doing work even in non-asm-verbose runs.
DP->getAsm()->EmitULEB128(AttrData.getForm(), AP->EmitULEB128(AttrData.getForm(),
dwarf::FormEncodingString(AttrData.getForm())); dwarf::FormEncodingString(AttrData.getForm()));
} }
// Mark end of abbreviation. // Mark end of abbreviation.
DP->getAsm()->EmitULEB128(0, "EOM(1)"); AP->EmitULEB128(0, "EOM(1)");
DP->getAsm()->EmitULEB128(0, "EOM(2)"); AP->EmitULEB128(0, "EOM(2)");
} }
#ifndef NDEBUG #ifndef NDEBUG
@@ -188,8 +187,7 @@ void DIEValue::dump() {
/// EmitValue - Emit integer of appropriate size. /// EmitValue - Emit integer of appropriate size.
/// ///
void DIEInteger::EmitValue(DwarfPrinter *D, unsigned Form) const { void DIEInteger::EmitValue(AsmPrinter *Asm, unsigned Form) const {
const AsmPrinter *Asm = D->getAsm();
unsigned Size = ~0U; unsigned Size = ~0U;
switch (Form) { switch (Form) {
case dwarf::DW_FORM_flag: // Fall thru case dwarf::DW_FORM_flag: // Fall thru
@@ -241,10 +239,10 @@ void DIEInteger::print(raw_ostream &O) {
/// EmitValue - Emit string value. /// EmitValue - Emit string value.
/// ///
void DIEString::EmitValue(DwarfPrinter *D, unsigned Form) const { void DIEString::EmitValue(AsmPrinter *AP, unsigned Form) const {
D->getAsm()->OutStreamer.EmitBytes(Str, /*addrspace*/0); AP->OutStreamer.EmitBytes(Str, /*addrspace*/0);
// Emit nul terminator. // Emit nul terminator.
D->getAsm()->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); AP->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0);
} }
#ifndef NDEBUG #ifndef NDEBUG
@@ -259,10 +257,10 @@ void DIEString::print(raw_ostream &O) {
/// EmitValue - Emit label value. /// 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; bool IsSmall = Form == dwarf::DW_FORM_data4;
unsigned Size = IsSmall ? 4 : D->getTargetData()->getPointerSize(); unsigned Size = IsSmall ? 4 : AP->getTargetData().getPointerSize();
D->getAsm()->OutStreamer.EmitSymbolValue(Label, Size, 0/*AddrSpace*/); AP->OutStreamer.EmitSymbolValue(Label, Size, 0/*AddrSpace*/);
} }
/// SizeOf - Determine size of label value in bytes. /// SizeOf - Determine size of label value in bytes.
@@ -284,9 +282,9 @@ void DIELabel::print(raw_ostream &O) {
/// EmitValue - Emit delta value. /// EmitValue - Emit delta value.
/// ///
void DIEDelta::EmitValue(DwarfPrinter *D, unsigned Form) const { void DIEDelta::EmitValue(AsmPrinter *AP, unsigned Form) const {
D->getAsm()->EmitLabelDifference(LabelHi, LabelLo, AP->EmitLabelDifference(LabelHi, LabelLo,
SizeOf(D->getTargetData(), Form)); SizeOf(&AP->getTargetData(), Form));
} }
/// SizeOf - Determine size of delta value in bytes. /// SizeOf - Determine size of delta value in bytes.
@@ -308,8 +306,8 @@ void DIEDelta::print(raw_ostream &O) {
/// EmitValue - Emit debug information entry offset. /// EmitValue - Emit debug information entry offset.
/// ///
void DIEEntry::EmitValue(DwarfPrinter *D, unsigned Form) const { void DIEEntry::EmitValue(AsmPrinter *AP, unsigned Form) const {
D->getAsm()->EmitInt32(Entry->getOffset()); AP->EmitInt32(Entry->getOffset());
} }
#ifndef NDEBUG #ifndef NDEBUG
@@ -336,8 +334,7 @@ unsigned DIEBlock::ComputeSize(const TargetData *TD) {
/// EmitValue - Emit block data. /// EmitValue - Emit block data.
/// ///
void DIEBlock::EmitValue(DwarfPrinter *D, unsigned Form) const { void DIEBlock::EmitValue(AsmPrinter *Asm, unsigned Form) const {
const AsmPrinter *Asm = D->getAsm();
switch (Form) { switch (Form) {
default: assert(0 && "Improper form for block"); break; default: assert(0 && "Improper form for block"); break;
case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break; case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
@@ -348,7 +345,7 @@ void DIEBlock::EmitValue(DwarfPrinter *D, unsigned Form) const {
const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData(); const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
for (unsigned i = 0, N = Values.size(); i < N; ++i) 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. /// SizeOf - Determine size of block data in bytes.

View File

@@ -22,7 +22,6 @@
namespace llvm { namespace llvm {
class AsmPrinter; class AsmPrinter;
class DwarfPrinter;
class TargetData; class TargetData;
class MCSymbol; class MCSymbol;
class raw_ostream; class raw_ostream;
@@ -101,7 +100,7 @@ namespace llvm {
/// Emit - Print the abbreviation using the specified asm printer. /// Emit - Print the abbreviation using the specified asm printer.
/// ///
void Emit(const DwarfPrinter *DP) const; void Emit(AsmPrinter *AP) const;
#ifndef NDEBUG #ifndef NDEBUG
void print(raw_ostream &O); void print(raw_ostream &O);
@@ -221,7 +220,7 @@ namespace llvm {
/// EmitValue - Emit value via the Dwarf writer. /// 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. /// SizeOf - Return the size of a value in bytes.
/// ///
@@ -261,7 +260,7 @@ namespace llvm {
/// EmitValue - Emit integer of appropriate size. /// 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. /// SizeOf - Determine size of integer value in bytes.
/// ///
@@ -287,7 +286,7 @@ namespace llvm {
/// EmitValue - Emit string value. /// 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. /// SizeOf - Determine size of string value in bytes.
/// ///
@@ -314,7 +313,7 @@ namespace llvm {
/// EmitValue - Emit label value. /// 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. /// SizeOf - Determine size of label value in bytes.
/// ///
@@ -341,7 +340,7 @@ namespace llvm {
/// EmitValue - Emit delta value. /// 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. /// SizeOf - Determine size of delta value in bytes.
/// ///
@@ -369,7 +368,7 @@ namespace llvm {
/// EmitValue - Emit debug information entry offset. /// 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. /// SizeOf - Determine size of debug information entry in bytes.
/// ///
@@ -411,7 +410,7 @@ namespace llvm {
/// EmitValue - Emit block data. /// 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. /// SizeOf - Determine size of block data in bytes.
/// ///

View File

@@ -300,7 +300,7 @@ DbgScope::~DbgScope() {
} // end llvm namespace } // end llvm namespace
DwarfDebug::DwarfDebug(AsmPrinter *A) DwarfDebug::DwarfDebug(AsmPrinter *A)
: DwarfPrinter(A), ModuleCU(0), : Asm(A), MMI(Asm->MMI), ModuleCU(0),
AbbreviationsSet(InitAbbreviationsSetSize), shouldEmit(false), AbbreviationsSet(InitAbbreviationsSetSize), shouldEmit(false),
CurrentFnDbgScope(0), DebugTimer(0) { CurrentFnDbgScope(0), DebugTimer(0) {
NextStringPoolNumber = 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, void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
DIEBlock *Block) { DIEBlock *Block) {
Block->ComputeSize(TD); Block->ComputeSize(&Asm->getTargetData());
DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
Die->addValue(Attribute, Block->BestForm(), Block); 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 // Decode the original location, and use that as the start of the byref
// variable's location. // variable's location.
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 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 // Decode the original location, and use that as the start of the byref
// variable's location. // variable's location.
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
@@ -752,6 +754,7 @@ void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
/// provided. /// provided.
void DwarfDebug::addAddress(DIE *Die, unsigned Attribute, void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
const MachineLocation &Location) { const MachineLocation &Location) {
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
@@ -1118,7 +1121,8 @@ DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
Offset -= FieldOffset; Offset -= FieldOffset;
// Maybe we need to work from the other end. // 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); addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
// Here WD_AT_data_member_location points to the anonymous // 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) { if (!Parent && !InlinedAt) {
StringRef SPName = DISubprogram(N).getLinkageName(); StringRef SPName = DISubprogram(N).getLinkageName();
if (SPName == MF->getFunction()->getName()) if (SPName == Asm->MF->getFunction()->getName())
CurrentFnDbgScope = NScope; CurrentFnDbgScope = NScope;
} }
@@ -1354,10 +1358,11 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
} }
addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Asm->GetTempSymbol("func_begin", SubprogramCount)); Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Asm->GetTempSymbol("func_end", SubprogramCount)); Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
MachineLocation Location(RI->getFrameRegister(*MF)); const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
MachineLocation Location(RI->getFrameRegister(*Asm->MF));
addAddress(SPDie, dwarf::DW_AT_frame_base, Location); addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
if (!DISubprogram(SPNode).isLocalToUnit()) if (!DISubprogram(SPNode).isLocalToUnit())
@@ -1381,9 +1386,10 @@ DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
return ScopeDIE; return ScopeDIE;
addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 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, 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; return ScopeDIE;
} }
@@ -1523,7 +1529,8 @@ DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
} else { } else {
MachineLocation Location; MachineLocation Location;
unsigned FrameReg; unsigned FrameReg;
int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
int Offset = RI->getFrameIndexReference(*Asm->MF, DV->getFrameIndex(),
FrameReg); FrameReg);
Location.set(FrameReg, Offset); Location.set(FrameReg, Offset);
@@ -1784,9 +1791,7 @@ void DwarfDebug::constructSubprogramDIE(MDNode *N) {
/// content. Create global DIEs and emit initial debug info sections. /// content. Create global DIEs and emit initial debug info sections.
/// This is inovked by the target AsmPrinter. /// This is inovked by the target AsmPrinter.
void DwarfDebug::beginModule(Module *M) { void DwarfDebug::beginModule(Module *M) {
this->M = M; if (!Asm->MAI->doesSupportDebugInformation())
if (!MAI->doesSupportDebugInformation())
return; return;
TimeRegion Timer(DebugTimer); TimeRegion Timer(DebugTimer);
@@ -1825,7 +1830,7 @@ void DwarfDebug::beginModule(Module *M) {
// Print out .file directives to specify files for .loc directives. These are // Print out .file directives to specify files for .loc directives. These are
// printed out early so that they precede any .loc directives. // 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) { for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
// Remember source id starts at 1. // Remember source id starts at 1.
std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i); std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
@@ -1981,7 +1986,7 @@ DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
void DwarfDebug::collectVariableInfo() { void DwarfDebug::collectVariableInfo() {
if (!MMI) return; if (!MMI) return;
const LLVMContext &Ctx = MF->getFunction()->getContext(); const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
@@ -2007,7 +2012,7 @@ void DwarfDebug::collectVariableInfo() {
} }
// Collect variable information from DBG_VALUE machine instructions; // 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) { I != E; ++I) {
for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
II != IE; ++II) { II != IE; ++II) {
@@ -2059,7 +2064,7 @@ void DwarfDebug::beginScope(const MachineInstr *MI) {
if (DL == PrevInstLoc) if (DL == PrevInstLoc)
return; return;
MDNode *Scope = DL.getScope(MF->getFunction()->getContext()); MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
// FIXME: Should only verify each scope once! // FIXME: Should only verify each scope once!
if (!DIScope(Scope).Verify()) if (!DIScope(Scope).Verify())
@@ -2152,10 +2157,10 @@ bool DwarfDebug::extractScopeInformation() {
DenseMap<const MachineInstr *, unsigned> MIIndexMap; DenseMap<const MachineInstr *, unsigned> MIIndexMap;
unsigned MIIndex = 0; 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. // 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) { I != E; ++I) {
for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
II != IE; ++II) { II != IE; ++II) {
@@ -2179,7 +2184,7 @@ bool DwarfDebug::extractScopeInformation() {
// Build scope hierarchy using working set of scopes. // 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) { I != E; ++I) {
for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
II != IE; ++II) { II != IE; ++II) {
@@ -2247,19 +2252,17 @@ bool DwarfDebug::extractScopeInformation() {
/// beginFunction - Gather pre-function debug information. Assumes being /// beginFunction - Gather pre-function debug information. Assumes being
/// emitted immediately after the function entry point. /// emitted immediately after the function entry point.
void DwarfDebug::beginFunction(const MachineFunction *MF) { void DwarfDebug::beginFunction(const MachineFunction *MF) {
this->MF = MF;
if (!ShouldEmitDwarfDebug()) return; if (!ShouldEmitDwarfDebug()) return;
if (!extractScopeInformation())
return;
TimeRegion Timer(DebugTimer); TimeRegion Timer(DebugTimer);
if (!extractScopeInformation())
return;
collectVariableInfo(); collectVariableInfo();
// Assumes in correct section after the entry point. // Assumes in correct section after the entry point.
Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin", Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin",
++SubprogramCount)); Asm->getFunctionNumber()));
// Emit label for the implicitly defined dbg.stoppoint at the start of the // Emit label for the implicitly defined dbg.stoppoint at the start of the
// function. // function.
@@ -2291,7 +2294,8 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
if (CurrentFnDbgScope) { if (CurrentFnDbgScope) {
// Define end label for subprogram. // 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. // Get function line info.
if (!Lines.empty()) { if (!Lines.empty()) {
@@ -2311,7 +2315,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
constructScopeDIE(CurrentFnDbgScope); constructScopeDIE(CurrentFnDbgScope);
DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount, DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
MMI->getFrameMoves())); MMI->getFrameMoves()));
} }
@@ -2409,7 +2413,7 @@ DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
// Size the DIE attribute values. // Size the DIE attribute values.
for (unsigned i = 0, N = Values.size(); i < N; ++i) for (unsigned i = 0, N = Values.size(); i < N; ++i)
// Size attribute value. // 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. // Size the DIE children if any.
if (!Children.empty()) { if (!Children.empty()) {
@@ -2459,7 +2463,7 @@ void DwarfDebug::EmitSectionLabels() {
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
// Dwarf sections base addresses. // Dwarf sections base addresses.
if (MAI->doesDwarfRequireFrameSection()) { if (Asm->MAI->doesDwarfRequireFrameSection()) {
DwarfFrameSectionSym = DwarfFrameSectionSym =
EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame"); EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
} }
@@ -2525,7 +2529,7 @@ void DwarfDebug::emitDIE(DIE *Die) {
} }
default: default:
// Emit an attribute using the defined form. // Emit an attribute using the defined form.
Values[i]->EmitValue(this, Form); Values[i]->EmitValue(Asm, Form);
break; break;
} }
} }
@@ -2570,7 +2574,7 @@ void DwarfDebug::emitDebugInfo() {
Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
DwarfAbbrevSectionSym); DwarfAbbrevSectionSym);
Asm->OutStreamer.AddComment("Address Size (in bytes)"); Asm->OutStreamer.AddComment("Address Size (in bytes)");
Asm->EmitInt8(TD->getPointerSize()); Asm->EmitInt8(Asm->getTargetData().getPointerSize());
emitDIE(Die); emitDIE(Die);
// FIXME - extra padding for gdb bug. // FIXME - extra padding for gdb bug.
@@ -2602,7 +2606,7 @@ void DwarfDebug::emitAbbreviations() const {
Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
// Emit the abbreviations data. // Emit the abbreviations data.
Abbrev->Emit(this); Abbrev->Emit(Asm);
} }
// Mark end of abbreviations. // Mark end of abbreviations.
@@ -2621,14 +2625,15 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Asm->EmitInt8(0); Asm->EmitInt8(0);
Asm->OutStreamer.AddComment("Op size"); Asm->OutStreamer.AddComment("Op size");
Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Asm->OutStreamer.AddComment("DW_LNE_set_address"); Asm->OutStreamer.AddComment("DW_LNE_set_address");
Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EmitInt8(dwarf::DW_LNE_set_address);
Asm->OutStreamer.AddComment("Section end label"); Asm->OutStreamer.AddComment("Section end label");
Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
TD->getPointerSize(), 0/*AddrSpace*/); Asm->getTargetData().getPointerSize(),
0/*AddrSpace*/);
// Mark end of matrix. // Mark end of matrix.
Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
@@ -2642,7 +2647,7 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
void DwarfDebug::emitDebugLines() { void DwarfDebug::emitDebugLines() {
// If the target is using .loc/.file, the assembler will be emitting the // If the target is using .loc/.file, the assembler will be emitting the
// .debug_line table automatically. // .debug_line table automatically.
if (MAI->hasDotLocAndDotFile()) if (Asm->MAI->hasDotLocAndDotFile())
return; return;
// Minimum line delta, thus ranging from -10..(255-10). // Minimum line delta, thus ranging from -10..(255-10).
@@ -2759,13 +2764,14 @@ void DwarfDebug::emitDebugLines() {
Asm->OutStreamer.AddComment("Extended Op"); Asm->OutStreamer.AddComment("Extended Op");
Asm->EmitInt8(0); Asm->EmitInt8(0);
Asm->OutStreamer.AddComment("Op size"); Asm->OutStreamer.AddComment("Op size");
Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Asm->OutStreamer.AddComment("DW_LNE_set_address"); Asm->OutStreamer.AddComment("DW_LNE_set_address");
Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EmitInt8(dwarf::DW_LNE_set_address);
Asm->OutStreamer.AddComment("Location label"); Asm->OutStreamer.AddComment("Location label");
Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(), Asm->OutStreamer.EmitSymbolValue(Label,
Asm->getTargetData().getPointerSize(),
0/*AddrSpace*/); 0/*AddrSpace*/);
// If change of source, then switch to the new source. // 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. /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
/// ///
void DwarfDebug::emitCommonDebugFrame() { void DwarfDebug::emitCommonDebugFrame() {
if (!MAI->doesDwarfRequireFrameSection()) if (!Asm->MAI->doesDwarfRequireFrameSection())
return; return;
int stackGrowth = int stackGrowth = Asm->getTargetData().getPointerSize();
Asm->TM.getFrameInfo()->getStackGrowthDirection() == if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
TargetFrameInfo::StackGrowsUp ? TargetFrameInfo::StackGrowsDown)
TD->getPointerSize() : -TD->getPointerSize(); stackGrowth *= -1;
// Start the dwarf frame section. // Start the dwarf frame section.
Asm->OutStreamer.SwitchSection( Asm->OutStreamer.SwitchSection(
@@ -2847,6 +2853,7 @@ void DwarfDebug::emitCommonDebugFrame() {
Asm->EmitULEB128(1, "CIE Code Alignment Factor"); Asm->EmitULEB128(1, "CIE Code Alignment Factor");
Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor"); Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Asm->OutStreamer.AddComment("CIE RA Column"); Asm->OutStreamer.AddComment("CIE RA Column");
const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
std::vector<MachineMove> Moves; std::vector<MachineMove> Moves;
@@ -2862,7 +2869,7 @@ void DwarfDebug::emitCommonDebugFrame() {
/// section. /// section.
void DwarfDebug:: void DwarfDebug::
emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
if (!MAI->doesDwarfRequireFrameSection()) if (!Asm->MAI->doesDwarfRequireFrameSection())
return; return;
// Start the dwarf frame section. // Start the dwarf frame section.
@@ -2886,12 +2893,13 @@ emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
MCSymbol *FuncBeginSym = MCSymbol *FuncBeginSym =
Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number); Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
Asm->OutStreamer.EmitSymbolValue(FuncBeginSym, Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
TD->getPointerSize(), 0/*AddrSpace*/); Asm->getTargetData().getPointerSize(),
0/*AddrSpace*/);
Asm->OutStreamer.AddComment("FDE address range"); Asm->OutStreamer.AddComment("FDE address range");
Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number), Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
FuncBeginSym, TD->getPointerSize()); FuncBeginSym, Asm->getTargetData().getPointerSize());
Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false); 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 /// __debug_info section, and the low_pc is the starting address for the
/// inlining instance. /// inlining instance.
void DwarfDebug::emitDebugInlineInfo() { void DwarfDebug::emitDebugInlineInfo() {
if (!MAI->doesDwarfUsesInlineInfoSection()) if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
return; return;
if (!ModuleCU) if (!ModuleCU)
@@ -3090,7 +3098,7 @@ void DwarfDebug::emitDebugInlineInfo() {
Asm->OutStreamer.AddComment("Dwarf Version"); Asm->OutStreamer.AddComment("Dwarf Version");
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EmitInt16(dwarf::DWARF_VERSION);
Asm->OutStreamer.AddComment("Address Size (in bytes)"); Asm->OutStreamer.AddComment("Address Size (in bytes)");
Asm->EmitInt8(TD->getPointerSize()); Asm->EmitInt8(Asm->getTargetData().getPointerSize());
for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(), for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
E = InlinedSPNodes.end(); I != E; ++I) { E = InlinedSPNodes.end(); I != E; ++I) {
@@ -3121,7 +3129,8 @@ void DwarfDebug::emitDebugInlineInfo() {
Asm->EmitInt32(LI->second->getOffset()); Asm->EmitInt32(LI->second->getOffset());
if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 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);
} }
} }

View File

@@ -15,7 +15,6 @@
#define CODEGEN_ASMPRINTER_DWARFDEBUG_H__ #define CODEGEN_ASMPRINTER_DWARFDEBUG_H__
#include "DIE.h" #include "DIE.h"
#include "DwarfPrinter.h"
#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/MachineLocation.h" #include "llvm/CodeGen/MachineLocation.h"
#include "llvm/Analysis/DebugInfo.h" #include "llvm/Analysis/DebugInfo.h"
@@ -58,7 +57,12 @@ public:
MCSymbol *getLabel() const { return Label; } 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. // Attributes used to construct specific Dwarf sections.
// //

View File

@@ -65,7 +65,7 @@ void DwarfWriter::EndFunction(const MachineFunction *MF) {
DD->endFunction(MF); DD->endFunction(MF);
DE->EndFunction(); DE->EndFunction();
if (MachineModuleInfo *MMI = DD->getMMI() ? DD->getMMI() : DE->getMMI()) if (MachineModuleInfo *MMI = DE->getMMI())
// Clear function debug information. // Clear function debug information.
MMI->EndFunction(); MMI->EndFunction();
} }