[llvm] r237876 - AsmPrinter: Compute absolute label difference directly

Eric Christopher echristo at gmail.com
Wed May 20 21:56:19 PDT 2015


Nice patch, thanks!

-eric

On Wed, May 20, 2015 at 7:47 PM Duncan P. N. Exon Smith <
dexonsmith at apple.com> wrote:

> Author: dexonsmith
> Date: Wed May 20 21:41:23 2015
> New Revision: 237876
>
> URL: http://llvm.org/viewvc/llvm-project?rev=237876&view=rev
> Log:
> AsmPrinter: Compute absolute label difference directly
>
> Create a low-overhead path for `EmitLabelDifference()` that emits a
> emits an absolute number when (1) the output is an object stream and (2)
> the two symbols are in the same data fragment.
>
> This drops memory usage on Mach-O from 975 MB down to 919 MB (5.8%).
> The only call is when `!doesDwarfUseRelocationsAcrossSections()` --
> i.e., on Mach-O -- since otherwise an absolute offset from the start of
> the section needs a relocation.  (`EmitLabelDifference()` is cheaper on
> ELF anyway, since it creates 1 fewer temp symbol, and it gets called far
> less often.  It's not clear to me if this is even a bottleneck there.)
>
> (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;
> see r236629 for details.)
>
> 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
>
> Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=237876&r1=237875&r2=237876&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Wed May 20 21:41:23 2015
> @@ -136,6 +136,17 @@ public:
>    void EmitZeros(uint64_t NumBytes) override;
>    void FinishImpl() override;
>
> +  /// Emit the absolute difference between two symbols if possible.
> +  ///
> +  /// Emit the absolute difference between \c Hi and \c Lo, as long as we
> can
> +  /// compute it.  Currently, that requires that both symbols are in the
> same
> +  /// data fragment.  Otherwise, do nothing and return \c false.
> +  ///
> +  /// \pre Offset of \c Hi is greater than the offset \c Lo.
> +  /// \return true on success.
> +  bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
> +                              unsigned Size) override;
> +
>    bool mayHaveInstructions() const override {
>      return getCurrentSectionData()->hasInstructions();
>    }
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=237876&r1=237875&r2=237876&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed May 20 21:41:23 2015
> @@ -652,6 +652,15 @@ public:
>                                       unsigned Isa, unsigned Discriminator,
>                                       StringRef FileName);
>
> +  /// Emit the absolute difference between two symbols if possible.
> +  ///
> +  /// \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 MCSymbol *getDwarfLineTableSymbol(unsigned CUID);
>    virtual void EmitCFISections(bool EH, bool Debug);
>    void EmitCFIStartProc(bool IsSimple);
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=237876&r1=237875&r2=237876&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed May 20 21:41:23
> 2015
> @@ -1591,6 +1591,10 @@ 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),
>
> Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=237876&r1=237875&r2=237876&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Wed May 20 21:41:23 2015
> @@ -53,6 +53,29 @@ void MCObjectStreamer::flushPendingLabel
>    }
>  }
>
> +bool MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi,
> +                                              const MCSymbol *Lo,
> +                                              unsigned Size) {
> +  // Must have symbol data.
> +  if (!Assembler->hasSymbolData(*Hi) || !Assembler->hasSymbolData(*Lo))
> +    return false;
> +  auto &HiD = Assembler->getSymbolData(*Hi);
> +  auto &LoD = Assembler->getSymbolData(*Lo);
> +
> +  // Must both be assigned to the same (valid) fragment.
> +  if (!HiD.getFragment() || HiD.getFragment() != LoD.getFragment())
> +    return false;
> +
> +  // Must be a data fragment.
> +  if (!isa<MCDataFragment>(HiD.getFragment()))
> +    return false;
> +
> +  assert(HiD.getOffset() >= LoD.getOffset() &&
> +         "Expected Hi to be greater than Lo");
> +  EmitIntValue(HiD.getOffset() - LoD.getOffset(), Size);
> +  return true;
> +}
> +
>  void MCObjectStreamer::reset() {
>    if (Assembler)
>      Assembler->reset();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150521/72d16cb6/attachment.html>


More information about the llvm-commits mailing list