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



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to