[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