diff options
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r-- | lib/MC/MCAssembler.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 3d9dcba52d..9cd0a12c12 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -13,8 +13,10 @@ #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCObjectWriter.h" +#include "llvm/MC/MCSection.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCValue.h" +#include "llvm/MC/MCDwarf.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" @@ -349,6 +351,20 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout, return Offset; } + + case MCFragment::FT_Dwarf: { + const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F); + + // The AddrDelta is really unsigned and it can only increase. + int64_t AddrDelta; + + OF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, &Layout); + + int64_t LineDelta; + LineDelta = OF.getLineDelta(); + + return MCDwarfLineAddr::ComputeSize(LineDelta, AddrDelta); + } } assert(0 && "invalid fragment kind"); @@ -506,6 +522,20 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, break; } + + case MCFragment::FT_Dwarf: { + const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F); + + // The AddrDelta is really unsigned and it can only increase. + int64_t AddrDelta; + OF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, &Layout); + + int64_t LineDelta; + LineDelta = OF.getLineDelta(); + + MCDwarfLineAddr::Write(OW, LineDelta, (uint64_t)AddrDelta); + break; + } } assert(OW->getStream().tell() - Start == FragmentSize); @@ -872,6 +902,7 @@ void MCFragment::dump() { case MCFragment::FT_Fill: OS << "MCFillFragment"; break; case MCFragment::FT_Inst: OS << "MCInstFragment"; break; case MCFragment::FT_Org: OS << "MCOrgFragment"; break; + case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break; } OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder @@ -932,6 +963,13 @@ void MCFragment::dump() { OS << " Offset:" << OF->getOffset() << " Value:" << OF->getValue(); break; } + case MCFragment::FT_Dwarf: { + const MCDwarfLineAddrFragment *OF = cast<MCDwarfLineAddrFragment>(this); + OS << "\n "; + OS << " AddrDelta:" << OF->getAddrDelta() + << " LineDelta:" << OF->getLineDelta(); + break; + } } OS << ">"; } |