<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 4, 2015 at 2:11 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
> On 2015 Jun 4, at 12:48, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
><br>
><br>
> On Thu, Jun 4, 2015 at 12:22 PM, Duncan P. N. Exon Smith <<a href="mailto:dexonsmith@apple.com">dexonsmith@apple.com</a>> wrote:<br>
><br>
> > On 2015-Jun-04, at 11:48, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
> ><br>
> ><br>
> ><br>
> > On Wed, May 20, 2015 at 7:41 PM, Duncan P. N. Exon Smith <<a href="mailto:dexonsmith@apple.com">dexonsmith@apple.com</a>> wrote:<br>
> > Author: dexonsmith<br>
> > Date: Wed May 20 21:41:23 2015<br>
> > New Revision: 237876<br>
> ><br>
> > URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D237876-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=NTGkcw42QFQl8B1CygqXycqxenkoeUp8oza2uP6S7y4&s=HJIXf2bNC-xiAEs0PZBYX91MnHbjoSk6uxw-pOXwq68&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=237876&view=rev</a><br>
> > Log:<br>
> > AsmPrinter: Compute absolute label difference directly<br>
> ><br>
> > Create a low-overhead path for `EmitLabelDifference()` that emits a<br>
> > emits an absolute number when (1) the output is an object stream and (2)<br>
> > the two symbols are in the same data fragment.<br>
> ><br>
> > This drops memory usage on Mach-O from 975 MB down to 919 MB (5.8%).<br>
> > The only call is when `!doesDwarfUseRelocationsAcrossSections()` --<br>
> > i.e., on Mach-O -- since otherwise an absolute offset from the start of<br>
> > the section needs a relocation.  (`EmitLabelDifference()` is cheaper on<br>
> > ELF anyway, since it creates 1 fewer temp symbol, and it gets called far<br>
> > less often.  It's not clear to me if this is even a bottleneck there.)<br>
> ><br>
> > (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;<br>
> > see r236629 for details.)<br>
> ><br>
> > Modified:<br>
> >     llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
> >     llvm/trunk/include/llvm/MC/MCStreamer.h<br>
> >     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>
> >     llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
> ><br>
> > Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
> > URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_MC_MCObjectStreamer.h-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=NTGkcw42QFQl8B1CygqXycqxenkoeUp8oza2uP6S7y4&s=bo94Yao2nI_1CGlEhTP-uIJquiY3v2bU_W55s7JZZVc&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=237876&r1=237875&r2=237876&view=diff</a><br>
> > ==============================================================================<br>
> > --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)<br>
> > +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Wed May 20 21:41:23 2015<br>
> > @@ -136,6 +136,17 @@ public:<br>
> >    void EmitZeros(uint64_t NumBytes) override;<br>
> >    void FinishImpl() override;<br>
> ><br>
> > +  /// Emit the absolute difference between two symbols if possible.<br>
> > +  ///<br>
> > +  /// Emit the absolute difference between \c Hi and \c Lo, as long as we can<br>
> > +  /// compute it.  Currently, that requires that both symbols are in the same<br>
> > +  /// data fragment.  Otherwise, do nothing and return \c false.<br>
> > +  ///<br>
> > +  /// \pre Offset of \c Hi is greater than the offset \c Lo.<br>
> > +  /// \return true on success.<br>
> > +  bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,<br>
> > +                              unsigned Size) override;<br>
> > +<br>
> >    bool mayHaveInstructions() const override {<br>
> >      return getCurrentSectionData()->hasInstructions();<br>
> >    }<br>
> ><br>
> > Modified: llvm/trunk/include/llvm/MC/MCStreamer.h<br>
> > URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_MC_MCStreamer.h-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=NTGkcw42QFQl8B1CygqXycqxenkoeUp8oza2uP6S7y4&s=hE4ZoS6CXWeRlcEXaKLK3ynq3arH3OfJn28FB1-a6xY&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=237876&r1=237875&r2=237876&view=diff</a><br>
> > ==============================================================================<br>
> > --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)<br>
> > +++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed May 20 21:41:23 2015<br>
> > @@ -652,6 +652,15 @@ public:<br>
> >                                       unsigned Isa, unsigned Discriminator,<br>
> >                                       StringRef FileName);<br>
> ><br>
> > +  /// Emit the absolute difference between two symbols if possible.<br>
> > +  ///<br>
> > +  /// \pre Offset of \c Hi is greater than the offset \c Lo.<br>
> > +  /// \return true on success.<br>
> > +  virtual bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,<br>
> > +                                      unsigned Size) {<br>
> > +    return false;<br>
> > +  }<br>
> > +<br>
> >    virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);<br>
> >    virtual void EmitCFISections(bool EH, bool Debug);<br>
> >    void EmitCFIStartProc(bool IsSimple);<br>
> ><br>
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>
> > URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_AsmPrinter.cpp-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=NTGkcw42QFQl8B1CygqXycqxenkoeUp8oza2uP6S7y4&s=u57Rg6yC5KIWoxytSotcOPQc-kWUfKMy2xtMHA2WG4c&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=237876&r1=237875&r2=237876&view=diff</a><br>
> > ==============================================================================<br>
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)<br>
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed May 20 21:41:23 2015<br>
> > @@ -1591,6 +1591,10 @@ void AsmPrinter::EmitInt32(int Value) co<br>
> >  /// .set if it avoids relocations.<br>
> >  void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,<br>
> >                                       unsigned Size) const {<br>
> ><br>
> > Is this function only used for DWARF emission? It seems sufficiently generally named that that's not obvious & could be surprising for other users to find this \/ behavior?<br>
> ><br>
><br>
> Yes, it's only used for DWARF emission; at least, I looked, and only<br>
> found DWARF callers.  I'll look into changing the name.  I agree it's<br>
> confusing.<br>
><br>
> Wonder what we use for label difference in inline asm or other things, then... *shrug*<br>
<br>
</div></div>Inline asm doesn't use this, anyway.<br>
<br>
However, I just did a more thorough look (I was starting to work on<br>
the patch) and found a single non-DWARF caller:<br>
`EHStreamer::emitExceptionTable()`.  I'll fix that pronto; looks<br>
like I should leave `EmitLabelDifference()` around, create a new<br>
`emitDwarfLabelDifference()` that eventually calls the former, and<br>
change all the callers but that one.<br>
<span class=""><br>
><br>
><br>
> Any suggestions?  Maybe, `emitDwarfLabelDifference()`?<br>
><br>
> Sounds plausible - can we assert that it's in one of the blessed sections that MachO doesn't link into the executable, too?<br>
<br>
</span>Seems like a good idea, but I don't know how to check that.  Do you?<br></blockquote><div><br>I don't know what logic MachO uses to bless the sections - whether it's name based or what. If it's just debug_* sections, you should be able to get the section from the symbol (hmm, only if we've already emitted the symbol which often/usually isn't the case?) and the name from the section, etc.<br> </div></div><br></div></div>