I missed the rest of the suggestions from ruiu@, will need to implement those tomorrow <br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 10, 2018 at 5:24 PM Zachary Turner via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">zturner updated this revision to Diff 129375.<br>
zturner added a comment.<br>
Herald added a subscriber: mgorny.<br>
<br>
I went to start implementing peter's suggestion, and things started getting a little interesting.  A lot of the things you might want to time are behind command line options, and it would be nice if we didn't show anything when the lines weren't relevant.<br>
<br>
At the same time, I don't like writing code and then having someone re-invent the same thing later that is slightly different.  So although nobody's using this now, I wanted to do this in a way that could benefit, for example, the ELF linker or the MachO linker at some point in the future.<br>
<br>
So I tried to generalize this a little bit.  Everything is moved into Common now, and the only thing defined in COFF is a set of enums that represent the various statistics that you might want to time.  You can add phases dynamically (for example, only if an option is set on the command line), and all the printing logic is raised up into common too, and it does all the work of figuring out the right set of statistics you're timing, calculating percentages, etc, so nobody else has to deal with the formatting and alignment again.<br>
<br>
just to illustrate what I mean, currently when I link with /OPT:REF + /OPT:ICF + /DEBUG I get this:<br>
<br>
    Input File Reading:        (  3.54%)   576 ms<br>
    ICF:                       (  0.66%)   107 ms<br>
    GC:                        (  1.34%)   218 ms<br>
    Code Layout:               (  0.79%)   128 ms<br>
    Commit Output File:        (  0.07%)    11 ms<br>
    PDB Emission (Cumulative): ( 93.46%) 15214 ms<br>
      Globals Stream Layout:   (  1.09%)   177 ms<br>
      TPI Stream Layout:       (  6.71%)  1093 ms<br>
      Type Merging:            ( 35.43%)  5767 ms<br>
      Symbol Merging:          ( 24.43%)  3977 ms<br>
      Commit to Disk:          ( 17.90%)  2913 ms<br>
  ------------------------------------------------<br>
  Total Link Time:             (100.00%) 16278 ms<br>
<br>
whereas if I link with only /OPT:ICF and /OPT:REF but remove /DEBUG I get this:<br>
<br>
    Input File Reading: ( 54.80%) 542 ms<br>
    ICF:                ( 11.93%) 118 ms<br>
    GC:                 ( 16.38%) 162 ms<br>
    Code Layout:        ( 13.14%) 130 ms<br>
    Commit Output File: (  1.31%)  13 ms<br>
  ---------------------------------------<br>
  Total Link Time:      (100.00%) 989 ms<br>
<br>
I think this is a more friendly output and more useful from a usability perspective.  But if I went a little overboard let me know :)<br>
<br>
<br>
<a href="https://reviews.llvm.org/D41915" rel="noreferrer" target="_blank">https://reviews.llvm.org/D41915</a><br>
<br>
Files:<br>
  lld/COFF/Config.h<br>
  lld/COFF/Driver.cpp<br>
  lld/COFF/ICF.cpp<br>
  lld/COFF/MarkLive.cpp<br>
  lld/COFF/Options.td<br>
  lld/COFF/PDB.cpp<br>
  lld/COFF/PDB.h<br>
  lld/COFF/Timing.h<br>
  lld/COFF/Writer.cpp<br>
  lld/COFF/Writer.h<br>
  lld/Common/CMakeLists.txt<br>
  lld/Common/LinkTimer.cpp<br>
  lld/include/lld/Common/LinkTimer.h<br>
<br>
</blockquote></div>