2009-03-18 Jakub Jelinek 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. * c-lang.c (c_source_language): New function. (LANG_HOOKS_SOURCE_LANGUAGE): Define. * 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/langhooks.h.jj 2010-06-30 09:48:30.000000000 +0200 +++ gcc/langhooks.h 2010-07-01 16:15:22.432616871 +0200 @@ -454,6 +454,10 @@ struct lang_hooks is enabled. */ bool eh_use_cxa_end_cleanup; + /* 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. */ }; --- gcc/langhooks-def.h.jj 2010-06-30 09:48:30.000000000 +0200 +++ gcc/langhooks-def.h 2010-07-01 16:16:07.427460761 +0200 @@ -1,5 +1,5 @@ /* Default macros to initialize the lang_hooks data structure. - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Alexandre Oliva @@ -111,6 +111,7 @@ extern void lhd_omp_firstprivatize_type_ #define LANG_HOOKS_EH_PERSONALITY lhd_gcc_personality #define LANG_HOOKS_EH_RUNTIME_TYPE lhd_pass_through_t #define LANG_HOOKS_EH_USE_CXA_END_CLEANUP false +#define LANG_HOOKS_SOURCE_LANGUAGE NULL /* Attribute hooks. */ #define LANG_HOOKS_ATTRIBUTE_TABLE NULL @@ -301,6 +302,7 @@ extern void lhd_end_section (void); LANG_HOOKS_EH_PERSONALITY, \ LANG_HOOKS_EH_RUNTIME_TYPE, \ LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \ + LANG_HOOKS_SOURCE_LANGUAGE, \ } #endif /* GCC_LANG_HOOKS_DEF_H */ --- gcc/c-lang.c.jj 2010-06-30 09:48:30.000000000 +0200 +++ gcc/c-lang.c 2010-07-01 16:14:25.396197804 +0200 @@ -1,6 +1,6 @@ /* Language-specific hook definitions for C front end. Copyright (C) 1991, 1995, 1997, 1998, - 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008 + 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -37,6 +37,12 @@ along with GCC; see the file COPYING3. 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_NAME "GNU C" #undef LANG_HOOKS_INIT #define LANG_HOOKS_INIT c_objc_common_init +#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; --- gcc/dwarf2out.c.jj 2010-07-01 14:07:41.000000000 +0200 +++ gcc/dwarf2out.c 2010-07-01 16:13:24.597354717 +0200 @@ -17150,9 +17150,18 @@ add_bit_size_attribute (dw_die_ref die, 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 - && TYPE_ARG_TYPES (func_type) != NULL) - 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 (TYPE_ARG_TYPES (func_type) != NULL) + add_AT_flag (die, DW_AT_prototyped, 1); + break; + default: + break; + } } /* Add an 'abstract_origin' attribute below a given DIE. The DIE is found @@ -19246,6 +19255,10 @@ gen_compile_unit_die (const char *filena 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; } add_AT_unsigned (die, DW_AT_language, language);