aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2010-10-13 11:57:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2010-10-13 11:57:31 -0700
commitbde8a146a602d86483dff9a5b0a9f34419ab3d32 (patch)
tree3c1d073f5371ed3d1591b0a5f61b529b6c5b86af /gcc/expr.c
parentd1655e0b38cecbdeed551818b2406fcb39919ba7 (diff)
downloadgcc-bde8a146a602d86483dff9a5b0a9f34419ab3d32.zip
gcc-bde8a146a602d86483dff9a5b0a9f34419ab3d32.tar.gz
gcc-bde8a146a602d86483dff9a5b0a9f34419ab3d32.tar.bz2
Centralize knowledge of eh personality routines.
From-SVN: r165433
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c24
1 files changed, 21 insertions, 3 deletions
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,