Message ID | 20201104005343.4192504-5-ndesaulniers@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Kbuild: DWARF v5 support | expand |
On Tue, Nov 03, 2020 at 04:53:43PM -0800, Nick Desaulniers 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. GNU `as` only recently gained support for specifying > -gdwarf-5. With gcc, using -gdwarf-5 even without -Wa,--gdwarf-5 results in considerably smaller debug info. gcc does not seem to generate the .file 0 directive that causes older GNU as to barf. Should the assembler support check be restricted to CC_IS_CLANG? > /* Stabs debugging sections. */ > #define STABS_DEBUG \ > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index 03c494eefabd..c5b54ba51060 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -274,6 +274,14 @@ 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 DWARF5 debuginfo" > + depends on $(cc-option,-gdwarf-5) > + depends on $(success,$(srctree)/scripts/test_dwarf5_support.sh $(CC) $(CLANG_FLAGS)) > + help > + Genereate dwarf5 debug info. Requires binutils 2.35+, gcc 5.1+, and > + gdb 8.0+. > + > endchoice # "DWARF version" Perhaps this can be expanded with some description of the advantages of dwarf5 over dwarf4? > > config DEBUG_INFO_BTF > diff --git a/scripts/test_dwarf5_support.sh b/scripts/test_dwarf5_support.sh > new file mode 100755 > index 000000000000..156ad5ec4274 > --- /dev/null > +++ b/scripts/test_dwarf5_support.sh > @@ -0,0 +1,9 @@ > +#!/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 > +set -e > +echo '.file 0 "filename"' | $* -Wa,-gdwarf-5 -c -x assembler -o /dev/null - This also actually needs --gdwarf-5 to really check the support for the option, but older versions should error on the .file 0 in any case.
On Wed, Nov 4, 2020 at 9:54 AM Nick Desaulniers <ndesaulniers@google.com> 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. GNU `as` only recently gained support for specifying > -gdwarf-5. > > The DWARF version of a binary can be validated with: > $ llvm-dwarfdump vmlinux | head -n 5 | 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 > > Link: http://www.dwarfstd.org/doc/DWARF5.pdf > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > Suggested-by: Jakub Jelinek <jakub@redhat.com> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > --- > Makefile | 1 + > include/asm-generic/vmlinux.lds.h | 6 +++++- > lib/Kconfig.debug | 8 ++++++++ > scripts/test_dwarf5_support.sh | 9 +++++++++ > 4 files changed, 23 insertions(+), 1 deletion(-) > create mode 100755 scripts/test_dwarf5_support.sh > > diff --git a/Makefile b/Makefile > index e23786a4c1c7..9056bac0ff85 100644 > --- a/Makefile > +++ b/Makefile > @@ -828,6 +828,7 @@ 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) > ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > # Binutils 2.35+ required for -gdwarf-4+ support. > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > index b2b3d81b1535..76ce62c77029 100644 > --- a/include/asm-generic/vmlinux.lds.h > +++ b/include/asm-generic/vmlinux.lds.h > @@ -829,7 +829,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 03c494eefabd..c5b54ba51060 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -274,6 +274,14 @@ 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 DWARF5 debuginfo" The choice menu looks like follows: (X) Generate DWARF v2 debuginfo ( ) Generate dwarf4 debuginfo ( ) Generate DWARF5 debuginfo Upper / Lower case inconsistency. -- Best Regards Masahiro Yamada
On Tue, Nov 24, 2020 at 9:28 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > On Tue, Nov 03, 2020 at 04:53:43PM -0800, Nick Desaulniers 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. GNU `as` only recently gained support for specifying > > -gdwarf-5. > > With gcc, using -gdwarf-5 even without -Wa,--gdwarf-5 results in > considerably smaller debug info. gcc does not seem to generate the .file 0 > directive that causes older GNU as to barf. > > Should the assembler support check be restricted to CC_IS_CLANG? No, because if LLVM_IAS=1 then the assembler support need not be checked. > > > /* Stabs debugging sections. */ > > #define STABS_DEBUG \ > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 03c494eefabd..c5b54ba51060 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -274,6 +274,14 @@ 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 DWARF5 debuginfo" > > + depends on $(cc-option,-gdwarf-5) > > + depends on $(success,$(srctree)/scripts/test_dwarf5_support.sh $(CC) $(CLANG_FLAGS)) > > + help > > + Genereate dwarf5 debug info. Requires binutils 2.35+, gcc 5.1+, and > > + gdb 8.0+. > > + > > endchoice # "DWARF version" > > Perhaps this can be expanded with some description of the advantages of > dwarf5 over dwarf4? Will do. > > > > > config DEBUG_INFO_BTF > > diff --git a/scripts/test_dwarf5_support.sh b/scripts/test_dwarf5_support.sh > > new file mode 100755 > > index 000000000000..156ad5ec4274 > > --- /dev/null > > +++ b/scripts/test_dwarf5_support.sh > > @@ -0,0 +1,9 @@ > > +#!/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 > > +set -e > > +echo '.file 0 "filename"' | $* -Wa,-gdwarf-5 -c -x assembler -o /dev/null - > > This also actually needs --gdwarf-5 to really check the support for the > option, but older versions should error on the .file 0 in any case. Based on Jakub's feedback on the earlier thread https://lore.kernel.org/lkml/20201104121934.GT3788@tucnak/ it sounds like the dwarf version also needs to be dumped since GCC 5 < x < 7 accepts --gdwarf-5, but did not produce DWARF Version 5 debug info.
On Thu, Dec 3, 2020 at 3:22 PM Nick Desaulniers <ndesaulniers@google.com> wrote: > > On Tue, Nov 24, 2020 at 9:28 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > > > On Tue, Nov 03, 2020 at 04:53:43PM -0800, Nick Desaulniers 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. GNU `as` only recently gained support for specifying > > > -gdwarf-5. > > > > With gcc, using -gdwarf-5 even without -Wa,--gdwarf-5 results in > > considerably smaller debug info. gcc does not seem to generate the .file 0 > > directive that causes older GNU as to barf. > > > > Should the assembler support check be restricted to CC_IS_CLANG? > > No, because if LLVM_IAS=1 then the assembler support need not be checked. Also, if your version of GCC supports DWARF Version 5, but your version of GAS does not, then I'm more inclined to not allow CONFIG_DEBUG_INFO_DWARF5 to be selectable, rather than mix and match or partially support this for one but not the other. Either all tools used support DWARF 5, or you don't get to use DWARF 5. > > > config DEBUG_INFO_BTF > > > diff --git a/scripts/test_dwarf5_support.sh b/scripts/test_dwarf5_support.sh > > > new file mode 100755 > > > index 000000000000..156ad5ec4274 > > > --- /dev/null > > > +++ b/scripts/test_dwarf5_support.sh > > > @@ -0,0 +1,9 @@ > > > +#!/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 > > > +set -e > > > +echo '.file 0 "filename"' | $* -Wa,-gdwarf-5 -c -x assembler -o /dev/null - > > > > This also actually needs --gdwarf-5 to really check the support for the > > option, but older versions should error on the .file 0 in any case. > > Based on Jakub's feedback on the earlier thread > https://lore.kernel.org/lkml/20201104121934.GT3788@tucnak/ > it sounds like the dwarf version also needs to be dumped since GCC 5 < > x < 7 accepts --gdwarf-5, but did not produce DWARF Version 5 debug > info. Sigh...llvm-readelf doesn't accept --debug-dump=info for checking the DWARF version; llvm-dwarfdump works with no args...at this point I'm tempted to just version check GCC.
On Thu, Dec 03, 2020 at 03:28:14PM -0800, Nick Desaulniers wrote: > On Thu, Dec 3, 2020 at 3:22 PM Nick Desaulniers <ndesaulniers@google.com> wrote: > > > > On Tue, Nov 24, 2020 at 9:28 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > > > > > On Tue, Nov 03, 2020 at 04:53:43PM -0800, Nick Desaulniers 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. GNU `as` only recently gained support for specifying > > > > -gdwarf-5. > > > > > > With gcc, using -gdwarf-5 even without -Wa,--gdwarf-5 results in > > > considerably smaller debug info. gcc does not seem to generate the .file 0 > > > directive that causes older GNU as to barf. > > > > > > Should the assembler support check be restricted to CC_IS_CLANG? > > > > No, because if LLVM_IAS=1 then the assembler support need not be checked. > > Also, if your version of GCC supports DWARF Version 5, but your > version of GAS does not, then I'm more inclined to not allow > CONFIG_DEBUG_INFO_DWARF5 to be selectable, rather than mix and match > or partially support this for one but not the other. Either all tools > used support DWARF 5, or you don't get to use DWARF 5. > Why? Does this actually cause any problems? It seems like the options for gcc can actually be very straightforward: you just need a cc-option check, and then add -gdwarf-N to both CFLAGS and AFLAGS and you're done. Adding the -Wa flag is superfluous and carries the risk of interfering with what the compiler driver does. Just let the gcc driver handle the details. Clang/IAS is almost as straightforward, with the only additional edge case being that for assembler files, DWARF 2 doesn't work, so the CFLAGS is the same -gdwarf-N, but AFLAGS gets -gdwarf-N only if N > 2. The messy case is only Clang/IAS=0, which needs to check the support from the external assembler, and needs CFLAGS of -gdwarf-N and AFLAGS of -Wa,--gdwarf-N, because Clang doesn't pass that option on to an external assembler. This is why I was asking if the assembler support check can be restricted to CC_IS_CLANG: nothing but Clang/IAS=0 actually requires that check.
On Fri, Dec 4, 2020 at 9:06 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > On Thu, Dec 03, 2020 at 03:28:14PM -0800, Nick Desaulniers wrote: > > On Thu, Dec 3, 2020 at 3:22 PM Nick Desaulniers <ndesaulniers@google.com> wrote: > > > > > > On Tue, Nov 24, 2020 at 9:28 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > > > > > > > On Tue, Nov 03, 2020 at 04:53:43PM -0800, Nick Desaulniers 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. GNU `as` only recently gained support for specifying > > > > > -gdwarf-5. > > > > > > > > With gcc, using -gdwarf-5 even without -Wa,--gdwarf-5 results in > > > > considerably smaller debug info. gcc does not seem to generate the .file 0 > > > > directive that causes older GNU as to barf. > > > > > > > > Should the assembler support check be restricted to CC_IS_CLANG? > > > > > > No, because if LLVM_IAS=1 then the assembler support need not be checked. > > > > Also, if your version of GCC supports DWARF Version 5, but your > > version of GAS does not, then I'm more inclined to not allow > > CONFIG_DEBUG_INFO_DWARF5 to be selectable, rather than mix and match > > or partially support this for one but not the other. Either all tools > > used support DWARF 5, or you don't get to use DWARF 5. > > > > Why? Does this actually cause any problems? > > It seems like the options for gcc can actually be very straightforward: > you just need a cc-option check, and then add -gdwarf-N to both CFLAGS > and AFLAGS and you're done. Adding the -Wa flag is superfluous and > carries the risk of interfering with what the compiler driver does. Just > let the gcc driver handle the details. > > Clang/IAS is almost as straightforward, with the only additional edge > case being that for assembler files, DWARF 2 doesn't work, so the CFLAGS > is the same -gdwarf-N, but AFLAGS gets -gdwarf-N only if N > 2. > > The messy case is only Clang/IAS=0, which needs to check the support > from the external assembler, and needs CFLAGS of -gdwarf-N and AFLAGS of > -Wa,--gdwarf-N, because Clang doesn't pass that option on to an external > assembler. This is why I was asking if the assembler support check can > be restricted to CC_IS_CLANG: nothing but Clang/IAS=0 actually requires > that check. Oh, I see. Yeah, that might be a nicer approach. What should we do in the case of gcc < 7 though, where -gdwarf-5 won't produce DWARF v5? Maybe that's ok, but the intent behind the Kconfig check was to prevent the option from being selectable if the tools do not support it. Maybe it's more flexible to pass the arguments along, and hope for the best? As a gcc-5 user, I might be surprised if I chose CONFIG_DEBUG_INFO_DWARF5 if what I got was not actually DWARF v5; it does violate the principle of least surprise. Maybe that doesn't matter though?
On Thu, Dec 10, 2020 at 03:18:45PM -0800, Nick Desaulniers wrote: > On Fri, Dec 4, 2020 at 9:06 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > > > Why? Does this actually cause any problems? > > > > It seems like the options for gcc can actually be very straightforward: > > you just need a cc-option check, and then add -gdwarf-N to both CFLAGS > > and AFLAGS and you're done. Adding the -Wa flag is superfluous and > > carries the risk of interfering with what the compiler driver does. Just > > let the gcc driver handle the details. > > > > Clang/IAS is almost as straightforward, with the only additional edge > > case being that for assembler files, DWARF 2 doesn't work, so the CFLAGS > > is the same -gdwarf-N, but AFLAGS gets -gdwarf-N only if N > 2. > > > > The messy case is only Clang/IAS=0, which needs to check the support > > from the external assembler, and needs CFLAGS of -gdwarf-N and AFLAGS of > > -Wa,--gdwarf-N, because Clang doesn't pass that option on to an external > > assembler. This is why I was asking if the assembler support check can > > be restricted to CC_IS_CLANG: nothing but Clang/IAS=0 actually requires > > that check. > > Oh, I see. Yeah, that might be a nicer approach. What should we do in > the case of gcc < 7 though, where -gdwarf-5 won't produce DWARF v5? > Maybe that's ok, but the intent behind the Kconfig check was to > prevent the option from being selectable if the tools do not support > it. Maybe it's more flexible to pass the arguments along, and hope > for the best? > > As a gcc-5 user, I might be surprised if I chose > CONFIG_DEBUG_INFO_DWARF5 if what I got was not actually DWARF v5; it > does violate the principle of least surprise. Maybe that doesn't > matter though? Even the current gcc documentation still says "DWARF Version 5 is only experimental". If the user wants to try it out, I think it's fine to let them get whatever subset their tool chain produces, as long as it's not completely broken. Your latest help text does say that gcc 7+ is required, maybe add another sentence saying that gcc 5+ only has partial support for some draft DWARF 5 features? Thanks.
diff --git a/Makefile b/Makefile index e23786a4c1c7..9056bac0ff85 100644 --- a/Makefile +++ b/Makefile @@ -828,6 +828,7 @@ 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) ifneq ($(dwarf-version-y)$(LLVM_IAS),21) # Binutils 2.35+ required for -gdwarf-4+ support. diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index b2b3d81b1535..76ce62c77029 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -829,7 +829,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 03c494eefabd..c5b54ba51060 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -274,6 +274,14 @@ 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 DWARF5 debuginfo" + depends on $(cc-option,-gdwarf-5) + depends on $(success,$(srctree)/scripts/test_dwarf5_support.sh $(CC) $(CLANG_FLAGS)) + help + Genereate dwarf5 debug info. Requires binutils 2.35+, gcc 5.1+, and + gdb 8.0+. + 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..156ad5ec4274 --- /dev/null +++ b/scripts/test_dwarf5_support.sh @@ -0,0 +1,9 @@ +#!/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 +set -e +echo '.file 0 "filename"' | $* -Wa,-gdwarf-5 -c -x assembler -o /dev/null -
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. GNU `as` only recently gained support for specifying -gdwarf-5. The DWARF version of a binary can be validated with: $ llvm-dwarfdump vmlinux | head -n 5 | 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 Link: http://www.dwarfstd.org/doc/DWARF5.pdf Suggested-by: Masahiro Yamada <masahiroy@kernel.org> Suggested-by: Jakub Jelinek <jakub@redhat.com> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> --- Makefile | 1 + include/asm-generic/vmlinux.lds.h | 6 +++++- lib/Kconfig.debug | 8 ++++++++ scripts/test_dwarf5_support.sh | 9 +++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100755 scripts/test_dwarf5_support.sh