diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-05-27 14:11:35 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-05-27 14:11:35 +0000 |
commit | 7951d88a0c68059bc28a8fdd89390d0c315b7e34 (patch) | |
tree | cbad29225d6336a230779ca3e818e4ac1ce219e6 | |
parent | fde9c428ca630b5e4fb4dc24fba6e59b95e48d4c (diff) | |
download | gcc-7951d88a0c68059bc28a8fdd89390d0c315b7e34.zip gcc-7951d88a0c68059bc28a8fdd89390d0c315b7e34.tar.gz gcc-7951d88a0c68059bc28a8fdd89390d0c315b7e34.tar.bz2 |
re PR lto/44230 (Do not create need for multiple EH personalities)
PR lto/44230
* dwarf2out.c (dwarf2out_begin_prologue): Fix nits in sorry message.
lto/
* lto.h (lto_eh_personality): New prototype.
* lto.c: Include debug.h.
(first_personality_decl): New static variable.
(lto_materialize_function): Set it to DECL_FUNCTION_PERSONALITY of the
first function for which it is non-null.
(lto_eh_personality_decl): New static variable.
(lto_eh_personality): New function.
* lto-lang.c (LANG_HOOKS_EH_PERSONALITY): Redefine to above function.
* Make-lang.in (lto/lto.o): Add dependency on debug.h.
From-SVN: r159921
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 9 | ||||
-rw-r--r-- | gcc/lto/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/lto/Make-lang.in | 2 | ||||
-rw-r--r-- | gcc/lto/lto-lang.c | 2 | ||||
-rw-r--r-- | gcc/lto/lto.c | 34 | ||||
-rw-r--r-- | gcc/lto/lto.h | 1 |
7 files changed, 57 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 947d1b1..9c4d319 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-05-27 Eric Botcazou <ebotcazou@adacore.com> + + PR lto/44230 + * dwarf2out.c (dwarf2out_begin_prologue): Fix nits in sorry message. + 2010-05-27 Richard Guenther <rguenther@suse.de> PR tree-optimization/44284 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index a50e02a..ca2194f 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4009,12 +4009,11 @@ dwarf2out_begin_prologue (unsigned int line ATTRIBUTE_UNUSED, current_unit_personality = personality; /* We cannot keep a current personality per function as without CFI - asm at the point where we emit the CFI data there is no current + asm, at the point where we emit the CFI data, there is no current function anymore. */ - if (personality - && current_unit_personality != personality) - sorry ("Multiple EH personalities are supported only with assemblers " - "supporting .cfi.personality directive."); + if (personality && current_unit_personality != personality) + sorry ("multiple EH personalities are supported only with assemblers " + "supporting .cfi_personality directive"); } } diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 0ab3a92..2922c80a7 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,16 @@ +2010-05-27 Eric Botcazou <ebotcazou@adacore.com> + + PR lto/44230 + * lto.h (lto_eh_personality): New prototype. + * lto.c: Include debug.h. + (first_personality_decl): New static variable. + (lto_materialize_function): Set it to DECL_FUNCTION_PERSONALITY of the + first function for which it is non-null. + (lto_eh_personality_decl): New static variable. + (lto_eh_personality): New function. + * lto-lang.c (LANG_HOOKS_EH_PERSONALITY): Redefine to above function. + * Make-lang.in (lto/lto.o): Add dependency on debug.h. + 2010-05-26 Steven Bosscher <steven@gcc.gnu.org> * lto-lang.c: Do not include expr.h. diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in index 1496449..b18747e 100644 --- a/gcc/lto/Make-lang.in +++ b/gcc/lto/Make-lang.in @@ -84,7 +84,7 @@ lto/lto.o: lto/lto.c $(CONFIG_H) $(SYSTEM_H) coretypes.h opts.h \ toplev.h $(TREE_H) $(DIAGNOSTIC_H) $(TM_H) $(LIBIBERTY_H) \ $(CGRAPH_H) $(GGC_H) tree-ssa-operands.h $(TREE_PASS_H) \ langhooks.h vec.h $(BITMAP_H) pointer-set.h $(IPA_PROP_H) \ - $(COMMON_H) $(TIMEVAR_H) $(GIMPLE_H) $(LTO_H) $(LTO_TREE_H) \ + $(COMMON_H) debug.h $(TIMEVAR_H) $(GIMPLE_H) $(LTO_H) $(LTO_TREE_H) \ $(LTO_TAGS_H) $(LTO_STREAMER_H) gt-lto-lto.h lto/lto-elf.o: lto/lto-elf.c $(CONFIG_H) coretypes.h $(SYSTEM_H) \ toplev.h $(LTO_H) $(TM_H) $(LIBIBERTY_H) $(GGC_H) $(LTO_STREAMER_H) diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 4882315..974e3d7 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -1161,6 +1161,8 @@ static void lto_init_ts (void) #define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS true #undef LANG_HOOKS_TYPES_COMPATIBLE_P #define LANG_HOOKS_TYPES_COMPATIBLE_P NULL +#undef LANG_HOOKS_EH_PERSONALITY +#define LANG_HOOKS_EH_PERSONALITY lto_eh_personality /* Attribute hooks. */ #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index d1ccc5a..52ef9ed 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see #include "pointer-set.h" #include "ipa-prop.h" #include "common.h" +#include "debug.h" #include "timevar.h" #include "gimple.h" #include "lto.h" @@ -61,6 +62,9 @@ along with GCC; see the file COPYING3. If not see DEF_VEC_P(bitmap); DEF_VEC_ALLOC_P(bitmap,heap); +static GTY(()) tree first_personality_decl; + + /* Read the constructors and inits. */ static void @@ -75,7 +79,7 @@ lto_materialize_constructors_and_inits (struct lto_file_decl_data * file_data) data, len); } -/* Read the function body for the function associated with NODE if possible. */ +/* Read the function body for the function associated with NODE. */ static void lto_materialize_function (struct cgraph_node *node) @@ -113,9 +117,11 @@ lto_materialize_function (struct cgraph_node *node) WPA mode, the body of the function is not needed. */ if (!flag_wpa) { - allocate_struct_function (decl, false); - announce_function (node->decl); + allocate_struct_function (decl, false); + announce_function (decl); lto_input_function_body (file_data, decl, data); + if (DECL_FUNCTION_PERSONALITY (decl) && !first_personality_decl) + first_personality_decl = DECL_FUNCTION_PERSONALITY (decl); lto_stats.num_function_bodies++; } @@ -1844,6 +1850,28 @@ do_whole_program_analysis (void) } +static GTY(()) tree lto_eh_personality_decl; + +/* Return the LTO personality function decl. */ + +tree +lto_eh_personality (void) +{ + if (!lto_eh_personality_decl) + { + /* Use the first personality DECL for our personality if we don't + support multiple ones. This ensures that we don't artificially + create the need for them in a single-language program. */ + if (first_personality_decl && !dwarf2out_do_cfi_asm ()) + lto_eh_personality_decl = first_personality_decl; + else + lto_eh_personality_decl = lhd_gcc_personality (); + } + + return lto_eh_personality_decl; +} + + /* Main entry point for the GIMPLE front end. This front end has three main personalities: diff --git a/gcc/lto/lto.h b/gcc/lto/lto.h index 7f8e108..cdd30d6 100644 --- a/gcc/lto/lto.h +++ b/gcc/lto/lto.h @@ -36,6 +36,7 @@ typedef struct lto_file_struct extern const char *resolution_file_name; /* In lto.c */ +extern tree lto_eh_personality (void); extern void lto_main (int); extern void lto_read_all_file_options (void); |