aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-05-27 14:11:35 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-05-27 14:11:35 +0000
commit7951d88a0c68059bc28a8fdd89390d0c315b7e34 (patch)
treecbad29225d6336a230779ca3e818e4ac1ce219e6 /gcc/lto
parentfde9c428ca630b5e4fb4dc24fba6e59b95e48d4c (diff)
downloadgcc-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
Diffstat (limited to 'gcc/lto')
-rw-r--r--gcc/lto/ChangeLog13
-rw-r--r--gcc/lto/Make-lang.in2
-rw-r--r--gcc/lto/lto-lang.c2
-rw-r--r--gcc/lto/lto.c34
-rw-r--r--gcc/lto/lto.h1
5 files changed, 48 insertions, 4 deletions
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);