Messages in this thread | | | Date | Sat, 13 Aug 2022 22:31:24 -0700 | From | Fangrui Song <> | Subject | Re: [PATCH v2] kbuild: add configurable debug info level |
| |
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
| |