Hi, 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.
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 <ja...@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 <ja...@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 <m...@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; -- 1.8.3.1