diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/MC/MCObjectStreamer.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 8 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 19 |
5 files changed, 30 insertions, 34 deletions
diff --git a/llvm/include/llvm/MC/MCObjectStreamer.h b/llvm/include/llvm/MC/MCObjectStreamer.h index 462b3b484c5..131da07c23a 100644 --- a/llvm/include/llvm/MC/MCObjectStreamer.h +++ b/llvm/include/llvm/MC/MCObjectStreamer.h @@ -136,7 +136,7 @@ public: /// /// \pre Offset of \c Hi is greater than the offset \c Lo. /// \return true on success. - bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, + void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) override; bool mayHaveInstructions(MCSection &Sec) const override; diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index 628fb768856..4dd53df25ec 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -636,14 +636,12 @@ public: unsigned Isa, unsigned Discriminator, StringRef FileName); - /// Emit the absolute difference between two symbols if possible. + /// Emit the absolute difference between two symbols. /// /// \pre Offset of \c Hi is greater than the offset \c Lo. /// \return true on success. - virtual bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, - unsigned Size) { - return false; - } + virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, + unsigned Size); virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID); virtual void EmitCFISections(bool EH, bool Debug); diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 04b936afa06..dd1d9a980d8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1590,25 +1590,7 @@ void AsmPrinter::EmitInt32(int Value) const { /// .set if it avoids relocations. void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const { - if (!MAI->doesDwarfUseRelocationsAcrossSections()) - if (OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size)) - return; - - // Get the Hi-Lo expression. - const MCExpr *Diff = - MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, OutContext), - MCSymbolRefExpr::create(Lo, OutContext), - OutContext); - - if (!MAI->doesSetDirectiveSuppressesReloc()) { - OutStreamer->EmitValue(Diff, Size); - return; - } - - // Otherwise, emit with .set (aka assignment). - MCSymbol *SetLabel = createTempSymbol("set"); - OutStreamer->EmitAssignment(SetLabel, Diff); - OutStreamer->EmitSymbolValue(SetLabel, Size); + OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size); } /// EmitLabelPlusOffset - Emit something like ".long Label+Offset" diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index 6de02bcb02d..a73c171bd1c 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -54,21 +54,18 @@ void MCObjectStreamer::flushPendingLabels(MCFragment *F, uint64_t FOffset) { } } -bool MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi, +void MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) { - // Must both be assigned to the same (valid) fragment. - if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment()) - return false; - - // Must be a data fragment. - if (!isa<MCDataFragment>(Hi->getFragment())) - return false; + // If not assigned to the same (valid) fragment, fallback. + if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment()) { + MCStreamer::emitAbsoluteSymbolDiff(Hi, Lo, Size); + return; + } assert(Hi->getOffset() >= Lo->getOffset() && "Expected Hi to be greater than Lo"); EmitIntValue(Hi->getOffset() - Lo->getOffset(), Size); - return true; } void MCObjectStreamer::reset() { diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index 011969a3da0..349de97a17c 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -638,6 +638,25 @@ void MCStreamer::EmitInstruction(const MCInst &Inst, visitUsedExpr(*Inst.getOperand(i).getExpr()); } +void MCStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, + unsigned Size) { + // Get the Hi-Lo expression. + const MCExpr *Diff = + MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context), + MCSymbolRefExpr::create(Lo, Context), Context); + + const MCAsmInfo *MAI = Context.getAsmInfo(); + if (!MAI->doesSetDirectiveSuppressesReloc()) { + EmitValue(Diff, Size); + return; + } + + // Otherwise, emit with .set (aka assignment). + MCSymbol *SetLabel = Context.createTempSymbol("set", true); + EmitAssignment(SetLabel, Diff); + EmitSymbolValue(SetLabel, Size); +} + void MCStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {} void MCStreamer::EmitThumbFunc(MCSymbol *Func) {} void MCStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {} |