Issue 53156
Summary lld breaks perf DWARF backtraces
Labels new issue
Assignees
Reporter Kha
    I don't know if this is a bug in lld, perf, or libunwind, only that it doesn't happen with ld: when I link with lld, perf DWARF stack traces are incomplete. In a more complex application, this leads to stack traces being much shorter (and thus less helpful) than when linking with ld, but the following MWE demonstrates a difference in at least the `_start` symbol:

```
$ cat foo.c
#include <stdio.h>

void foo(int d) { int s = 0; for (int i = 0; i < 1000000; i++) { printf(""); s += i / d; } }
int main() { foo(100000); }

$ perf --version
perf version 5.10.89

$ clang -v foo.c && perf record --call-graph dwarf ./a.out && perf report | head -n 30
clang -v foo.c && perf record --call-graph dwarf ./a.out && perf report | head -n 30
clang version 13.0.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin
Found candidate GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0
Found candidate GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0
Selected GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin/clang-13" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name foo.c -mrelocation-model static -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -v -fcoverage-compilation-dir=/tmp -nostdsysteminc -resource-dir /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root -idirafter /nix/store/12z1nc5fmif2z7wian28n55j61acbmny-glibc-2.33-59-dev/include -internal-isystem /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root/include -fdebug-compilation-dir=/tmp -ferror-limit 19 -fgnuc-version=4.2.1 -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/foo-a74ba0.o -x c foo.c
clang -cc1 version 13.0.0 based upon LLVM 13.0.0 default target x86_64-unknown-linux-gnu
#include "..." search starts here:
#include <...> search starts here:
 /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root/include
 /nix/store/12z1nc5fmif2z7wian28n55j61acbmny-glibc-2.33-59-dev/include
End of search list.
 "/nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/bin/ld" --eh-frame-hdr -m elf_x86_64 -o a.out /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crt1.o /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crti.o /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0/crtbegin.o -L/nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0 -L/nix/store/m756011mkf1i0ki78i8y6ac3gf8qphvi-gcc-10.3.0-lib/x86_64-unknown-linux-gnu/lib -L/nix/store/8prp770hvr3cgaab7wn61dq3llc07ryg-clang-13.0.0-lib/lib -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0 -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0/../../../../lib64 -L/nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin/../lib -dynamic-linker=/nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/ld-linux-x86-64.so.2 /tmp/foo-a74ba0.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0/crtend.o /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crtn.o
[ perf record: Woken up 2 times to write data ]
[ perf record: Captured and wrote 0.430 MB perf.data (53 samples) ]
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 53  of event 'cycles:u'
# Event count (approx.): 47036836
#
# Children      Self  Command  Shared Object     Symbol
# ........  ........  .......  ................  .................................
#
    99.96%     0.00%  a.out    a.out             [.] _start
            |
            ---_start
               __libc_start_main
               main
               foo
               |
                --91.78%--__printf (inlined)
                          |
                           --84.62%--__vfprintf_internal
                                     |
                                     |--6.46%--_IO_new_file_xsputn (inlined)
                                     |
                                      --2.45%--__strchrnul_avx2

    99.96%     0.00%  a.out    libc-2.33.so      [.] __libc_start_main
            |
            ---__libc_start_main
               main
               
$ clang -v -fuse-ld=lld foo.c && perf record --call-graph dwarf ./a.out && perf report | head -n 30
clang version 13.0.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin
Found candidate GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0
Found candidate GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0
Selected GCC installation: /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin/clang-13" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name foo.c -mrelocation-model static -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -v -fcoverage-compilation-dir=/tmp -nostdsysteminc -resource-dir /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root -idirafter /nix/store/12z1nc5fmif2z7wian28n55j61acbmny-glibc-2.33-59-dev/include -internal-isystem /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root/include -fdebug-compilation-dir=/tmp -ferror-limit 19 -fgnuc-version=4.2.1 -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/foo-266589.o -x c foo.c
clang -cc1 version 13.0.0 based upon LLVM 13.0.0 default target x86_64-unknown-linux-gnu
#include "..." search starts here:
#include <...> search starts here:
 /nix/store/sjyb4lh03rxfy459i4086k9q897rglgf-clang-wrapper-13.0.0/resource-root/include
 /nix/store/12z1nc5fmif2z7wian28n55j61acbmny-glibc-2.33-59-dev/include
End of search list.
 "/nix/store/3y82ady9hh6pjyap4l42z638z25m4xxp-llvm-binutils-13.0.0/bin/ld.lld" --eh-frame-hdr -m elf_x86_64 -o a.out /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crt1.o /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crti.o /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0/crtbegin.o -L/nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0 -L/nix/store/m756011mkf1i0ki78i8y6ac3gf8qphvi-gcc-10.3.0-lib/x86_64-unknown-linux-gnu/lib -L/nix/store/8prp770hvr3cgaab7wn61dq3llc07ryg-clang-13.0.0-lib/lib -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0 -L/nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib64/gcc/x86_64-unknown-linux-gnu/10.3.0/../../../../lib64 -L/nix/store/ry469fxcshgi8k6mavw5623ps4wyc2dp-clang-13.0.0/bin/../lib -dynamic-linker=/nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/ld-linux-x86-64.so.2 /tmp/foo-266589.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /nix/store/mrqrvina0lfgrvdzfyri7sw9vxy6pyms-gcc-10.3.0/lib/gcc/x86_64-unknown-linux-gnu/10.3.0/crtend.o /nix/store/vjq3q7dq8vmc13c3py97v27qwizvq7fd-glibc-2.33-59/lib/crtn.o
[ perf record: Woken up 2 times to write data ]
[ perf record: Captured and wrote 0.438 MB perf.data (54 samples) ]
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 54  of event 'cycles:u'
# Event count (approx.): 47911504
#
# Children      Self  Command  Shared Object     Symbol
# ........  ........  .......  ................  .................................
#
    99.96%     0.00%  a.out    [unknown]         [.] 0xffffffffffffffff
            |
            ---0xffffffffffffffff
               __libc_start_main
               main
               foo
               |
                --82.89%--__printf (inlined)
                          |
                           --67.62%--__vfprintf_internal
                                     |
                                     |--6.38%--_IO_new_file_xsputn (inlined)
                                     |
                                      --2.41%--__strchrnul_avx2

    99.96%     0.00%  a.out    libc-2.33.so      [.] __libc_start_main
            |
            ---__libc_start_main
               main
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to