On Fri, Jan 29, 2021 at 8:43 PM Nick Desaulniers <ndesaulniers@xxxxxxxxxx> wrote: > > DWARF v5 is the latest standard of the DWARF debug info format. > > Feature detection of DWARF5 is onerous, especially given that we've > removed $(AS), so we must query $(CC) for DWARF5 assembler directive > support. > > The DWARF version of a binary can be validated with: > $ llvm-dwarfdump vmlinux | head -n 4 | grep version > or > $ readelf --debug-dump=info vmlinux 2>/dev/null | grep Version > > DWARF5 wins significantly in terms of size when mixed with compression > (CONFIG_DEBUG_INFO_COMPRESSED). > > 363M vmlinux.clang12.dwarf5.compressed > 434M vmlinux.clang12.dwarf4.compressed > 439M vmlinux.clang12.dwarf2.compressed > 457M vmlinux.clang12.dwarf5 > 536M vmlinux.clang12.dwarf4 > 548M vmlinux.clang12.dwarf2 > > 515M vmlinux.gcc10.2.dwarf5.compressed > 599M vmlinux.gcc10.2.dwarf4.compressed > 624M vmlinux.gcc10.2.dwarf2.compressed > 630M vmlinux.gcc10.2.dwarf5 > 765M vmlinux.gcc10.2.dwarf4 > 809M vmlinux.gcc10.2.dwarf2 > > Though the quality of debug info is harder to quantify; size is not a > proxy for quality. > > Jakub notes: > All [GCC] 5.1 - 6.x did was start accepting -gdwarf-5 as experimental > option that enabled some small DWARF subset (initially only a few > DW_LANG_* codes newly added to DWARF5 drafts). Only GCC 7 (released > after DWARF 5 has been finalized) started emitting DWARF5 section > headers and got most of the DWARF5 changes in... > > Version check GCC so that we don't need to worry about the difference in > command line args between GNU readelf and llvm-readelf/llvm-dwarfdump to > validate the DWARF Version in the assembler feature detection script. > > GNU `as` only recently gained support for specifying -gdwarf-5, so when > compiling with Clang but without Clang's integrated assembler > (LLVM_IAS=1 is not set), explicitly add -Wa,-gdwarf-5 to DEBUG_CFLAGS. > > Disabled for now if CONFIG_DEBUG_INFO_BTF is set; pahole doesn't yet > recognize the new additions to the DWARF debug info. Thanks to Sedat for > the report. > > Link: http://www.dwarfstd.org/doc/DWARF5.pdf > Reported-by: Sedat Dilek <sedat.dilek@xxxxxxxxx> > Suggested-by: Arvind Sankar <nivedita@xxxxxxxxxxxx> > Suggested-by: Caroline Tice <cmtice@xxxxxxxxxx> > Suggested-by: Fangrui Song <maskray@xxxxxxxxxx> > Suggested-by: Jakub Jelinek <jakub@xxxxxxxxxx> > Suggested-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > Suggested-by: Nathan Chancellor <natechancellor@xxxxxxxxx> > Signed-off-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > --- > Makefile | 12 ++++++++++++ > include/asm-generic/vmlinux.lds.h | 6 +++++- > lib/Kconfig.debug | 18 ++++++++++++++++++ > scripts/test_dwarf5_support.sh | 8 ++++++++ > 4 files changed, 43 insertions(+), 1 deletion(-) > create mode 100755 scripts/test_dwarf5_support.sh > > diff --git a/Makefile b/Makefile > index 20141cd9319e..bed8b3b180b8 100644 > --- a/Makefile > +++ b/Makefile > @@ -832,8 +832,20 @@ endif > > dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF5) := 5 > DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > > +# If using clang without the integrated assembler, we need to explicitly tell > +# GAS that we will be feeding it DWARF v5 assembler directives. Kconfig should > +# detect whether the version of GAS supports DWARF v5. > +ifdef CONFIG_CC_IS_CLANG > +ifneq ($(LLVM_IAS),1) > +ifeq ($(dwarf-version-y),5) > +DEBUG_CFLAGS += -Wa,-gdwarf-5 I noticed double "-g -gdwarf-5 -g -gdwarf-5" (a different issue) and that's why I looked again into the top-level Makefile. Should this be...? KBUILD_AFLAGS += -Wa,-gdwarf-5 - Sedat - > +endif > +endif > +endif > + > ifdef CONFIG_DEBUG_INFO_REDUCED > DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \ > $(call cc-option,-fno-var-tracking) > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > index 34b7e0d2346c..f8d5455cd87f 100644 > --- a/include/asm-generic/vmlinux.lds.h > +++ b/include/asm-generic/vmlinux.lds.h > @@ -843,7 +843,11 @@ > .debug_types 0 : { *(.debug_types) } \ > /* DWARF 5 */ \ > .debug_macro 0 : { *(.debug_macro) } \ > - .debug_addr 0 : { *(.debug_addr) } > + .debug_addr 0 : { *(.debug_addr) } \ > + .debug_line_str 0 : { *(.debug_line_str) } \ > + .debug_loclists 0 : { *(.debug_loclists) } \ > + .debug_rnglists 0 : { *(.debug_rnglists) } \ > + .debug_str_offsets 0 : { *(.debug_str_offsets) } > > /* Stabs debugging sections. */ > #define STABS_DEBUG \ > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index 1850728b23e6..09146b1af20d 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -273,6 +273,24 @@ config DEBUG_INFO_DWARF4 > It makes the debug information larger, but it significantly > improves the success of resolving variables in gdb on optimized code. > > +config DEBUG_INFO_DWARF5 > + bool "Generate DWARF Version 5 debuginfo" > + depends on GCC_VERSION >= 50000 || CC_IS_CLANG > + depends on CC_IS_GCC || $(success,$(srctree)/scripts/test_dwarf5_support.sh $(CC) $(CLANG_FLAGS)) > + depends on !DEBUG_INFO_BTF > + help > + Generate DWARF v5 debug info. Requires binutils 2.35, gcc 5.0+ (gcc > + 5.0+ accepts the -gdwarf-5 flag but only had partial support for some > + draft features until 7.0), and gdb 8.0+. > + > + Changes to the structure of debug info in Version 5 allow for around > + 15-18% savings in resulting image and debug info section sizes as > + compared to DWARF Version 4. DWARF Version 5 standardizes previous > + extensions such as accelerators for symbol indexing and the format > + for fission (.dwo/.dwp) files. Users may not want to select this > + config if they rely on tooling that has not yet been updated to > + support DWARF Version 5. > + > endchoice # "DWARF version" > > config DEBUG_INFO_BTF > diff --git a/scripts/test_dwarf5_support.sh b/scripts/test_dwarf5_support.sh > new file mode 100755 > index 000000000000..1a00484d0b2e > --- /dev/null > +++ b/scripts/test_dwarf5_support.sh > @@ -0,0 +1,8 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0 > + > +# Test that assembler accepts -gdwarf-5 and .file 0 directives, which were bugs > +# in binutils < 2.35. > +# https://sourceware.org/bugzilla/show_bug.cgi?id=25612 > +# https://sourceware.org/bugzilla/show_bug.cgi?id=25614 > +echo '.file 0 "filename"' | $* -gdwarf-5 -Wa,-gdwarf-5 -c -x assembler -o /dev/null - > -- > 2.30.0.365.g02bc693789-goog >