[PATCH] D54747: Discard debuginfo for object files empty after GC

Reid Kleckner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 15 15:32:02 PDT 2019


rnk added a comment.

I think there's an issue with the whole idea of dropping .debug_info from objects without live sections. Consider:

  // a.cpp
  int main() {
    return f();
  }
  // b.cpp
  struct Foo {
    int x, y;
  };
  int f() {
    volatile Foo var;
    var.x = 13;
    var.y = 42;
    return var.x + var.y;
  }

When compiled and linked with thinlto, `f` is imported into the a.cpp TU, but the full definition of the `Foo` type remains in the b.cpp TU, because importing the full type would be expensive and wasteful.

I used these commands to show the change in behavior before and after this change:

  $ clang -O2 -flto=thin -c -ffunction-sections a.cpp b.cpp -g 
  # before
  $ ninja lld
  [1 processes, 3/3 @ 0.8/s : 3.582s ] Linking CXX executable bin/lld
  $ clang -Wl,--gc-sections -flto=thin  -fuse-ld=lld a.o b.o  -o t.exe
  $ gdb -ex 'b foo' -ex r -ex s -ex 'p var' -batch t.exe
  ...
  Breakpoint 1 at 0x201168: file a.cpp, line 2.
  
  Breakpoint 1, foo () at b.cpp:7
  7         var.y = 42;
  8         return var.x + var.y;
  $1 = {x = 13, y = 42}
  # after
  $ ninja lld 
  $ clang -Wl,--gc-sections -flto=thin  -fuse-ld=lld a.o b.o  -o t.exe 
  $ gdb -ex 'b foo' -ex r -ex s -ex 'p var' -batch t.exe
  ...
  Breakpoint 1 at 0x201168: file a.cpp, line 2.
  
  Breakpoint 1, foo () at b.cpp:7
  7         var.y = 42;
  8         return var.x + var.y;
  $1 = <incomplete type>

So, before `Foo` had a complete type, but now it does not.

I can't seem to construct an example where LLD will throw away useful debug info without thinlto, but Clang often makes assumptions that other object files will provide certain bits of debug info as a size optimization.


Repository:
  rL LLVM

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

https://reviews.llvm.org/D54747





More information about the llvm-commits mailing list