This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR debug/38757 gcc does not emit DW_LANG_C99
- From: Mark Wielaard <mjw at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: jakub at redhat dot com, jason at redhat dot com, richard dot guenther at gmail dot com, aldyh at redhat dot com
- Date: Wed, 12 Nov 2014 15:50:19 +0100
- Subject: Re: [PATCH] PR debug/38757 gcc does not emit DW_LANG_C99
- Authentication-results: sourceware.org; auth=none
- References: <1412763235-23197-1-git-send-email-mjw at redhat dot com> <1413189233 dot 5534 dot 23 dot camel at bordewijk dot wildebeest dot org>
On Mon, 2014-10-13 at 10:33 +0200, Mark Wielaard wrote:
> On Wed, 2014-10-08 at 12:13 +0200, Mark Wielaard wrote:
> > This patch was written a long time ago by Jakub and has been in Fedora
> > gcc for some time. All I did was rebase it to current gcc trunk
> > and add a testcase. Back when it was originally proposed the issue was
> > that because DWARF was generated late adding new lang hooks for this
> > was problematic for LTO. Now that there is a move towards generating
> > DWARF early I am hoping this patch can finally make it to mainline gcc.
>
> Ping.
Ping again.
> > This lang hook will be more useful when DWARFv5 gets out, which is
> > supposed to define language identifiers for newer C and C++ versions.
> >
> > Previous discussions:
> > http://gcc.gnu.org/ml/gcc-patches/2009-03/msg00858.html
> > http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00991.html
> >
> > gcc/ChangeLog
> >
> > 2009-03-18 Jakub Jelinek <jakub@redhat.com>
> >
> > PR debug/38757
> > * langhooks.h (struct lang_hooks): Add source_language langhook.
> > * langhooks-def.h (LANG_HOOKS_SOURCE_LANGUAGE): Define to NULL.
> > (LANG_HOOKS_INITIALIZER): Add LANG_HOOKS_SOURCE_LANGUAGE.
> > * dwarf2out.c (add_prototyped_attribute): Add DW_AT_prototype
> > also for DW_LANG_{C,C99,ObjC}.
> > (gen_compile_unit_die): Use lang_hooks.source_language () to
> > determine if DW_LANG_C99 or DW_LANG_C89 should be returned.
> >
> > gcc/c/ChangeLog
> >
> > 2009-03-18 Jakub Jelinek <jakub@redhat.com>
> >
> > PR debug/38757
> > * c-lang.c (c_source_language): New function.
> > (LANG_HOOKS_SOURCE_LANGUAGE): Define.
> >
> > gcc/testsuite/ChangeLog
> >
> > 2014-10-08 Mark Wielaard <mjw@redhat.com>
> >
> > PR debug/38757
> > * gcc.dg/debug/dwarf2/lang-c89.c: New test.
> > * gcc.dg/debug/dwarf2/lang-c99.c: Likewise.
> > ---
> > gcc/ChangeLog | 11 +++++++++++
> > gcc/c/ChangeLog | 6 ++++++
> > gcc/c/c-lang.c | 8 ++++++++
> > gcc/dwarf2out.c | 19 ++++++++++++++++---
> > gcc/langhooks-def.h | 4 +++-
> > gcc/langhooks.h | 4 ++++
> > gcc/testsuite/ChangeLog | 6 ++++++
> > gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c | 6 ++++++
> > gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c | 6 ++++++
> > 9 files changed, 66 insertions(+), 4 deletions(-)
> > create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
> > create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c
> >
> > diff --git a/gcc/c/c-lang.c b/gcc/c/c-lang.c
> > index 97c0443..dadeb1a 100644
> > --- a/gcc/c/c-lang.c
> > +++ b/gcc/c/c-lang.c
> > @@ -35,6 +35,12 @@ along with GCC; see the file COPYING3. If not see
> >
> > enum c_language_kind c_language = clk_c;
> >
> > +static int
> > +c_source_language (void)
> > +{
> > + return flag_isoc99 ? 1999 : 1989;
> > +}
> > +
> > /* Lang hooks common to C and ObjC are declared in c-objc-common.h;
> > consequently, there should be very few hooks below. */
> >
> > @@ -44,6 +50,8 @@ enum c_language_kind c_language = clk_c;
> > #define LANG_HOOKS_INIT c_objc_common_init
> > #undef LANG_HOOKS_INIT_TS
> > #define LANG_HOOKS_INIT_TS c_common_init_ts
> > +#undef LANG_HOOKS_SOURCE_LANGUAGE
> > +#define LANG_HOOKS_SOURCE_LANGUAGE c_source_language
> >
> > /* Each front end provides its own lang hook initializer. */
> > struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
> > diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> > index 59c05ed..4932cd0 100644
> > --- a/gcc/dwarf2out.c
> > +++ b/gcc/dwarf2out.c
> > @@ -16708,9 +16708,18 @@ add_bit_size_attribute (dw_die_ref die, tree decl)
> > static inline void
> > add_prototyped_attribute (dw_die_ref die, tree func_type)
> > {
> > - if (get_AT_unsigned (comp_unit_die (), DW_AT_language) == DW_LANG_C89
> > - && prototype_p (func_type))
> > - add_AT_flag (die, DW_AT_prototyped, 1);
> > + switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
> > + {
> > + case DW_LANG_C:
> > + case DW_LANG_C89:
> > + case DW_LANG_C99:
> > + case DW_LANG_ObjC:
> > + if (prototype_p (func_type))
> > + add_AT_flag (die, DW_AT_prototyped, 1);
> > + break;
> > + default:
> > + break;
> > + }
> > }
> >
> > /* Add an 'abstract_origin' attribute below a given DIE. The DIE is found
> > @@ -19544,6 +19553,10 @@ gen_compile_unit_die (const char *filename)
> > language = DW_LANG_ObjC;
> > else if (strcmp (language_string, "GNU Objective-C++") == 0)
> > language = DW_LANG_ObjC_plus_plus;
> > + else if (strcmp (language_string, "GNU C") == 0
> > + && lang_hooks.source_language
> > + && lang_hooks.source_language () >= 1999)
> > + language = DW_LANG_C99;
> > else if (dwarf_version >= 5 || !dwarf_strict)
> > {
> > if (strcmp (language_string, "GNU Go") == 0)
> > diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
> > index e5ae3e3..b6c8dd4 100644
> > --- a/gcc/langhooks-def.h
> > +++ b/gcc/langhooks-def.h
> > @@ -120,6 +120,7 @@ extern bool lhd_omp_mappable_type (tree);
> > #define LANG_HOOKS_BLOCK_MAY_FALLTHRU hook_bool_const_tree_true
> > #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP false
> > #define LANG_HOOKS_DEEP_UNSHARING false
> > +#define LANG_HOOKS_SOURCE_LANGUAGE NULL
> >
> > /* Attribute hooks. */
> > #define LANG_HOOKS_ATTRIBUTE_TABLE NULL
> > @@ -313,7 +314,8 @@ extern void lhd_end_section (void);
> > LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS, \
> > LANG_HOOKS_BLOCK_MAY_FALLTHRU, \
> > LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \
> > - LANG_HOOKS_DEEP_UNSHARING \
> > + LANG_HOOKS_DEEP_UNSHARING, \
> > + LANG_HOOKS_SOURCE_LANGUAGE \
> > }
> >
> > #endif /* GCC_LANG_HOOKS_DEF_H */
> > diff --git a/gcc/langhooks.h b/gcc/langhooks.h
> > index 32e76f9..0022516 100644
> > --- a/gcc/langhooks.h
> > +++ b/gcc/langhooks.h
> > @@ -485,6 +485,10 @@ struct lang_hooks
> > gimplification. */
> > bool deep_unsharing;
> >
> > + /* Return year of the source language standard version if the FE supports
> > + multiple versions of the standard. */
> > + int (*source_language) (void);
> > +
> > /* Whenever you add entries here, make sure you adjust langhooks-def.h
> > and langhooks.c accordingly. */
> > };
> > diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
> > new file mode 100644
> > index 0000000..6292cf8
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
> > @@ -0,0 +1,6 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O -std=c89 -g -dA" } */
> > +/* DW_LANG_C89 = 0x0001 */
> > +/* { dg-final { scan-assembler "0x1.*DW_AT_language" } } */
> > +
> > +int version;
> > diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c
> > new file mode 100644
> > index 0000000..1d789fe
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c
> > @@ -0,0 +1,6 @@
> > +// { dg-do compile }
> > +// { dg-options "-O -std=c99 -g -dA" }
> > +// DW_LANG_C99 = 0x000c
> > +// { dg-final { scan-assembler "0xc.*DW_AT_language" } } */
> > +
> > +int version;
>