public inbox for java@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@redhat.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>
Cc: rguenther@suse.de, joseph@codesourcery.com, jason@redhat.com,
	       java@gcc.gnu.org, ian@airs.com, ebotcazou@libertysurf.fr
Subject: [RFC] Centralize knowledge of eh personality routines
Date: Tue, 12 Oct 2010 22:59:00 -0000	[thread overview]
Message-ID: <4CB4E841.1090308@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 558 bytes --]

The driver for this patch is SEH, which will add yet another function
name variant in each of these places in each front end.  While I could
adjust each language appropriately, it seems to me that it is a bit
cleaner to centralize this knowledge.

The next possibly objectionable point is including dwarf2.h in tree.h.
I went ahead and did this because in the past we had talked about using
the dwarf language enum in LTO.  I could see eliminating the hackish
language_string -> enum mapping that is done in dwarf2out.c as well.

Comments?  Objections?


r~

[-- Attachment #2: d-per-1 --]
[-- Type: text/plain, Size: 8447 bytes --]

gcc/
	* expr.c (build_personality_function): Take parameter LANG instead
	of parameter NAME.  Build the name based on a known lang-specific
	prefix and the unwind method in use.
	* tree.c (lhd_gcc_personality): Update call to
	build_personality_function.
	* tree.h: Include dwarf2.h.
	(build_personality_function): Update decl.
	* Makefile.in (TREE_H): Update deps.

gcc/ada/
	* gcc-interface/misc.c (gnat_eh_personality): Update call to
	build_personality_function.
gcc/cp/
	* cp-lang.c (cp_eh_personality): Update call to
	build_personality_function.
	* except.c (choose_personality_routine): Update function comment.
gcc/java/
	* lang.c (java_eh_personality): Update call to
	build_personality_function.
gcc/objc/
	* objc-act.c (objc_eh_personality): Update call to
	build_personality_function.
gcc/objcp/
	* objcp-lang.c (objcxx_eh_personality): Update call to
	build_personality_function.


diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index 7703e2e..3fea6a3 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 (DW_LANG_Ada95);
   return gnat_eh_personality_decl;
 }
 
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 0b70444..1126283 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -166,17 +166,10 @@ cp_eh_personality (void)
 {
   if (!cp_eh_personality_decl)
     {
-      const char *name;
+      enum dwarf_source_language lang;
 
-      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);
+      lang = (pragma_java_exceptions ? DW_LANG_Java : DW_LANG_C_plus_plus);
+      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..3093967 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -10255,13 +10255,63 @@ 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 personality function given a language.  LANG is really an
+   enum dwarf_source_language.  */
 
 tree
-build_personality_function (const char *name)
+build_personality_function (enum dwarf_source_language lang)
 {
+  enum unwind_info_type ui = targetm.except_unwind_info ();
+  const char *prefix, *unwind, *version = "0";
   tree decl, type;
+  char *name;
+
+  switch (ui)
+    {
+    case UI_NONE:
+      return NULL;
+    case UI_SJLJ:
+      unwind = "_sj";
+      break;
+    case UI_DWARF2:
+    case UI_TARGET:
+      unwind = "_v";
+      break;
+    default:
+      gcc_unreachable ();
+    }
+
+  switch (lang)
+    {
+    case DW_LANG_Ada83:
+    case DW_LANG_Ada95:
+      prefix = "__gnat_eh_personality";
+      /* The GNAT folk did not follow the standard naming format.
+	 That can change if we ever have to increment the version.  */
+      if (ui == UI_DWARF2 || ui == UI_TARGET)
+	unwind = "";
+      version = "";
+      break;
+
+    case DW_LANG_C_plus_plus:
+      prefix = "__gxx_personality";
+      break;
+
+    case DW_LANG_Java:
+      prefix = "__gcj_personality";
+      break;
+
+    case DW_LANG_ObjC:
+      prefix = "__gnu_objc_personality";
+      break;
+
+    default:
+      /* All other languages use the minimal C personality.  */
+      prefix = "__gcc_personality";
+      break;
+    }
+
+  name = concat (prefix, unwind, version, NULL);
 
   type = build_function_type_list (integer_type_node, integer_type_node,
 				   long_long_unsigned_type_node,
@@ -10276,6 +10326,7 @@ build_personality_function (const char *name)
      are the flags assigned by targetm.encode_section_info.  */
   SET_SYMBOL_REF_DECL (XEXP (DECL_RTL (decl), 0), NULL);
 
+  free (name);
   return decl;
 }
 
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index fbe25ad..7b29ea3 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 (DW_LANG_Java);
   return java_eh_personality_decl;
 }
 
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 3a13519..6e2a0fa 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -3693,13 +3693,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 (DW_LANG_ObjC);
   return objc_eh_personality_decl;
 }
 #endif
diff --git a/gcc/objcp/objcp-lang.c b/gcc/objcp/objcp-lang.c
index fdb2976..1224c31 100644
--- a/gcc/objcp/objcp-lang.c
+++ b/gcc/objcp/objcp-lang.c
@@ -148,9 +148,7 @@ 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");
+      = build_personality_function (DW_LANG_C_plus_plus);
 
   return objcp_eh_personality_decl;
 }
diff --git a/gcc/tree.c b/gcc/tree.c
index cf5881a..e02ad3e 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 (DW_LANG_C);
   return gcc_eh_personality_decl;
 }
 
diff --git a/gcc/tree.h b/gcc/tree.h
index 8aedf1a..ef7f409 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "fixed-value.h"
 #include "alias.h"
 #include "flags.h"
+#include "dwarf2.h"		/* for enum dwarf_source_language */
 
 /* Codes of tree nodes */
 
@@ -5474,7 +5475,7 @@ extern unsigned HOST_WIDE_INT compute_builtin_object_size (tree, int);
 
 /* In expr.c.  */
 extern unsigned HOST_WIDE_INT highest_pow2_factor (const_tree);
-extern tree build_personality_function (const char *);
+extern tree build_personality_function (enum dwarf_source_language);
 
 /* In tree-inline.c.  */
 
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 8118c06..f1b6972 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -886,7 +886,7 @@ TREE_H = tree.h all-tree.def tree.def c-family/c-common.def \
 	$(lang_tree_files) $(MACHMODE_H) tree-check.h $(BUILTINS_DEF) \
 	$(INPUT_H) statistics.h $(VEC_H) treestruct.def $(HASHTAB_H) \
 	double-int.h alias.h $(SYMTAB_H) $(FLAGS_H) vecir.h \
-	$(REAL_H) $(FIXED_VALUE_H)
+	$(REAL_H) $(FIXED_VALUE_H) $(DWARF2_H)
 REGSET_H = regset.h $(BITMAP_H) hard-reg-set.h
 BASIC_BLOCK_H = basic-block.h $(PREDICT_H) $(VEC_H) $(FUNCTION_H) cfghooks.h
 GIMPLE_H = gimple.h gimple.def gsstruct.def pointer-set.h $(VEC_H) \

             reply	other threads:[~2010-10-12 22:59 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-12 22:59 Richard Henderson [this message]
2010-10-13  1:11 ` Jason Merrill
2010-10-13  4:58 ` Ian Lance Taylor
2010-10-13  7:04 ` Eric Botcazou
2010-10-13  7:09   ` Arnaud Charlet
2010-10-13  7:23   ` Olivier Hainque
2010-10-13  8:53 ` Andrew Haley
2010-10-13 14:14 ` Mark Mitchell
2010-10-13 18:07 ` Richard Henderson
2010-10-13 18:12   ` Eric Botcazou
2010-10-13 18:26     ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CB4E841.1090308@redhat.com \
    --to=rth@redhat.com \
    --cc=ebotcazou@libertysurf.fr \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=ian@airs.com \
    --cc=jason@redhat.com \
    --cc=java@gcc.gnu.org \
    --cc=joseph@codesourcery.com \
    --cc=rguenther@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).