diff options
author | Devang Patel <dpatel@apple.com> | 2011-02-24 21:04:00 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2011-02-24 21:04:00 +0000 |
commit | f410608271b6318bfc9e26c0d199f185d5a89ccb (patch) | |
tree | 657e0f50bc3d75837e1154ebdd71aa190d7acc2b /lib/CodeGen/AsmPrinter | |
parent | 8c20ec54d98176d31f310e4684d1d7f2ea0639bc (diff) | |
download | llvm-f410608271b6318bfc9e26c0d199f185d5a89ccb.tar.gz llvm-f410608271b6318bfc9e26c0d199f185d5a89ccb.tar.bz2 llvm-f410608271b6318bfc9e26c0d199f185d5a89ccb.tar.xz |
Enable DebugInfo support for COFF object files.
Patch by Nathan Jeffords!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126425 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter')
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIE.cpp | 23 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIE.h | 30 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 13 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.h | 6 |
5 files changed, 71 insertions, 4 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp index 98a1bf2f1c..9c2326cc1f 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -178,8 +178,7 @@ void AsmPrinter::EmitSectionOffset(const MCSymbol *Label, const MCSymbol *SectionLabel) const { // On COFF targets, we have to emit the special .secrel32 directive. if (const char *SecOffDir = MAI->getDwarfSectionOffsetDirective()) { - // FIXME: MCize. - OutStreamer.EmitRawText(SecOffDir + Twine(Label->getName())); + OutStreamer.EmitCOFFSecRel32(Label); return; } diff --git a/lib/CodeGen/AsmPrinter/DIE.cpp b/lib/CodeGen/AsmPrinter/DIE.cpp index 21396ca37f..ff3c6da084 100644 --- a/lib/CodeGen/AsmPrinter/DIE.cpp +++ b/lib/CodeGen/AsmPrinter/DIE.cpp @@ -277,6 +277,29 @@ void DIELabel::print(raw_ostream &O) { #endif //===----------------------------------------------------------------------===// +// DIESectionOffset Implementation +//===----------------------------------------------------------------------===// + +/// EmitValue - Emit label value. +/// +void DIESectionOffset::EmitValue(AsmPrinter *AP, unsigned Form) const { + AP->EmitSectionOffset (Label, Label); +} + +/// SizeOf - Determine size of label value in bytes. +/// +unsigned DIESectionOffset::SizeOf(AsmPrinter *AP, unsigned Form) const { + if (Form == dwarf::DW_FORM_data4) return 4; + return AP->getTargetData().getPointerSize(); +} + +#ifndef NDEBUG +void DIESectionOffset::print(raw_ostream &O) { + O << "SecRelLbl: " << Label->getName(); +} +#endif + +//===----------------------------------------------------------------------===// // DIEDelta Implementation //===----------------------------------------------------------------------===// diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h index d56c094779..bf5768a436 100644 --- a/lib/CodeGen/AsmPrinter/DIE.h +++ b/lib/CodeGen/AsmPrinter/DIE.h @@ -333,6 +333,36 @@ namespace llvm { }; //===--------------------------------------------------------------------===// + /// DIESectionOffset - A section relative label expression DIE. + // + class DIESectionOffset : public DIEValue { + const MCSymbol *Label; + public: + explicit DIESectionOffset(const MCSymbol *L) : DIEValue(isSectionOffset), + Label(L) {} + + /// EmitValue - Emit label value. + /// + virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; + + /// getValue - Get MCSymbol. + /// + const MCSymbol *getValue() const { return Label; } + + /// SizeOf - Determine size of label value in bytes. + /// + virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const; + + // Implement isa/cast/dyncast. + static bool classof(const DIELabel *) { return true; } + static bool classof(const DIEValue *L) { return L->getType() == isSectionOffset; } + +#ifndef NDEBUG + virtual void print(raw_ostream &O); +#endif + }; + + //===--------------------------------------------------------------------===// /// DIEDelta - A simple label difference DIE. /// class DIEDelta : public DIEValue { diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 780fa405ef..9678078e76 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -481,6 +481,15 @@ void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form, Die->addValue(Attribute, Form, Value); } +/// addSectionOffset - Add a Dwarf section relative label attribute data and +/// value. +/// +void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form, + const MCSymbol *Label) { + DIEValue *Value = new (DIEValueAllocator) DIESectionOffset(Label); + Die->addValue(Attribute, Form, Value); +} + /// addDelta - Add a label delta attribute data and value. /// void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form, @@ -1904,8 +1913,8 @@ void DwarfDebug::constructCompileUnit(const MDNode *N) { // DW_AT_stmt_list is a offset of line number information for this // compile unit in debug_line section. if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList()) - addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr, - Asm->GetTempSymbol("section_line")); + addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr, + Asm->GetTempSymbol("section_line")); else addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 7df0510fbf..2e920f502a 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -280,6 +280,12 @@ private: void addLabel(DIE *Die, unsigned Attribute, unsigned Form, const MCSymbol *Label); + /// addSectionOffset - Add a Dwarf section relative label attribute data and + /// value. + /// + void addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form, + const MCSymbol *Label); + /// addDelta - Add a label delta attribute data and value. /// void addDelta(DIE *Die, unsigned Attribute, unsigned Form, |