diff mbox series

[v2] kbuild: add configurable debug info level

Message ID 20220814002021.16990-1-dmitrii.bundin.a@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v2] kbuild: add configurable debug info level | expand

Commit Message

Dmitrii Bundin Aug. 14, 2022, 12:20 a.m. UTC
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.

Signed-off-by: Dmitrii Bundin <dmitrii.bundin.a@gmail.com>
---

Changes in v2: https://lore.kernel.org/all/20220804223504.4739-1-dmitrii.bundin.a@gmail.com/
  - Replace hardcoded -g3 with a configurable debug info level

 lib/Kconfig.debug      | 11 +++++++++++
 scripts/Makefile.debug |  2 +-
 2 files changed, 12 insertions(+), 1 deletion(-)

Comments

Masahiro Yamada Aug. 14, 2022, 2:01 a.m. UTC | #1
+CC: Fangrui Song <maskray@google.com>




On Sun, Aug 14, 2022 at 9:25 AM Dmitrii Bundin
<dmitrii.bundin.a@gmail.com> 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.
>
> Signed-off-by: Dmitrii Bundin <dmitrii.bundin.a@gmail.com>
> ---
>
> Changes in v2: https://lore.kernel.org/all/20220804223504.4739-1-dmitrii.bundin.a@gmail.com/
>   - 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?


I think "splitting debug files" and "debug level"
should be controlled independently.
(but it depends on the compiler version, if I understood correctly)






--
Best Regards
Masahiro Yamada
Fangrui Song Aug. 14, 2022, 5:31 a.m. UTC | #2
On 2022-08-14, Masahiro Yamada wrote:
>+CC: Fangrui Song <maskray@google.com>
>
>
>
>
>On Sun, Aug 14, 2022 at 9:25 AM Dmitrii Bundin
><dmitrii.bundin.a@gmail.com> 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@gmail.com>
>> ---
>>
>> Changes in v2: https://lore.kernel.org/all/20220804223504.4739-1-dmitrii.bundin.a@gmail.com/
>>   - 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
Masahiro Yamada Aug. 14, 2022, 6:58 p.m. UTC | #3
On Sun, Aug 14, 2022 at 2:31 PM Fangrui Song <maskray@google.com> wrote:
>
> On 2022-08-14, Masahiro Yamada wrote:
> >+CC: Fangrui Song <maskray@google.com>
> >
> >
> >
> >
> >On Sun, Aug 14, 2022 at 9:25 AM Dmitrii Bundin
> ><dmitrii.bundin.a@gmail.com> 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@gmail.com>
> >> ---
> >>
> >> Changes in v2: https://lore.kernel.org/all/20220804223504.4739-1-dmitrii.bundin.a@gmail.com/
> >>   - 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)
Dmitrii Bundin Aug. 14, 2022, 7:17 p.m. UTC | #4
> We already have CONFIG_DEBUG_INFO_NONE to
> disable the debug info.

Thanks for pointing this out. Indeed providing another way of
disabling debug info does not look reasonable to me.
So only it makes sense to set only 1, 2 or 3 debug levels.

> Using 'int' does not look sensible to me.

Could you please give a hint why?
My intention to choose int was to provide a boundary with range on the
DEBUG_INFO_LEVEL option to choose only acceptable ones.

On Sun, Aug 14, 2022 at 8:31 AM Fangrui Song <maskray@google.com> wrote:
> In Clang, -g = -g2 = -g3. To generate macro information,
> specify -fdebug-macro.
Thanks.
I would propose to add another config option like
DEBUG_MACRO_DEFINITIONS to turn on macro information for GCC/Clang.
For GCC it would be -g3, for Clang -fdebug-macro.

> 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

I would add a note that when selecting -gdwarf-<level> gcc also
implicitly sets -g2 (at least in older versions).
It seems reasonable to me to put the DEBUG_LEVEL_INFO setting at the
very bottom to prevent it from overriding implicitly.

What do you think?
diff mbox series

Patch

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.
+
 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