[PATCH] D74169: [WIP][LLD][ELF][DebugInfo] Remove obsolete debug info.

Nikhil Benesch via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 17 21:16:45 PDT 2020


benesch added a comment.

Just an excited observer, but wanted to drop some statistics of my own, in case they're helpful.

I have a Rust project (Materialize <http://github.com/MaterializeInc/materialize>) that compiles down into a ~800MB (!) binary by default. The weight is almost entirely debug info; .text is less than 5% of its size. This is evidently an artifact of how Rust codegen units are much, much larger than your average C/C++ codegen units and so the toolchain relies heavily on the linker for dead code elimination. Of course that dead code elimination doesn't currently apply to the debug info. This diff is exactly what's needed to solve the problem, as far as I can tell. (There's an upstream issue about this that led me here: https://github.com/rust-lang/rust/issues/56068.)

Without `--gc-debuginfo`:

  # Link time: 10.486s
  benesch at gibbon:~/materialize$ bloaty target/release/materialized -n 10
      FILE SIZE        VM SIZE    
   --------------  -------------- 
    24.5%   194Mi   0.0%       0    .debug_info
    24.1%   191Mi   0.0%       0    .debug_loc
    13.8%   109Mi   0.0%       0    .debug_pubtypes
    10.1%  79.9Mi   0.0%       0    .debug_pubnames
     8.8%  70.0Mi   0.0%       0    .debug_str
     8.3%  66.3Mi   0.0%       0    .debug_ranges
     4.4%  35.3Mi   0.0%       0    .debug_line
     3.1%  24.8Mi  66.3%  24.8Mi    .text
     1.8%  14.4Mi  25.1%  9.39Mi    [41 Others]
     0.6%  4.79Mi   0.0%       0    .strtab
     0.4%  3.22Mi   8.6%  3.22Mi    .eh_frame
   100.0%   793Mi 100.0%  37.4Mi    TOTAL

With `--gc-debuginfo`:

  # Link time: 249.855s
  benesch at gibbon:~/materialize$ bloaty target/release/materialized -n 10
      FILE SIZE        VM SIZE    
   --------------  -------------- 
    37.9%   115Mi   0.0%       0    .debug_info
    17.9%  54.7Mi   0.0%       0    .debug_str
    12.0%  36.7Mi   0.0%       0    .debug_ranges
    11.2%  34.4Mi   0.0%       0    .debug_loc
     8.1%  24.8Mi  66.3%  24.8Mi    .text
     6.6%  20.1Mi   0.0%       0    .debug_line
     2.7%  8.15Mi  19.3%  7.23Mi    [35 Others]
     1.6%  4.79Mi   0.0%       0    .strtab
     1.1%  3.22Mi   8.6%  3.22Mi    .eh_frame
     1.0%  2.99Mi   0.0%       0    .symtab
     0.0%       0   5.8%  2.16Mi    .bss
   100.0%   305Mi 100.0%  37.4Mi    TOTAL

So hugely successful in reducing the size of the debug info! The new binary is 40% of the size of the original. Some of that savings is from omitting `debug_pubtypes` and `debug_pubnames`, which is easy enough to strip without this patch, but there is also a substantial reduction in `debug_info` and `debug_loc`—a much larger reduction than `dbz` is able to provide.

Unfortunately there is also a massive blowup in link times, from 10s to 250s. That's a 25x increase, much larger than the link time increase for Clang described above, which was about 4x.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74169/new/

https://reviews.llvm.org/D74169





More information about the llvm-commits mailing list