diff options
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index e9295f0..7036c40 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -464,6 +464,18 @@ void MCObjectStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta, Label, PointerSize); return; } + + // If the two labels are within the same fragment, then the address-offset is + // already a fixed constant and is not relaxable. Emit the advance-line-addr + // data immediately to save time and memory. + if (auto OptAddrDelta = absoluteSymbolDiff(Label, LastLabel)) { + SmallString<16> Tmp; + MCDwarfLineAddr::encode(getContext(), Assembler->getDWARFLinetableParams(), + LineDelta, *OptAddrDelta, Tmp); + emitBytes(Tmp); + return; + } + const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel, SMLoc()); insert(getContext().allocFragment<MCDwarfLineAddrFragment>(LineDelta, *AddrDelta)); |