From bde8a146a602d86483dff9a5b0a9f34419ab3d32 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 13 Oct 2010 11:57:31 -0700 Subject: [PATCH] Centralize knowledge of eh personality routines. From-SVN: r165433 --- gcc/ChangeLog | 8 ++++++++ gcc/ada/ChangeLog | 7 +++++++ gcc/ada/gcc-interface/misc.c | 6 +----- gcc/ada/raise-gcc.c | 8 ++++---- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-lang.c | 13 ++----------- gcc/cp/except.c | 5 ++--- gcc/expr.c | 24 +++++++++++++++++++++--- gcc/java/ChangeLog | 5 +++++ gcc/java/lang.c | 6 +----- gcc/objc/ChangeLog | 5 +++++ gcc/objc/objc-act.c | 9 ++------- gcc/objcp/ChangeLog | 5 +++++ gcc/objcp/objcp-lang.c | 6 +----- gcc/tree.c | 6 +----- 15 files changed, 71 insertions(+), 48 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 531b889..1fbd881 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-10-13 Richard Henderson + + * expr.c (build_personality_function): Take parameter LANG instead + of parameter NAME. Build the name based on the lang prefix and the + unwind method in use. + * tree.c (lhd_gcc_personality): Update call to + build_personality_function. + 2010-10-13 Richard Guenther PR objc/45878 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3fd613a..df5b433 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2010-10-13 Richard Henderson + + * gcc-interface/misc.c (gnat_eh_personality): Update call to + build_personality_function. + * raise-gcc.c (PERSONALITY_FUNCTION): Change to match other languages; + use__gnat_personality_{v,sj}0. + 2010-10-12 Vincent Celier * prj-nmsc.adb (Add_Source): Put source in hash table Source_Files_HT diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 7703e2e..a1b2490 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -687,11 +687,7 @@ static tree gnat_eh_personality (void) { if (!gnat_eh_personality_decl) - gnat_eh_personality_decl - = build_personality_function (targetm.except_unwind_info () == UI_SJLJ - ? "__gnat_eh_personality_sj" - : "__gnat_eh_personality"); - + gnat_eh_personality_decl = build_personality_function ("gnat"); return gnat_eh_personality_decl; } diff --git a/gcc/ada/raise-gcc.c b/gcc/ada/raise-gcc.c index 3589bc5..512ff36 100644 --- a/gcc/ada/raise-gcc.c +++ b/gcc/ada/raise-gcc.c @@ -407,7 +407,7 @@ db_phases (int phases) =================================== The major point of this unit is to provide an exception propagation - personality routine for Ada. This is __gnat_eh_personality. + personality routine for Ada. This is __gnat_personality_v0. It is provided with a pointer to the propagated exception, an unwind context describing a location the propagation is going through, and a @@ -440,7 +440,7 @@ db_phases (int phases) | | (Ada frame) | - +--> __gnat_eh_personality (context, exception) + +--> __gnat_personality_v0 (context, exception) | +--> get_region_descriptor_for (context) | @@ -1028,9 +1028,9 @@ extern void __gnat_notify_unhandled_exception (void); GNU-Ada exceptions are met. */ #ifdef __USING_SJLJ_EXCEPTIONS__ -#define PERSONALITY_FUNCTION __gnat_eh_personality_sj +#define PERSONALITY_FUNCTION __gnat_personality_sj0 #else -#define PERSONALITY_FUNCTION __gnat_eh_personality +#define PERSONALITY_FUNCTION __gnat_personality_v0 #endif /* Major tweak for ia64-vms : the CHF propagation phase calls this personality diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9ac7a4a..683e439 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-10-13 Richard Henderson + + * cp-lang.c (cp_eh_personality): Update call to + build_personality_function. + * except.c (choose_personality_routine): Update function comment. + 2010-10-13 Richard Guenther * tree.c (cp_free_lang_data): Free DECL_NAMESPACE_USERS and diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index 0b70444..a07d7be 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -166,17 +166,8 @@ cp_eh_personality (void) { if (!cp_eh_personality_decl) { - const char *name; - - name = (targetm.except_unwind_info () == UI_SJLJ - ? (pragma_java_exceptions - ? "__gcj_personality_sj0" - : "__gxx_personality_sj0") - : (pragma_java_exceptions - ? "__gcj_personality_v0" - : "__gxx_personality_v0")); - - cp_eh_personality_decl = build_personality_function (name); + const char *lang = (pragma_java_exceptions ? "gcj" : "gxx"); + cp_eh_personality_decl = build_personality_function (lang); } return cp_eh_personality_decl; diff --git a/gcc/cp/except.c b/gcc/cp/except.c index 9d19aa9..b917664 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -295,9 +295,8 @@ decl_is_java_type (tree decl, int err) /* Select the personality routine to be used for exception handling, or issue an error if we need two different ones in the same translation unit. - ??? At present eh_personality_decl is set to - __gxx_personality_(sj|v)0 in init_exception_processing - should it - be done here instead? */ + ??? At present DECL_FUNCTION_PERSONALITY is set via + LANG_HOOKS_EH_PERSONALITY. Should it be done here instead? */ void choose_personality_routine (enum languages lang) { diff --git a/gcc/expr.c b/gcc/expr.c index b0c160f..0050518 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10255,13 +10255,31 @@ const_vector_from_tree (tree exp) return gen_rtx_CONST_VECTOR (mode, v); } - -/* Build a decl for a EH personality function named NAME. */ +/* Build a decl for a personality function given a language prefix. */ tree -build_personality_function (const char *name) +build_personality_function (const char *lang) { + const char *unwind_and_version; tree decl, type; + char *name; + + switch (targetm.except_unwind_info ()) + { + case UI_NONE: + return NULL; + case UI_SJLJ: + unwind_and_version = "_sj0"; + break; + case UI_DWARF2: + case UI_TARGET: + unwind_and_version = "_v0"; + break; + default: + gcc_unreachable (); + } + + name = ACONCAT (("__", lang, "_personality", unwind_and_version, NULL)); type = build_function_type_list (integer_type_node, integer_type_node, long_long_unsigned_type_node, diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index a7edd3b..41ae31c 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +2010-10-13 Richard Henderson + + * lang.c (java_eh_personality): Update call to + build_personality_function. + 2010-10-12 Joseph Myers * Make-lang.in (java/lang.o): Use $(OPTIONS_H) instead of diff --git a/gcc/java/lang.c b/gcc/java/lang.c index fbe25ad..45722e5 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -911,11 +911,7 @@ static tree java_eh_personality (void) { if (!java_eh_personality_decl) - java_eh_personality_decl - = build_personality_function (targetm.except_unwind_info () == UI_SJLJ - ? "__gcj_personality_sj0" - : "__gcj_personality_v0"); - + java_eh_personality_decl = build_personality_function ("gcj"); return java_eh_personality_decl; } diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index ed1bc2e..81a872d 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,8 @@ +2010-10-13 Richard Henderson + + * objc-act.c (objc_eh_personality): Update call to + build_personality_function. + 2010-10-13 Iain Sandoe merge from FSF apple 'trunk' branch. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 26d490e..edde784 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -3716,13 +3716,8 @@ objc_eh_runtime_type (tree type) tree objc_eh_personality (void) { - if (!flag_objc_sjlj_exceptions - && !objc_eh_personality_decl) - objc_eh_personality_decl - = build_personality_function (targetm.except_unwind_info () == UI_SJLJ - ? "__gnu_objc_personality_sj0" - : "__gnu_objc_personality_v0"); - + if (!flag_objc_sjlj_exceptions && !objc_eh_personality_decl) + objc_eh_personality_decl = build_personality_function ("gnu_objc"); return objc_eh_personality_decl; } #endif diff --git a/gcc/objcp/ChangeLog b/gcc/objcp/ChangeLog index ab44899..26e3c7a 100644 --- a/gcc/objcp/ChangeLog +++ b/gcc/objcp/ChangeLog @@ -1,3 +1,8 @@ +2010-10-13 Richard Henderson + + * objcp-lang.c (objcxx_eh_personality): Update call to + build_personality_function. + 2010-10-11 Andi Kleen * Make-lang.in (cc1objplus-checksum.c): Use correct temporary diff --git a/gcc/objcp/objcp-lang.c b/gcc/objcp/objcp-lang.c index fdb2976..6a45404 100644 --- a/gcc/objcp/objcp-lang.c +++ b/gcc/objcp/objcp-lang.c @@ -147,11 +147,7 @@ static tree objcxx_eh_personality (void) { if (!objcp_eh_personality_decl) - objcp_eh_personality_decl - = build_personality_function (targetm.except_unwind_info () == UI_SJLJ - ? "__gxx_personality_sj0" - : "__gxx_personality_v0"); - + objcp_eh_personality_decl = build_personality_function ("gxx"); return objcp_eh_personality_decl; } diff --git a/gcc/tree.c b/gcc/tree.c index cf5881a..28cc2d8 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -10874,11 +10874,7 @@ tree lhd_gcc_personality (void) { if (!gcc_eh_personality_decl) - gcc_eh_personality_decl - = build_personality_function (targetm.except_unwind_info () == UI_SJLJ - ? "__gcc_personality_sj0" - : "__gcc_personality_v0"); - + gcc_eh_personality_decl = build_personality_function ("gcc"); return gcc_eh_personality_decl; } -- 2.7.4