Re: [PATCH v2] kbuild: add configurable debug info level

From: Masahiro Yamada
Date: Sun Aug 14 2022 - 14:59:25 EST


On Sun, Aug 14, 2022 at 2:31 PM Fangrui Song <maskray@xxxxxxxxxx> wrote:
>
> On 2022-08-14, Masahiro Yamada wrote:
> >+CC: Fangrui Song <maskray@xxxxxxxxxx>
> >
> >
> >
> >
> >On Sun, Aug 14, 2022 at 9:25 AM Dmitrii Bundin
> ><dmitrii.bundin.a@xxxxxxxxx> wrote:
> >>
> >> Provides a way to configure debug info level (-glevel).
> >> Debug level 3 includes extra information such as macro definitions. With
> >> level 3 enabled it's possible to expand macros right from the debugging
> >> session in gdb simplifying debugging when complicated macros involved.
> >> The default level is set to 2 to not change the default build behavior.
>
> GCC -g3 generates macro information (in the .debug_macro section).
>
> In Clang, -g = -g2 = -g3. To generate macro information,
> specify -fdebug-macro.
> The different choice is known in the initial implementation https://reviews.llvm.org/D16135 .
>
> Not generating macro information for -g3 (i.e. diverging from GCC
> behavior) makes some sense to me: -fstandalone-debug will probably be
> more suitable as -g3 (it retains some type debug info for C++ (the code
> after https://github.com/llvm/llvm-project/blob/b2f31cac28c8a03ceb908b544f5790f4f9f2d9ab/clang/lib/CodeGen/CGDebugInfo.cpp#L2497-L2499).
>
> >> Signed-off-by: Dmitrii Bundin <dmitrii.bundin.a@xxxxxxxxx>
> >> ---
> >>
> >> Changes in v2: https://lore.kernel.org/all/20220804223504.4739-1-dmitrii.bundin.a@xxxxxxxxx/
> >> - Replace hardcoded -g3 with a configurable debug info level
> >>
> >> lib/Kconfig.debug | 11 +++++++++++
> >> scripts/Makefile.debug | 2 +-
> >> 2 files changed, 12 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> >> index 2e24db4bff19..a17c12c20290 100644
> >> --- a/lib/Kconfig.debug
> >> +++ b/lib/Kconfig.debug
> >> @@ -304,6 +304,17 @@ config DEBUG_INFO_REDUCED
> >> DEBUG_INFO build and compile times are reduced too.
> >> Only works with newer gcc versions.
> >>
> >> +config DEBUG_INFO_LEVEL
> >> + int "Debug info level"
> >> + range 0 3
> >> + default "2"
> >> + help
> >> + Sets the level of how much debug information to generate (-glevel).
> >> + Level 1 produces minimal debug information without including information
> >> + about local variables. Level 3 includes extra information like macro
> >> + definitions. Setting up level 3 will require significantly more disk
> >> + space and increase built time. Level 0 produces no debug information.
> >> +
> >
> >
> >
> >We already have CONFIG_DEBUG_INFO_NONE to
> >disable the debug info.
> >
> >
> >The combination of CONFIG_DEBUG_INFO=y and
> >CONFIG_DEBUG_INFO_LEVEL=0 (-g0)
> >would emulate CONFIG_DEBUG_INFO_NONE ?
> >
> >
> >
> >Using 'int' does not look sensible to me.
> >
> >
> >
> >
> >
> >> config DEBUG_INFO_COMPRESSED
> >> bool "Compressed debugging information"
> >> depends on $(cc-option,-gz=zlib)
> >> diff --git a/scripts/Makefile.debug b/scripts/Makefile.debug
> >> index 9f39b0130551..28beffc42e71 100644
> >> --- a/scripts/Makefile.debug
> >> +++ b/scripts/Makefile.debug
> >> @@ -3,7 +3,7 @@ DEBUG_CFLAGS :=
> >> ifdef CONFIG_DEBUG_INFO_SPLIT
> >> DEBUG_CFLAGS += -gsplit-dwarf
> >> else
> >> -DEBUG_CFLAGS += -g
> >> +DEBUG_CFLAGS += -g$(CONFIG_DEBUG_INFO_LEVEL)
> >> endif
> >>
> >> ifndef CONFIG_AS_IS_LLVM
> >> --
> >> 2.17.1
> >>
> >
> >
> >I want to consult Fangrui Song for this part.
> >
> >
> >With this Makefile code, CONFIG_DEBUG_INFO_SPLIT
> >takes the presidency over CONFIG_DEBUG_INFO_LEVEL.
> >
> >
> >When CONFIG_DEBUG_INFO_SPLIT is enabled (-gsplit-dwarf),
> >it always uses the default -g2 level.
> >CONFIG_DEBUG_INFO_LEVEL is just ignored silently.
> >
> >
> >
> >It might be sensible in older GCC/Clang behavior because
> >-gsplit-dwarf implied -g2.
> >
> >
> >But, with this commit:
> >https://reviews.llvm.org/D80391
> >
> >-gsplit-dwarf and -g<level> are orthogonal
> >for GCC 11+/Clang 12+, correct?
>
> Correct.
>
> >I think "splitting debug files" and "debug level"
> >should be controlled independently.
> >(but it depends on the compiler version, if I understood correctly)
>
> Before GCC 11 and Clang 12, -gsplit-dwarf implied -g2 (older
> -gsplit-dwarf is like today's `-gsplit-dwarf -g2`).
>
> GCC 11 and Clang 12 (https://reviews.llvm.org/D80391) have changed
> -gsplit-dwarf to not imply -g2.
>
> For a group of -g0 -g1 -g2, the last option wins. Therefore,
>
> -g0 -gsplit-dwarf => debug info in GCC<11 and Clang<12
> -g0 -gsplit-dwarf => no debug info in GCC>=11 and Clang>=12



Thanks.
I tested GCC 9 on Ubuntu 22.04.
"-g3 -gsplit-dwarf" produces .debug_macro

In old behavior, -gsplit-dwarf upgrades the level, but
does not downgrade it, correct?





[Old behavior]
-g0 -gsplit-dwarf --> level 2 (gsplit-dwarf upgrade 0 to 2)
-gsplit-dwarf -g0 --> level 0 (the last -g0 wins)
-g3 -gsplit-dwarf --> level 3 (gsplit-dwarf does not downgrade)
-g2 -g3 --> level 3 (the last -g3 wins)
-g3 -g2 --> level 2 (the last -g2 wins)

[New behavior]
-g0 -gsplit-dwarf --> level 0 (the options are orthogonal)
-gsplit-dwarf -g0 --> level 0 (the options are orthogonal)
-g3 -gsplit-dwarf --> level 3 (the options are orthogonal)
-g2 -g3 --> level 3 (the last -g3 wins)
-g3 -g2 --> level 2 (the last -g2 wins)








masahiro@grover:/tmp/foo$ gcc-9 --version
gcc-9 (Ubuntu 9.4.0-5ubuntu1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

masahiro@grover:/tmp/foo$ rm -f *.dwo
masahiro@grover:/tmp/foo$ gcc-9 -gsplit-dwarf -o foo foo.c
masahiro@grover:/tmp/foo$ readelf -S foo.dwo
There are 9 section headers, starting at offset 0x840:

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .debug_info.dwo PROGBITS 0000000000000000 00000040
0000000000000217 0000000000000000 E 0 0 1
[ 2] .debug_abbrev.dwo PROGBITS 0000000000000000 00000257
00000000000000cb 0000000000000000 E 0 0 1
[ 3] .debug_line.dwo PROGBITS 0000000000000000 00000322
00000000000000e5 0000000000000000 E 0 0 1
[ 4] .debug_str_o[...] PROGBITS 0000000000000000 00000407
00000000000000d4 0000000000000000 E 0 0 1
[ 5] .debug_str.dwo PROGBITS 0000000000000000 000004db
00000000000002bd 0000000000000000 E 0 0 1
[ 6] .symtab SYMTAB 0000000000000000 00000798
0000000000000030 0000000000000018 7 2 8
[ 7] .strtab STRTAB 0000000000000000 000007c8
0000000000000001 0000000000000000 0 0 1
[ 8] .shstrtab STRTAB 0000000000000000 000007c9
0000000000000073 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), l (large), p (processor specific)
masahiro@grover:/tmp/foo$ rm -f *.dwo
masahiro@grover:/tmp/foo$ gcc-9 -g3 -gsplit-dwarf -o foo foo.c
masahiro@grover:/tmp/foo$ readelf -S foo.dwo
There are 32 section headers, starting at offset 0x77f8:

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .debug_info.dwo PROGBITS 0000000000000000 00000040
0000000000000245 0000000000000000 E 0 0 1
[ 2] .debug_abbrev.dwo PROGBITS 0000000000000000 00000285
00000000000000ce 0000000000000000 E 0 0 1
[ 3] .debug_macro.dwo PROGBITS 0000000000000000 00000353
000000000000014a 0000000000000000 E 0 0 1
[ 4] .debug_macro.dwo PROGBITS 0000000000000000 0000049d
0000000000000528 0000000000000000 0 0 1
[ 5] .debug_macro.dwo PROGBITS 0000000000000000 000009c5
000000000000001c 0000000000000000 0 0 1
[ 6] .debug_macro.dwo PROGBITS 0000000000000000 000009e1
000000000000000c 0000000000000000 0 0 1
[ 7] .debug_macro.dwo PROGBITS 0000000000000000 000009ed
000000000000010b 0000000000000000 0 0 1
[ 8] .debug_macro.dwo PROGBITS 0000000000000000 00000af8
0000000000000010 0000000000000000 0 0 1
[ 9] .debug_macro.dwo PROGBITS 0000000000000000 00000b08
0000000000000033 0000000000000000 0 0 1
[10] .debug_macro.dwo PROGBITS 0000000000000000 00000b3b
0000000000000143 0000000000000000 0 0 1
[11] .debug_macro.dwo PROGBITS 0000000000000000 00000c7e
0000000000000056 0000000000000000 0 0 1
[12] .debug_macro.dwo PROGBITS 0000000000000000 00000cd4
0000000000000021 0000000000000000 0 0 1
[13] .debug_macro.dwo PROGBITS 0000000000000000 00000cf5
0000000000000037 0000000000000000 0 0 1
[14] .debug_macro.dwo PROGBITS 0000000000000000 00000d2c
000000000000000b 0000000000000000 0 0 1
[15] .debug_macro.dwo PROGBITS 0000000000000000 00000d37
0000000000000068 0000000000000000 0 0 1
[16] .debug_macro.dwo PROGBITS 0000000000000000 00000d9f
000000000000000c 0000000000000000 0 0 1
[17] .debug_macro.dwo PROGBITS 0000000000000000 00000dab
0000000000000048 0000000000000000 0 0 1
[18] .debug_macro.dwo PROGBITS 0000000000000000 00000df3
00000000000000a8 0000000000000000 0 0 1
[19] .debug_macro.dwo PROGBITS 0000000000000000 00000e9b
000000000000000b 0000000000000000 0 0 1
[20] .debug_macro.dwo PROGBITS 0000000000000000 00000ea6
0000000000000023 0000000000000000 0 0 1
[21] .debug_macro.dwo PROGBITS 0000000000000000 00000ec9
0000000000000030 0000000000000000 0 0 1
[22] .debug_macro.dwo PROGBITS 0000000000000000 00000ef9
0000000000000020 0000000000000000 0 0 1
[23] .debug_macro.dwo PROGBITS 0000000000000000 00000f19
000000000000001d 0000000000000000 0 0 1
[24] .debug_macro.dwo PROGBITS 0000000000000000 00000f36
0000000000000020 0000000000000000 0 0 1
[25] .debug_macro.dwo PROGBITS 0000000000000000 00000f56
0000000000000059 0000000000000000 0 0 1
[26] .debug_line.dwo PROGBITS 0000000000000000 00000faf
0000000000000255 0000000000000000 E 0 0 1
[27] .debug_str_o[...] PROGBITS 0000000000000000 00001204
0000000000000bd4 0000000000000000 E 0 0 1
[28] .debug_str.dwo PROGBITS 0000000000000000 00001dd8
0000000000005721 0000000000000000 E 0 0 1
[29] .symtab SYMTAB 0000000000000000 00007500
0000000000000270 0000000000000018 30 26 8
[30] .strtab STRTAB 0000000000000000 00007770
0000000000000001 0000000000000000 0 0 1
[31] .shstrtab STRTAB 0000000000000000 00007771
0000000000000084 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), l (large), p (processor specific)














--
Best Regards
Masahiro Yamada