Skip to content
  1. Oct 08, 2016
    • Mehdi Amini's avatar
      ThinLTO: handles modules with empty summaries · 00fa1409
      Mehdi Amini authored
      We need to add an entry in the combined-index for modules that have
      a hash but otherwise empty summary, this is needed so that we can
      get the hash for the module.
      
      Also, if no entry is present in the combined index for a module, we
      need to skip it when trying to compute a cache entry.
      
      Differential Revision: https://reviews.llvm.org/D25300
      
      llvm-svn: 283654
      00fa1409
    • Zachary Turner's avatar
      [pdb] Dump Module Symbols to Yaml. · 3b14764c
      Zachary Turner authored
      This is the first step towards round-tripping symbol information,
      and thusly being able to write symbol information to a PDB.
      
      This patch writes the symbol information for each compiland to
      the Yaml when running in pdb2yaml mode.  There's still some loose
      ends, such as what to do about relocations (necessary in order to
      print linkage names), how to print enums with friendly names, and
      how to give the dumper access to the StringTable, but this is a
      good first start.
      
      llvm-svn: 283641
      3b14764c
    • Hal Finkel's avatar
      [llvm-opt-report] Don't leave space for opts that never happen · f495280a
      Hal Finkel authored
      Because screen space is precious, if an optimization (vectorization, for
      example) never happens, don't leave empty space for the associated markers on
      every line of the output. This makes the output much more compact, and allows
      for the later inclusion of markers for more (although perhaps rare)
      optimizations.
      
      llvm-svn: 283626
      f495280a
  2. Oct 07, 2016
    • Zachary Turner's avatar
      Refactor Symbol visitor code. · 0d840744
      Zachary Turner authored
      Type visitor code had already been refactored previously to
      decouple the visitor and the visitor callback interface.  This
      was necessary for having the flexibility to visit in different
      ways (for example, dumping to yaml, reading from yaml, dumping
      to ScopedPrinter, etc).
      
      This patch merely implements the same visitation pattern for
      symbol records that has already been implemented for type records.
      
      llvm-svn: 283609
      0d840744
    • Mehdi Amini's avatar
      Recommit "Use StringRef in LTOModule implementation (NFC)"" · dc5a507c
      Mehdi Amini authored
      This reverts commit r283456 and reapply r282997, with explicitly
      zeroing the struct member to workaround a bug in MSVC2013 with
      zero-initialization: https://connect.microsoft.com/VisualStudio/feedback/details/802160
      
      llvm-svn: 283581
      dc5a507c
    • Hal Finkel's avatar
      [llvm-opt-report] Left justify unrolling counts, etc. · 5d41f032
      Hal Finkel authored
      In the left part of the reports, we have things like U<number>; if some of
      these numbers use more digits than others, we don't want a space in between the
      U and the start of the number. Instead, the space should come afterward. This
      way it is clear that the number goes with the U and not any other optimization
      indicator that might come later on the line.
      
      Tests committed in r283518.
      
      llvm-svn: 283519
      5d41f032
    • Hal Finkel's avatar
      [llvm-opt-report] Use -no-demangle to disable demangling · 16d29e31
      Hal Finkel authored
      As this is intended to be a user-facing option, -no-demangle seems much better
      than -demangle=0. Add testing for the option.
      
      llvm-svn: 283516
      16d29e31
  3. Oct 06, 2016
    • Michael Ilseman's avatar
      Revert "Add -strip-nonlinetable-debuginfo capability" · 6d6b4d87
      Michael Ilseman authored
      This reverts commit r283473.
      
      Reverted until review is completed.
      
      llvm-svn: 283478
      6d6b4d87
    • Michael Ilseman's avatar
      Add -strip-nonlinetable-debuginfo capability · d0a4db76
      Michael Ilseman authored
      This adds a new function to DebugInfo.cpp that takes an llvm::Module
      as input and removes all debug info metadata that is not directly
      needed for line tables, thus effectively stripping all type and
      variable information from the module.
      
      The primary motivation for this feature was the bitcode work flow
      (cf. http://lists.llvm.org/pipermail/llvm-dev/2016-June/100643.html
      for more background). This is not wired up yet, but will be in
      subsequent patches.  For testing, the new functionality is exposed to
      opt with a -strip-nonlinetable-debuginfo option.
      
      The secondary use-case (and one that works right now!) is as a
      reduction pass in bugpoint. I added two new bugpoint options
      (-disable-strip-debuginfo and -disable-strip-debug-types) to control
      the new features. By default it will first attempt to remove all debug
      information, then only the type info, and then proceed to hack at any
      remaining MDNodes.
      
      llvm-svn: 283473
      d0a4db76
    • Mehdi Amini's avatar
      Revert "Use StringRef in LTOModule implementation (NFC)" · a5ee8986
      Mehdi Amini authored
      This reverts commit r282997, a windows bot is asserting in
      one test apparently.
      
      llvm-svn: 283456
      a5ee8986
    • Rafael Espindola's avatar
      Refactor to use getSectionContentsAsArray. · c3befb2e
      Rafael Espindola authored
      This centralizes quite a bit of error checking.
      
      llvm-svn: 283454
      c3befb2e
    • Rafael Espindola's avatar
      Refactor duplicated typedefs. NFC. · 6bc2990d
      Rafael Espindola authored
      llvm-svn: 283453
      6bc2990d
    • Sam Kolton's avatar
      [AMDGPU] Disassembler: print label names in branch instructions · 3381d7a2
      Sam Kolton authored
      Summary: Add AMDGPUSymbolizer for finding names for labels from ELF symbol table.
      Initialize MCObjectFileInfo with some default values.
      
      Reviewers: vpykhtin, artem.tamazov, tstellarAMD
      
      Subscribers: arsenm, kzhuravl, wdng, nhaehnle, yaxunl, tony-tye
      
      Differential Revision: https://reviews.llvm.org/D24802
      
      llvm-svn: 283450
      3381d7a2
    • Rafael Espindola's avatar
      Use range loop. NFC. · 28c63d3e
      Rafael Espindola authored
      llvm-svn: 283447
      28c63d3e
    • Hal Finkel's avatar
      [llvm-opt-report] Record VF, etc. correctly for multiple opts on one line · 4d6f3088
      Hal Finkel authored
      When there are multiple optimizations on one line, record the vectorization
      factors, etc. correctly (instead of incorrectly substituting default values).
      
      llvm-svn: 283443
      4d6f3088
    • Hal Finkel's avatar
      [llvm-opt-report] Print line numbers starting from 1 · 47faf3be
      Hal Finkel authored
      Line numbers should start from 1, not 2.
      
      llvm-svn: 283440
      47faf3be
    • Hal Finkel's avatar
      [llvm-opt-report] Distinguish inlined contexts when optimizations differ · 5aa02480
      Hal Finkel authored
      How code is optimized sometimes, perhaps often, depends on the context into
      which it was inlined. This change allows llvm-opt-report to track the
      differences between the optimizations performed, or not, in different contexts,
      and when these differ, display those differences.
      
      For example, this code:
      
        $ cat /tmp/q.cpp
        void bar();
        void foo(int n) {
          for (int i = 0; i < n; ++i)
            bar();
        }
      
        void quack() {
          foo(4);
        }
      
        void quack2() {
          foo(4);
        }
      
      will now produce this report:
      
        < /home/hfinkel/src/llvm/test/tools/llvm-opt-report/Inputs/q.cpp
         2         | void bar();
         3         | void foo(int n) {
         [[
          > foo(int):
         4         |   for (int i = 0; i < n; ++i)
          > quack(), quack2():
         4  U4     |   for (int i = 0; i < n; ++i)
         ]]
         5         |     bar();
         6         | }
         7         |
         8         | void quack() {
         9 I       |   foo(4);
        10         | }
        11         |
        12         | void quack2() {
        13 I       |   foo(4);
        14         | }
        15         |
      
      Note that the tool has demangled the function names, and grouped the reports
      associated with line 4. This shows that the loop on line 4 was unrolled by a
      factor of 4 when inlined into the functions quack() and quack2(), but not in
      the function foo(int) itself.
      
      llvm-svn: 283402
      5aa02480
    • Hal Finkel's avatar
      Add an llvm-opt-report tool to generate basic source-annotated optimization summaries · 52031b7e
      Hal Finkel authored
      LLVM now has the ability to record information from optimization remarks in a
      machine-consumable YAML file for later analysis. This can be enabled in opt
      (see r282539), and D25225 adds a Clang flag to do the same. This patch adds
      llvm-opt-report, a tool to generate basic optimization "listing" files
      (annotated sources with information about what optimizations were performed)
      from one of these YAML inputs.
      
      D19678 proposed to add this capability directly to Clang, but this more-general
      YAML-based infrastructure was the direction we decided upon in that review
      thread.
      
      For this optimization report, I focused on making the output as succinct as
      possible while providing information on inlining and loop transformations. The
      goal here is that the source code should still be easily readable in the
      report. My primary inspiration here is the reports generated by Cray's tools
      (http://docs.cray.com/books/S-2496-4101/html-S-2496-4101/z1112823641oswald.html).
      These reports are highly regarded within the HPC community. Intel's compiler,
      for example, also has an optimization-report capability
      (https://software.intel.com/sites/default/files/managed/55/b1/new-compiler-optimization-reports.pdf).
      
        $ cat /tmp/v.c
        void bar();
        void foo() { bar(); }
      
        void Test(int *res, int *c, int *d, int *p, int n) {
          int i;
      
        #pragma clang loop vectorize(assume_safety)
          for (i = 0; i < 1600; i++) {
            res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];
          }
      
          for (i = 0; i < 16; i++) {
            res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];
          }
      
          foo();
      
          foo(); bar(); foo();
        }
      
      D25225 adds -fsave-optimization-record (and
      -fsave-optimization-record=filename), and this would be used as follows:
      
        $ clang -O3 -o /tmp/v.o -c /tmp/v.c -fsave-optimization-record
        $ llvm-opt-report /tmp/v.yaml > /tmp/v.lst
        $ cat /tmp/v.lst
      
        < /tmp/v.c
         2          | void bar();
         3          | void foo() { bar(); }
         4          |
         5          | void Test(int *res, int *c, int *d, int *p, int n) {
         6          |   int i;
         7          |
         8          | #pragma clang loop vectorize(assume_safety)
         9     V4,2 |   for (i = 0; i < 1600; i++) {
        10          |     res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];
        11          |   }
        12          |
        13  U16     |   for (i = 0; i < 16; i++) {
        14          |     res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];
        15          |   }
        16          |
        17 I        |   foo();
        18          |
        19          |   foo(); bar(); foo();
           I        |   ^
           I        |                 ^
        20          | }
      
      Each source line gets a prefix giving the line number, and a few columns for
      important optimizations: inlining, loop unrolling and loop vectorization. An
      'I' is printed next to a line where a function was inlined, a 'U' next to an
      unrolled loop, and 'V' next to a vectorized loop. These are printed on the
      relevant code line when that seems unambiguous, or on subsequent lines when
      multiple potential options exist (messages, both positive and negative, from
      the same optimization with different column numbers are taken to indicate
      potential ambiguity). When on subsequent lines, a '^' is output in the relevant
      column.
      
      Annotated source for all relevant input files are put into the listing file
      (each starting with '<' and then the file name).
      
      You can disable having the unrolling/vectorization factors appear by using the
      -s flag.
      
      Differential Revision: https://reviews.llvm.org/D25262
      
      llvm-svn: 283398
      52031b7e
  4. Oct 05, 2016
    • Rafael Espindola's avatar
      Misc improvements to StringTableBuilder. · 39751afc
      Rafael Espindola authored
      This patch adds write methods to StringTableBuilder so that it is
      easier to change the underlying implementation.
      
      Using the write methods, avoid creating a temporary buffer when using
      mmaped output.
      
      It also uses a more compact key in the DenseMap. Overall this produces
      a slightly faster lld:
      
      firefox
        master 6.853419709
        patch  6.841968912 1.00167361138x faster
      chromium
        master 4.297280174
        patch  4.298712163 1.00033323147x slower
      chromium fast
        master 1.802335952
        patch  1.806872459 1.00251701521x slower
      the gold plugin
        master 0.3247149
        patch  0.321971644 1.00852017888x faster
      clang
        master 0.551279945
        patch  0.543733194 1.01387951128x faster
      llvm-as
        master 0.032743458
        patch  0.032143478 1.01866568391x faster
      the gold plugin fsds
        master 0.350814247
        patch  0.348571741 1.00643341309x faster
      clang fsds
        master 0.6281672
        patch  0.621130222 1.01132931187x faster
      llvm-as fsds
        master 0.030168899
        patch  0.029797155 1.01247582194x faster
      scylla
        master 3.104222518
        patch  3.059590248 1.01458766252x faster
      
      llvm-svn: 283266
      39751afc
  5. Oct 04, 2016
  6. Oct 03, 2016
  7. Oct 01, 2016
  8. Sep 30, 2016
    • Rui Ueyama's avatar
      Do not pass a superblock to PDBFileBuilder. · 5d6714e5
      Rui Ueyama authored
      When we create a PDB file using PDBFileBuilder, the information
      in the superblock, such as the size of the resulting file, is not
      available.
      
      Previously, PDBFileBuilder::initialize took a superblock assuming
      that all the members of the struct are correct. That is useful when
      you want to restore the exact information from a YAML file, but
      that's probably the only use case in which that is useful.
      When we are creating a PDB file on the fly, we have to backfill the
      members.
      
      This patch redefines PDBFileBuilder::initialize to take only a
      block size. Now all the other members are left as default values,
      so that they'll be updated when commit() is called.
      
      Differential Revision: https://reviews.llvm.org/D25108
      
      llvm-svn: 282944
      5d6714e5
    • Rui Ueyama's avatar
      Pass a filename instead of a msf::WritableStream to PDBFileBuilder::commit. · fc22cef9
      Rui Ueyama authored
      WritableStream needs the exact file size to open a file, but
      until we fix the final layout of a PDB file, we don't know the
      size of the file.
      
      This patch changes the parameter type of PDBFileBuilder::commit
      to solve that chiecken-and-egg problem. Now the function opens
      a file after fixing the layout, so it can create a file with the
      exact size.
      
      Differential Revision: https://reviews.llvm.org/D25107
      
      llvm-svn: 282940
      fc22cef9
    • Joerg Sonnenberger's avatar
      HAVE_LINK_R is not the only reason why this needs config.h. · a5c91d8e
      Joerg Sonnenberger authored
      llvm-svn: 282923
      a5c91d8e
  9. Sep 28, 2016
    • Mike Aizatsky's avatar
      [sancov] introducing symbolized coverage files (.symcov) · 392caa53
      Mike Aizatsky authored
      Summary:
      Answering any meaningful questions about .sancov files requires
      accessing symbol information from the corresponding binary.
      
      This change introduces a separate intermediate data structure and
      format: symbolized coverage. It contains all symbol information that
      is required to answer common queries:
      - merging
      - coverd/uncovered files and functions
      - line status.
      
      Also removing the html report functionality from sancov: generated
      HTML files are too huge, and a different approach is required.
      Maintaining this half-working approach in the C++ is painful.
      
      Differential Revision: https://reviews.llvm.org/D24947
      
      llvm-svn: 282639
      392caa53
    • Mike Aizatsky's avatar
      [sancov] a simple .symcov coverage report server · fa57bf1b
      Mike Aizatsky authored
      Coverage reports for gigabyte-sized binaries are huge. There's no
      practical reason to generate them statically.
      
      Implementing an experiment http coverage report server. The server
      loads .symcov file and serves interactive coverage pages.
      
      llvm-svn: 282637
      fa57bf1b
    • Dylan McKay's avatar
      [AVR] Allow llvm-objdump to handle AVR ELF files · 1166112f
      Dylan McKay authored
      llvm-svn: 282585
      1166112f
  10. Sep 27, 2016
    • Adam Nemet's avatar
      Output optimization remarks in YAML · a62b7e1a
      Adam Nemet authored
      (Re-committed after moving the template specialization under the yaml
      namespace.  GCC was complaining about this.)
      
      This allows various presentation of this data using an external tool.
      This was first recommended here[1].
      
      As an example, consider this module:
      
        1 int foo();
        2 int bar();
        3
        4 int baz() {
        5   return foo() + bar();
        6 }
      
      The inliner generates these missed-optimization remarks today (the
      hotness information is pulled from PGO):
      
        remark: /tmp/s.c:5:10: foo will not be inlined into baz (hotness: 30)
        remark: /tmp/s.c:5:18: bar will not be inlined into baz (hotness: 30)
      
      Now with -pass-remarks-output=<yaml-file>, we generate this YAML file:
      
        --- !Missed
        Pass:            inline
        Name:            NotInlined
        DebugLoc:        { File: /tmp/s.c, Line: 5, Column: 10 }
        Function:        baz
        Hotness:         30
        Args:
          - Callee: foo
          - String:  will not be inlined into
          - Caller: baz
        ...
        --- !Missed
        Pass:            inline
        Name:            NotInlined
        DebugLoc:        { File: /tmp/s.c, Line: 5, Column: 18 }
        Function:        baz
        Hotness:         30
        Args:
          - Callee: bar
          - String:  will not be inlined into
          - Caller: baz
        ...
      
      This is a summary of the high-level decisions:
      
      * There is a new streaming interface to emit optimization remarks.
      E.g. for the inliner remark above:
      
         ORE.emit(DiagnosticInfoOptimizationRemarkMissed(
                      DEBUG_TYPE, "NotInlined", &I)
                  << NV("Callee", Callee) << " will not be inlined into "
                  << NV("Caller", CS.getCaller()) << setIsVerbose());
      
      NV stands for named value and allows the YAML client to process a remark
      using its name (NotInlined) and the named arguments (Callee and Caller)
      without parsing the text of the message.
      
      Subsequent patches will update ORE users to use the new streaming API.
      
      * I am using YAML I/O for writing the YAML file.  YAML I/O requires you
      to specify reading and writing at once but reading is highly non-trivial
      for some of the more complex LLVM types.  Since it's not clear that we
      (ever) want to use LLVM to parse this YAML file, the code supports and
      asserts that we're writing only.
      
      On the other hand, I did experiment that the class hierarchy starting at
      DiagnosticInfoOptimizationBase can be mapped back from YAML generated
      here (see D24479).
      
      * The YAML stream is stored in the LLVM context.
      
      * In the example, we can probably further specify the IR value used,
      i.e. print "Function" rather than "Value".
      
      * As before hotness is computed in the analysis pass instead of
      DiganosticInfo.  This avoids the layering problem since BFI is in
      Analysis while DiagnosticInfo is in IR.
      
      [1] https://reviews.llvm.org/D19678#419445
      
      Differential Revision: https://reviews.llvm.org/D24587
      
      llvm-svn: 282539
      a62b7e1a
    • Martin Storsjö's avatar
      Fix a typo, depricated -> deprecated · 055a7026
      Martin Storsjö authored
      Differential Revision: https://reviews.llvm.org/D22849
      
      llvm-svn: 282534
      055a7026
Loading