On Tue, Jan 12, 2021 at 04:32:35PM -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.
> 
> 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.
> 
> Link: http://www.dwarfstd.org/doc/DWARF5.pdf
> Suggested-by: Arvind Sankar <nived...@alum.mit.edu>
> Suggested-by: Jakub Jelinek <ja...@redhat.com>
> Suggested-by: Masahiro Yamada <masahi...@kernel.org>
> Suggested-by: Fangrui Song <mask...@google.com>
> Suggested-by: Caroline Tice <cmt...@google.com>
> Signed-off-by: Nick Desaulniers <ndesaulni...@google.com>

One small nit below.

Reviewed-by: Nathan Chancellor <natechancel...@gmail.com>

> ---
>  Makefile                          |  1 +
>  include/asm-generic/vmlinux.lds.h |  6 +++++-
>  lib/Kconfig.debug                 | 17 +++++++++++++++++
>  scripts/test_dwarf5_support.sh    |  9 +++++++++
>  4 files changed, 32 insertions(+), 1 deletion(-)
>  create mode 100755 scripts/test_dwarf5_support.sh
> 
> diff --git a/Makefile b/Makefile
> index 656fff17b331..1067cfd98249 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 49944f00d2b3..37dc4110875e 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 e80770fac4f0..60a4f5e27ada 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -273,6 +273,23 @@ 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))
> +     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..142a1b5c7fa2
> --- /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

This is unnecessary, clang will error without this and a script's exit
code is the exit code of its last command.

> +echo '.file 0 "filename"' | $* -gdwarf-5 -Wa,-gdwarf-5 -c -x assembler -o 
> /dev/null -
> -- 
> 2.30.0.284.gd98b1dd5eaa7-goog
> 

Reply via email to