diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-03 00:55:40 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-03 00:55:40 +0000 |
| commit | 57ab708bdd3231b23a8ef4978b11ff07616034a2 (patch) | |
| tree | c50bb3ef0e4fc3a1d7e0531c0a92d3409dc06517 /llvm/lib/MC/MCObjectStreamer.cpp | |
| parent | f0b36a3cfd1ae7f5e85f7c217698e3001b60b313 (diff) | |
| download | llvm-57ab708bdd3231b23a8ef4978b11ff07616034a2.zip llvm-57ab708bdd3231b23a8ef4978b11ff07616034a2.tar.gz llvm-57ab708bdd3231b23a8ef4978b11ff07616034a2.tar.bz2 | |
Try to resolve symbol differences early, and if successful create a plain
data fragment. This reduces the time to assemble the test in 8711 from 60s to
54s.
llvm-svn: 120767
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
| -rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index a514858..506c963 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -179,6 +179,30 @@ void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) { getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups()); } +void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta, + const MCSymbol *LastLabel, + const MCSymbol *Label) { + if (!LastLabel) { + int PointerSize = getAssembler().getBackend().getPointerSize(); + EmitDwarfSetLineAddr(LineDelta, Label, PointerSize); + return; + } + MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; + const MCExpr *LabelRef = + MCSymbolRefExpr::Create(Label, Variant, getContext()); + const MCExpr *LastLabelRef = + MCSymbolRefExpr::Create(LastLabel, Variant, getContext()); + const MCExpr *AddrDelta = + MCBinaryExpr::Create(MCBinaryExpr::Sub, LabelRef, LastLabelRef, + getContext()); + int64_t Res; + if (AddrDelta->EvaluateAsAbsolute(Res, &getAssembler())) { + MCDwarfLineAddr::Emit(this, LineDelta, Res); + return; + } + new MCDwarfLineAddrFragment(LineDelta, *AddrDelta, getCurrentSectionData()); +} + void MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset, unsigned char Value) { new MCOrgFragment(*Offset, Value, getCurrentSectionData()); |
