You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.8 KiB
106 lines
3.8 KiB
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. |
|
c/ |
|
* c-lang.c (c_source_language): New function. |
|
(LANG_HOOKS_SOURCE_LANGUAGE): Define. |
|
|
|
--- gcc/langhooks.h.jj 2011-01-03 12:53:05.125745450 +0100 |
|
+++ gcc/langhooks.h 2011-01-04 17:59:43.166744926 +0100 |
|
@@ -467,6 +467,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. */ |
|
}; |
|
--- gcc/langhooks-def.h.jj 2011-01-03 12:53:05.000000000 +0100 |
|
+++ gcc/langhooks-def.h 2011-01-04 18:00:44.858851030 +0100 |
|
@@ -118,6 +118,7 @@ extern void lhd_omp_firstprivatize_type_ |
|
#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 |
|
@@ -303,7 +304,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 */ |
|
--- gcc/c/c-lang.c.jj 2011-01-03 12:53:05.376056936 +0100 |
|
+++ gcc/c/c-lang.c 2011-01-04 17:59:43.167743798 +0100 |
|
@@ -36,6 +36,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. */ |
|
|
|
@@ -45,6 +51,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; |
|
--- gcc/dwarf2out.c.jj 2011-01-03 12:53:05.102056475 +0100 |
|
+++ gcc/dwarf2out.c 2011-01-04 18:03:14.534151763 +0100 |
|
@@ -16109,9 +16109,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 |
|
- && 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 |
|
@@ -18915,6 +18924,10 @@ gen_compile_unit_die (const char *filena |
|
if (strcmp (language_string, "GNU Go") == 0) |
|
language = DW_LANG_Go; |
|
} |
|
+ else if (strcmp (language_string, "GNU C") == 0 |
|
+ && lang_hooks.source_language |
|
+ && lang_hooks.source_language () >= 1999) |
|
+ language = DW_LANG_C99; |
|
} |
|
/* Use a degraded Fortran setting in strict DWARF2 so is_fortran works. */ |
|
else if (strcmp (language_string, "GNU Fortran") == 0)
|
|
|