[llvm] r239552 - Generalize emitAbsoluteSymbolDiff.
Frédéric Riss
friss at apple.com
Thu Jun 11 12:10:23 PDT 2015
> On Jun 11, 2015, at 11:58 AM, Rafael Espindola <rafael.espindola at gmail.com> wrote:
>
> Author: rafael
> Date: Thu Jun 11 13:58:08 2015
> New Revision: 239552
>
> URL: http://llvm.org/viewvc/llvm-project?rev=239552&view=rev
> Log:
> Generalize emitAbsoluteSymbolDiff.
>
> This makes emitAbsoluteSymbolDiff always succeed and moves logic from the asm
> printer to it.
>
> The object one now also works on ELF. If two symbols are in the same fragment,
> we will never move them apart.
When Duncan was working on this I was wondering if it couldn’t be generalized. I thought the ELF linkers relied on the relocations this would generate eg. for strings in the dwarf_str section. I guess all the strings will be in the same fragment. Without relocations, how can a standard ELF linker rewrite the references to the dwarf_str section when combining multiple input files?
Fred
> Modified:
> llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> llvm/trunk/include/llvm/MC/MCStreamer.h
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> llvm/trunk/lib/MC/MCObjectStreamer.cpp
> llvm/trunk/lib/MC/MCStreamer.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=239552&r1=239551&r2=239552&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Thu Jun 11 13:58:08 2015
> @@ -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;
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=239552&r1=239551&r2=239552&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Thu Jun 11 13:58:08 2015
> @@ -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);
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=239552&r1=239551&r2=239552&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Thu Jun 11 13:58:08 2015
> @@ -1590,25 +1590,7 @@ void AsmPrinter::EmitInt32(int Value) co
> /// .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"
>
> Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=239552&r1=239551&r2=239552&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Thu Jun 11 13:58:08 2015
> @@ -54,21 +54,18 @@ void MCObjectStreamer::flushPendingLabel
> }
> }
>
> -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() {
>
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=239552&r1=239551&r2=239552&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Thu Jun 11 13:58:08 2015
> @@ -638,6 +638,25 @@ void MCStreamer::EmitInstruction(const M
> 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) {}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list