Message ID | 20201104005343.4192504-4-ndesaulniers@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Kbuild: DWARF v5 support | expand |
Hi Nick,
I love your patch! Yet something to improve:
[auto build test ERROR on kbuild/for-next]
[also build test ERROR on asm-generic/master linus/master v5.10-rc2 next-20201104]
[cannot apply to tip/x86/core]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Nick-Desaulniers/Kbuild-DWARF-v5-support/20201104-085610
base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
config: ia64-randconfig-r034-20201104 (attached as .config)
compiler: ia64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/f8b8c21feb85f4422b79a96e0b56cf4e8ff53274
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Nick-Desaulniers/Kbuild-DWARF-v5-support/20201104-085610
git checkout f8b8c21feb85f4422b79a96e0b56cf4e8ff53274
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=ia64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
{standard input}: Assembler messages:
>> {standard input}:34: Error: file number 1 already allocated
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On Tue, Nov 03, 2020 at 04:53:42PM -0800, Nick Desaulniers wrote: > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > way that's forward compatible with existing configs, and makes adding > future versions more straightforward. > > Suggested-by: Fangrui Song <maskray@google.com> > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > --- > Makefile | 14 ++++++++------ > lib/Kconfig.debug | 19 +++++++++++++++---- > 2 files changed, 23 insertions(+), 10 deletions(-) > > diff --git a/Makefile b/Makefile > index 75b1a3dcbf30..e23786a4c1c7 100644 > --- a/Makefile > +++ b/Makefile > @@ -826,12 +826,14 @@ else > DEBUG_CFLAGS += -g > endif > > -ifndef LLVM_IAS > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > -endif > - > -ifdef CONFIG_DEBUG_INFO_DWARF4 > -DEBUG_CFLAGS += -gdwarf-4 > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > +# Binutils 2.35+ required for -gdwarf-4+ support. > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > +DEBUG_CFLAGS += $(dwarf-aflag) > +KBUILD_AFLAGS += $(dwarf-aflag) > endif > For LLVM_IAS=1, adding dwarf-aflag to DEBUG_CFLAGS should not be necessary, no? This seems to add it for dwarf-4. The as-option check will only work on binutils 2.35.1 onwards: earlier versions will silently accept any -gdwarf-N option. Do we care? I think it'll just get dwarf-2 for assembly files even though dwarf-4 might have been configured. The earlier versions only error if the double-hyphen form --gdwarf-N is used. More generally, do we want to force this option via -Wa or should we leave it up to the compiler driver when we can? For both Clang/IAS and gcc/binutils, passing -gdwarf-N in KBUILD_AFLAGS will allow the compiler to pass on the appropriate option to the assembler (with gcc you only get --gdwarf-2 for the assembler except on trunk though). The only case that would absolutely require -Wa is Clang without IAS, might be worth adding the ability to pass on the flag to the external assembler? Btw, is -gsplit-dwarf at all useful for assembler files?
On Mon, Nov 23, 2020 at 06:22:10PM -0500, Arvind Sankar wrote:
> Btw, is -gsplit-dwarf at all useful for assembler files?
If you invoke the assembler via the compiler, with that flag it still
creates separate .o and .dwo files (via objcopy invocations as usual).
Whether that is useful depends on if you have any debug info that can
be split :-)
Segher
On Mon, Nov 23, 2020 at 06:33:57PM -0600, Segher Boessenkool wrote: > On Mon, Nov 23, 2020 at 06:22:10PM -0500, Arvind Sankar wrote: > > Btw, is -gsplit-dwarf at all useful for assembler files? > > If you invoke the assembler via the compiler, with that flag it still > creates separate .o and .dwo files (via objcopy invocations as usual). > Whether that is useful depends on if you have any debug info that can > be split :-) > > > Segher Right, the latter was what I was really asking :) We don't currently pass -gsplit-dwarf for assembler and I was wondering if that mattered. Thanks.
On Tue, Nov 24, 2020 at 11:56:02AM -0500, Arvind Sankar wrote: > On Mon, Nov 23, 2020 at 06:33:57PM -0600, Segher Boessenkool wrote: > > On Mon, Nov 23, 2020 at 06:22:10PM -0500, Arvind Sankar wrote: > > > Btw, is -gsplit-dwarf at all useful for assembler files? > > > > If you invoke the assembler via the compiler, with that flag it still > > creates separate .o and .dwo files (via objcopy invocations as usual). > > Whether that is useful depends on if you have any debug info that can > > be split :-) > > Right, the latter was what I was really asking :) We don't currently > pass -gsplit-dwarf for assembler and I was wondering if that mattered. If there is any debug info in the .s files, it will all end up in the .o file, not a .dwo file. That may matter aesthetically, and it can cost a few bytes of disk space, but it doesn't matter functionally (GDB will search in both places). Segher
On Wed, Nov 4, 2020 at 9:53 AM 'Nick Desaulniers' via Clang Built Linux <clang-built-linux@googlegroups.com> wrote: > > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > way that's forward compatible with existing configs, and makes adding > future versions more straightforward. > > Suggested-by: Fangrui Song <maskray@google.com> > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > --- > Makefile | 14 ++++++++------ > lib/Kconfig.debug | 19 +++++++++++++++---- > 2 files changed, 23 insertions(+), 10 deletions(-) > > diff --git a/Makefile b/Makefile > index 75b1a3dcbf30..e23786a4c1c7 100644 > --- a/Makefile > +++ b/Makefile > @@ -826,12 +826,14 @@ else > DEBUG_CFLAGS += -g > endif > > -ifndef LLVM_IAS > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > -endif > - > -ifdef CONFIG_DEBUG_INFO_DWARF4 > -DEBUG_CFLAGS += -gdwarf-4 > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > +# Binutils 2.35+ required for -gdwarf-4+ support. > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > +DEBUG_CFLAGS += $(dwarf-aflag) This changes the behavior. For the Dwarf-2 case, Previously, -gdwarf-2 was passed to $(CC), so the debug info was generated by gcc. Now, -Wa,-gdwarf-2 is passed to $(CC). -gdwarf-2 is handled by GNU as. So, the source info points to /tmp/<hash>.s instead of the original .c file. Handling the Dwarf capability is very complicated. Are you still working for v3? > +KBUILD_AFLAGS += $(dwarf-aflag) > endif > > ifdef CONFIG_DEBUG_INFO_REDUCED > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index 83a860126897..03c494eefabd 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -256,14 +256,25 @@ config DEBUG_INFO_SPLIT > to know about the .dwo files and include them. > Incompatible with older versions of ccache. > > +choice > + prompt "DWARF version" > + help > + Which version of DWARF debug info to emit. > + > +config DEBUG_INFO_DWARF2 > + bool "Generate DWARF v2 debuginfo" > + help > + Generate DWARF v2 debug info. > + > config DEBUG_INFO_DWARF4 > bool "Generate dwarf4 debuginfo" > depends on $(cc-option,-gdwarf-4) > help > - Generate dwarf4 debug info. This requires recent versions > - of gcc and gdb. It makes the debug information larger. > - But it significantly improves the success of resolving > - variables in gdb on optimized code. > + Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+. > + It makes the debug information larger, but it significantly > + improves the success of resolving variables in gdb on optimized code. > + > +endchoice # "DWARF version" > > config DEBUG_INFO_BTF > bool "Generate BTF typeinfo" > -- > 2.29.1.341.ge80a0c044ae-goog > > -- > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group. > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com. > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20201104005343.4192504-4-ndesaulniers%40google.com.
On Mon, Nov 30, 2020 at 10:05 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > On Wed, Nov 4, 2020 at 9:53 AM 'Nick Desaulniers' via Clang Built > Linux <clang-built-linux@googlegroups.com> wrote: > > > > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > > way that's forward compatible with existing configs, and makes adding > > future versions more straightforward. > > > > Suggested-by: Fangrui Song <maskray@google.com> > > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > --- > > Makefile | 14 ++++++++------ > > lib/Kconfig.debug | 19 +++++++++++++++---- > > 2 files changed, 23 insertions(+), 10 deletions(-) > > > > diff --git a/Makefile b/Makefile > > index 75b1a3dcbf30..e23786a4c1c7 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -826,12 +826,14 @@ else > > DEBUG_CFLAGS += -g > > endif > > > > -ifndef LLVM_IAS > > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > > -endif > > - > > -ifdef CONFIG_DEBUG_INFO_DWARF4 > > -DEBUG_CFLAGS += -gdwarf-4 > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > > +# Binutils 2.35+ required for -gdwarf-4+ support. > > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > > +DEBUG_CFLAGS += $(dwarf-aflag) > > This changes the behavior. > > For the Dwarf-2 case, > > Previously, -gdwarf-2 was passed to $(CC), > so the debug info was generated by gcc. > > Now, -Wa,-gdwarf-2 is passed to $(CC). > -gdwarf-2 is handled by GNU as. > So, the source info points to /tmp/<hash>.s > instead of the original .c file. > > > > Handling the Dwarf capability is very complicated. > > Are you still working for v3? > > > > > +KBUILD_AFLAGS += $(dwarf-aflag) > > endif > > > > ifdef CONFIG_DEBUG_INFO_REDUCED > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 83a860126897..03c494eefabd 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -256,14 +256,25 @@ config DEBUG_INFO_SPLIT > > to know about the .dwo files and include them. > > Incompatible with older versions of ccache. > > > > +choice > > + prompt "DWARF version" > > + help > > + Which version of DWARF debug info to emit. > > + > > +config DEBUG_INFO_DWARF2 > > + bool "Generate DWARF v2 debuginfo" > > + help > > + Generate DWARF v2 debug info. > > + > > config DEBUG_INFO_DWARF4 > > bool "Generate dwarf4 debuginfo" > > depends on $(cc-option,-gdwarf-4) > > help > > - Generate dwarf4 debug info. This requires recent versions > > - of gcc and gdb. It makes the debug information larger. > > - But it significantly improves the success of resolving > > - variables in gdb on optimized code. > > + Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+. > > + It makes the debug information larger, but it significantly > > + improves the success of resolving variables in gdb on optimized code. > > + > > +endchoice # "DWARF version" > > > > config DEBUG_INFO_BTF > > bool "Generate BTF typeinfo" > > -- > > 2.29.1.341.ge80a0c044ae-goog We can bump -Wa,-gdwarf-2 to -Wa,-gdwarf-3 since GNU actually emits DWARF v3 DW_AT_ranges (see https://sourceware.org/bugzilla/show_bug.cgi?id=26850 ) This can avoid the `warning: DWARF2 only supports one section per compilation unit` warning for Clang. Deleting -Wa,-gdwarf-2 also sounds good to me if people can verify their debugging experience is not regressed (I believe it is useless).
On Mon, Nov 30, 2020 at 10:05 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > On Wed, Nov 4, 2020 at 9:53 AM 'Nick Desaulniers' via Clang Built > Linux <clang-built-linux@googlegroups.com> wrote: > > > > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > > way that's forward compatible with existing configs, and makes adding > > future versions more straightforward. > > > > Suggested-by: Fangrui Song <maskray@google.com> > > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > --- > > Makefile | 14 ++++++++------ > > lib/Kconfig.debug | 19 +++++++++++++++---- > > 2 files changed, 23 insertions(+), 10 deletions(-) > > > > diff --git a/Makefile b/Makefile > > index 75b1a3dcbf30..e23786a4c1c7 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -826,12 +826,14 @@ else > > DEBUG_CFLAGS += -g > > endif > > > > -ifndef LLVM_IAS > > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > > -endif > > - > > -ifdef CONFIG_DEBUG_INFO_DWARF4 > > -DEBUG_CFLAGS += -gdwarf-4 > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > > +# Binutils 2.35+ required for -gdwarf-4+ support. > > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > > +DEBUG_CFLAGS += $(dwarf-aflag) > > This changes the behavior. > > For the Dwarf-2 case, > > Previously, -gdwarf-2 was passed to $(CC), > so the debug info was generated by gcc. > > Now, -Wa,-gdwarf-2 is passed to $(CC). > -gdwarf-2 is handled by GNU as. > So, the source info points to /tmp/<hash>.s > instead of the original .c file. > > > > Handling the Dwarf capability is very complicated. > > Are you still working for v3? Yes, I plan to revisit the series based on all of the feedback thus far. Lately I'm focused on enabling LLVM_IAS=1 for Android; but I would like to see this land so that the Linux kernel may provide coverage and feedback to the toolchain developers for DWARF v5 (as well as reduced binary image sizes). Maybe later this week I'll have time to revisit.
On Tue, Dec 1, 2020 at 5:27 AM 'Fāng-ruì Sòng' via Clang Built Linux <clang-built-linux@googlegroups.com> wrote: > > On Mon, Nov 30, 2020 at 10:05 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > > > On Wed, Nov 4, 2020 at 9:53 AM 'Nick Desaulniers' via Clang Built > > Linux <clang-built-linux@googlegroups.com> wrote: > > > > > > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > > > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > > > way that's forward compatible with existing configs, and makes adding > > > future versions more straightforward. > > > > > > Suggested-by: Fangrui Song <maskray@google.com> > > > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > > --- > > > Makefile | 14 ++++++++------ > > > lib/Kconfig.debug | 19 +++++++++++++++---- > > > 2 files changed, 23 insertions(+), 10 deletions(-) > > > > > > diff --git a/Makefile b/Makefile > > > index 75b1a3dcbf30..e23786a4c1c7 100644 > > > --- a/Makefile > > > +++ b/Makefile > > > @@ -826,12 +826,14 @@ else > > > DEBUG_CFLAGS += -g > > > endif > > > > > > -ifndef LLVM_IAS > > > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > > > -endif > > > - > > > -ifdef CONFIG_DEBUG_INFO_DWARF4 > > > -DEBUG_CFLAGS += -gdwarf-4 > > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > > > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > > > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > > > +# Binutils 2.35+ required for -gdwarf-4+ support. > > > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > > > +DEBUG_CFLAGS += $(dwarf-aflag) > > > > This changes the behavior. > > > > For the Dwarf-2 case, > > > > Previously, -gdwarf-2 was passed to $(CC), > > so the debug info was generated by gcc. > > > > Now, -Wa,-gdwarf-2 is passed to $(CC). > > -gdwarf-2 is handled by GNU as. > > So, the source info points to /tmp/<hash>.s > > instead of the original .c file. > > > > > > > > Handling the Dwarf capability is very complicated. > > > > Are you still working for v3? > > > > > > > > > +KBUILD_AFLAGS += $(dwarf-aflag) > > > endif > > > > > > ifdef CONFIG_DEBUG_INFO_REDUCED > > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > > index 83a860126897..03c494eefabd 100644 > > > --- a/lib/Kconfig.debug > > > +++ b/lib/Kconfig.debug > > > @@ -256,14 +256,25 @@ config DEBUG_INFO_SPLIT > > > to know about the .dwo files and include them. > > > Incompatible with older versions of ccache. > > > > > > +choice > > > + prompt "DWARF version" > > > + help > > > + Which version of DWARF debug info to emit. > > > + > > > +config DEBUG_INFO_DWARF2 > > > + bool "Generate DWARF v2 debuginfo" > > > + help > > > + Generate DWARF v2 debug info. > > > + > > > config DEBUG_INFO_DWARF4 > > > bool "Generate dwarf4 debuginfo" > > > depends on $(cc-option,-gdwarf-4) > > > help > > > - Generate dwarf4 debug info. This requires recent versions > > > - of gcc and gdb. It makes the debug information larger. > > > - But it significantly improves the success of resolving > > > - variables in gdb on optimized code. > > > + Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+. > > > + It makes the debug information larger, but it significantly > > > + improves the success of resolving variables in gdb on optimized code. > > > + > > > +endchoice # "DWARF version" > > > > > > config DEBUG_INFO_BTF > > > bool "Generate BTF typeinfo" > > > -- > > > 2.29.1.341.ge80a0c044ae-goog > > > We can bump -Wa,-gdwarf-2 to -Wa,-gdwarf-3 since GNU actually emits > DWARF v3 DW_AT_ranges (see > https://sourceware.org/bugzilla/show_bug.cgi?id=26850 ) > This can avoid the `warning: DWARF2 only supports one section per > compilation unit` warning for Clang. I am not a DWARF spec expert. Please teach me. In my understanding, "DWARF2 only supports one section ..." is warned only when building .S files with LLVM_IAS=1 If this is due to the limitation of DWARF v2, why is it OK to build .c files with LLVM_IAS? > > Deleting -Wa,-gdwarf-2 also sounds good to me if people can verify > their debugging experience is not regressed (I believe it is useless). > > > -- > 宋方睿 > > -- > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group. > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com. > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/CAFP8O3Ki9HoqcV450fn29fBOWAbmuGAdB6USLz8pGsW4Vzf7sg%40mail.gmail.com.
On Tue, Dec 1, 2020 at 5:45 AM 'Nick Desaulniers' via Clang Built Linux <clang-built-linux@googlegroups.com> wrote: > > On Mon, Nov 30, 2020 at 10:05 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > > > On Wed, Nov 4, 2020 at 9:53 AM 'Nick Desaulniers' via Clang Built > > Linux <clang-built-linux@googlegroups.com> wrote: > > > > > > Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an > > > explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a > > > way that's forward compatible with existing configs, and makes adding > > > future versions more straightforward. > > > > > > Suggested-by: Fangrui Song <maskray@google.com> > > > Suggested-by: Masahiro Yamada <masahiroy@kernel.org> > > > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> > > > --- > > > Makefile | 14 ++++++++------ > > > lib/Kconfig.debug | 19 +++++++++++++++---- > > > 2 files changed, 23 insertions(+), 10 deletions(-) > > > > > > diff --git a/Makefile b/Makefile > > > index 75b1a3dcbf30..e23786a4c1c7 100644 > > > --- a/Makefile > > > +++ b/Makefile > > > @@ -826,12 +826,14 @@ else > > > DEBUG_CFLAGS += -g > > > endif > > > > > > -ifndef LLVM_IAS > > > -KBUILD_AFLAGS += -Wa,-gdwarf-2 > > > -endif > > > - > > > -ifdef CONFIG_DEBUG_INFO_DWARF4 > > > -DEBUG_CFLAGS += -gdwarf-4 > > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 > > > +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 > > > +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) > > > +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) > > > +# Binutils 2.35+ required for -gdwarf-4+ support. > > > +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) > > > +DEBUG_CFLAGS += $(dwarf-aflag) > > > > This changes the behavior. > > > > For the Dwarf-2 case, > > > > Previously, -gdwarf-2 was passed to $(CC), > > so the debug info was generated by gcc. > > > > Now, -Wa,-gdwarf-2 is passed to $(CC). > > -gdwarf-2 is handled by GNU as. > > So, the source info points to /tmp/<hash>.s > > instead of the original .c file. > > > > > > > > Handling the Dwarf capability is very complicated. > > > > Are you still working for v3? > > Yes, I plan to revisit the series based on all of the feedback thus > far. Lately I'm focused on enabling LLVM_IAS=1 for Android; but I > would like to see this land so that the Linux kernel may provide > coverage and feedback to the toolchain developers for DWARF v5 (as > well as reduced binary image sizes). Maybe later this week I'll have > time to revisit. > -- > Thanks, > ~Nick Desaulniers > > -- > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group. > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com. > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/CAKwvOdmPeOEA4dfODCKLE4A_M-SF5RBVFEf-NuiTkUTXAbh-5w%40mail.gmail.com. In my understanding, the complexity comes from the fact we are mixing up the $(CC) capability and $(AS) capability. They are orthogonal if I understand correctly. When building *.c files, the .debug* sections are generated by gcc (or clang), and embedded into the intermediate *.s files. The assembler (GAS or clang's IAS) simply transforms it into byte stream in *.o. So we do not care about the assembler capability. When building *.S files, the .debug* sections are generated by the assembler. Here, the assembler capability is important. Unless we use binutils 2.35+ or clang IAS, DWARF v2 is the only possible choice. So, we need two separate choices to handle this properly, I think. The following is the rough sketch. # The value is 2, 3, 4, or 5 depending on the assembler in use. # Unfortunately, we cannot check this by $(cc-option, -Wa,-gdwarf-4) # because GAS <= 2.34 accepts any -gdwarf-<N>. # readelf --debug-dump=info and grep or something? config AS_SUPPORTS_DWARF_VERSION int $(shell scripts/as_dwarf_support.sh) choice "DWARF version for C code debugging" config CC_DEBUG_INFO_DWARF2 bool "..." config CC_DEBUG_INFO_DWARF4 bool "..." config CC_DEBUG_INFO_DWARF5 bool "..." depends on GCC_VERSION >= 700000 || CC_IS_CLANG depends on AS_SUPPORTS_DWARF_VERSION >= 5 help gcc7+ or clang supports this. Unfortunately, we also need to check assembler capability because GAS <= 2.34 do not understand ".file 0" endchoice choice "DWARF version for assembly code debugging" config AS_DEBUG_INFO_DWARF2 bool "..." config AS_DEBUG_INFO_DWARF4 bool "..." depends on AS_SUPPORTS_DWARF_VERSION >= 4 config AS_DEBUG_INFO_DWARF5 bool "..." depends on AS_SUPPORTS_DWARF_VERSION >= 5 endchoice
On Tue, Dec 01, 2020 at 12:38:16PM +0900, Masahiro Yamada wrote: > > We can bump -Wa,-gdwarf-2 to -Wa,-gdwarf-3 since GNU actually emits > > DWARF v3 DW_AT_ranges (see > > https://sourceware.org/bugzilla/show_bug.cgi?id=26850 ) > > This can avoid the `warning: DWARF2 only supports one section per > > compilation unit` warning for Clang. That warning should be "there can be only one section with executable code per translation unit", or similar. > I am not a DWARF spec expert. Neither am I. > Please teach me. > > In my understanding, "DWARF2 only supports one section ..." > is warned only when building .S files with LLVM_IAS=1 .S files are simply run through the C preprocessor first, and then given to the assembler. The only difference there should be wrt debug info is you could have some macros that expand to assembler debug statements. > If this is due to the limitation of DWARF v2, why is it OK to > build .c files with LLVM_IAS? The compiler can of course make sure not to use certain constructs in its generated assembler code, while the assembler will have to swallow whatever the user wrote. Segher
On 2020-12-01, Segher Boessenkool wrote: >On Tue, Dec 01, 2020 at 12:38:16PM +0900, Masahiro Yamada wrote: >> > We can bump -Wa,-gdwarf-2 to -Wa,-gdwarf-3 since GNU actually emits >> > DWARF v3 DW_AT_ranges (see >> > https://sourceware.org/bugzilla/show_bug.cgi?id=26850 ) >> > This can avoid the `warning: DWARF2 only supports one section per >> > compilation unit` warning for Clang. > >That warning should be "there can be only one section with executable >code per translation unit", or similar. > >> I am not a DWARF spec expert. > >Neither am I. > >> Please teach me. >> >> In my understanding, "DWARF2 only supports one section ..." >> is warned only when building .S files with LLVM_IAS=1 > >.S files are simply run through the C preprocessor first, and then given >to the assembler. The only difference there should be wrt debug info is >you could have some macros that expand to assembler debug statements. > >> If this is due to the limitation of DWARF v2, why is it OK to >> build .c files with LLVM_IAS? > >The compiler can of course make sure not to use certain constructs in >its generated assembler code, while the assembler will have to swallow >whatever the user wrote. > These are all correct. You can use `llvm-dwarfdump a.o` to dump a .o file. It has one DW_TAG_compile_unit. If the translation unit has a single contiguous address range, the assembler can emit a pair of DW_AT_low_pc/DW_AT_high_pc (available in DWARF v2). In the case of multiple executable sections, it is not guaranteed that in the final linked image the sections will be contiguous, so the assembler has to assume there may be non-contiguous address ranges and use DW_AT_ranges. Unfortunately DW_AT_ranges was introduced in DWARF v3 and technically not available in DWARF v2. But GNU as ignores this and emits DW_AT_ranges anyway (this is probably fine - like using a GNU extension). If -Wa,-gdwarf-2 -> -Wa,-gdwarf-3 can eliminate the LLVM integrated assembler's warning, we should do it. If people think -Wa,-gdwarf-2 is not useful and want to delete it, I'll be happier. Whether it is necessary to use -Wa,-gdwarf-2/-Wa,-gdwarf-5? Personally I would think this is unnecessary, but I won't mind if people don't mind the additional complexity in Makefile. (I implemented the -gdwarf-5 address range stuff for the integrated assembler).
diff --git a/Makefile b/Makefile index 75b1a3dcbf30..e23786a4c1c7 100644 --- a/Makefile +++ b/Makefile @@ -826,12 +826,14 @@ else DEBUG_CFLAGS += -g endif -ifndef LLVM_IAS -KBUILD_AFLAGS += -Wa,-gdwarf-2 -endif - -ifdef CONFIG_DEBUG_INFO_DWARF4 -DEBUG_CFLAGS += -gdwarf-4 +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) +ifneq ($(dwarf-version-y)$(LLVM_IAS),21) +# Binutils 2.35+ required for -gdwarf-4+ support. +dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) +DEBUG_CFLAGS += $(dwarf-aflag) +KBUILD_AFLAGS += $(dwarf-aflag) endif ifdef CONFIG_DEBUG_INFO_REDUCED diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 83a860126897..03c494eefabd 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -256,14 +256,25 @@ config DEBUG_INFO_SPLIT to know about the .dwo files and include them. Incompatible with older versions of ccache. +choice + prompt "DWARF version" + help + Which version of DWARF debug info to emit. + +config DEBUG_INFO_DWARF2 + bool "Generate DWARF v2 debuginfo" + help + Generate DWARF v2 debug info. + config DEBUG_INFO_DWARF4 bool "Generate dwarf4 debuginfo" depends on $(cc-option,-gdwarf-4) help - Generate dwarf4 debug info. This requires recent versions - of gcc and gdb. It makes the debug information larger. - But it significantly improves the success of resolving - variables in gdb on optimized code. + Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+. + It makes the debug information larger, but it significantly + improves the success of resolving variables in gdb on optimized code. + +endchoice # "DWARF version" config DEBUG_INFO_BTF bool "Generate BTF typeinfo"
Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a way that's forward compatible with existing configs, and makes adding future versions more straightforward. Suggested-by: Fangrui Song <maskray@google.com> Suggested-by: Masahiro Yamada <masahiroy@kernel.org> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> --- Makefile | 14 ++++++++------ lib/Kconfig.debug | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 10 deletions(-)