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