[llvm-commits] [llvm-gcc-4.2] r41561 - in /llvm-gcc-4.2/trunk/gcc: ada/misc.c c-decl.c cp/except.c except.c expr.h java/decl.c libfuncs.h llvm-convert.cpp llvm-internal.h objc/objc-act.c optabs.c

Duncan Sands baldrick at free.fr
Wed Aug 29 00:01:19 PDT 2007


Author: baldrick
Date: Wed Aug 29 02:01:18 2007
New Revision: 41561

URL: http://llvm.org/viewvc/llvm-project?rev=41561&view=rev
Log:
Use the correct personality and unwind_resume functions for
the language being compiled.

Modified:
    llvm-gcc-4.2/trunk/gcc/ada/misc.c
    llvm-gcc-4.2/trunk/gcc/c-decl.c
    llvm-gcc-4.2/trunk/gcc/cp/except.c
    llvm-gcc-4.2/trunk/gcc/except.c
    llvm-gcc-4.2/trunk/gcc/expr.h
    llvm-gcc-4.2/trunk/gcc/java/decl.c
    llvm-gcc-4.2/trunk/gcc/libfuncs.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-internal.h
    llvm-gcc-4.2/trunk/gcc/objc/objc-act.c
    llvm-gcc-4.2/trunk/gcc/optabs.c

Modified: llvm-gcc-4.2/trunk/gcc/ada/misc.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/ada/misc.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/ada/misc.c (original)
+++ llvm-gcc-4.2/trunk/gcc/ada/misc.c Wed Aug 29 02:01:18 2007
@@ -512,8 +512,8 @@
      right exception regions.  */
   using_eh_for_cleanups ();
 
-  eh_personality_libfunc = init_one_libfunc ("__gnat_eh_personality");
   /* LLVM LOCAL begin */
+  llvm_eh_personality_libfunc = llvm_init_one_libfunc ("__gnat_eh_personality");
   default_init_unwind_resume_libfunc ();
   /* LLVM LOCAL end */
   lang_eh_type_covers = gnat_eh_type_covers;

Modified: llvm-gcc-4.2/trunk/gcc/c-decl.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-decl.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-decl.c (original)
+++ llvm-gcc-4.2/trunk/gcc/c-decl.c Wed Aug 29 02:01:18 2007
@@ -3550,10 +3550,12 @@
     return;
 
   c_eh_initialized_p = true;
-  eh_personality_libfunc
-    = init_one_libfunc (USING_SJLJ_EXCEPTIONS
-			? "__gcc_personality_sj0"
-			: "__gcc_personality_v0");
+  /* LLVM local begin */
+  llvm_eh_personality_libfunc
+    = llvm_init_one_libfunc (USING_SJLJ_EXCEPTIONS
+                             ? "__gcc_personality_sj0"
+                             : "__gcc_personality_v0");
+  /* LLVM local end */
   default_init_unwind_resume_libfunc ();
   using_eh_for_cleanups ();
 }

Modified: llvm-gcc-4.2/trunk/gcc/cp/except.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/except.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/except.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/except.c Wed Aug 29 02:01:18 2007
@@ -78,11 +78,15 @@
   call_unexpected_node
     = push_throw_library_fn (get_identifier ("__cxa_call_unexpected"), tmp);
 
-  eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
-					     ? "__gxx_personality_sj0"
-					     : "__gxx_personality_v0");
+  /* LLVM local begin */
+  llvm_eh_personality_libfunc
+    = llvm_init_one_libfunc (USING_SJLJ_EXCEPTIONS
+                             ? "__gxx_personality_sj0"
+                             : "__gxx_personality_v0");
+  /* LLVM local end */
   if (targetm.arm_eabi_unwinder)
-    unwind_resume_libfunc = init_one_libfunc ("__cxa_end_cleanup");
+    /* LLVM local */
+    llvm_unwind_resume_libfunc = llvm_init_one_libfunc ("__cxa_end_cleanup");
   else
     default_init_unwind_resume_libfunc ();
 
@@ -354,9 +358,12 @@
 
     case lang_java:
       state = chose_java;
-      eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
-						 ? "__gcj_personality_sj0"
-						 : "__gcj_personality_v0");
+      /* LLVM local begin */
+      llvm_eh_personality_libfunc
+        = llvm_init_one_libfunc (USING_SJLJ_EXCEPTIONS
+                                 ? "__gcj_personality_sj0"
+                                 : "__gcj_personality_v0");
+      /* LLVM local end */
       break;
 
     default:

Modified: llvm-gcc-4.2/trunk/gcc/except.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/except.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/except.c (original)
+++ llvm-gcc-4.2/trunk/gcc/except.c Wed Aug 29 02:01:18 2007
@@ -4007,9 +4007,11 @@
 default_init_unwind_resume_libfunc (void)
 {
   /* The default c++ routines aren't actually c++ specific, so use those.  */
-  unwind_resume_libfunc =
-    init_one_libfunc ( USING_SJLJ_EXCEPTIONS ? "_Unwind_SjLj_Resume"
-					     : "_Unwind_Resume");
+  /* LLVM local begin */
+  llvm_unwind_resume_libfunc = llvm_init_one_libfunc ( USING_SJLJ_EXCEPTIONS ?
+                                                       "_Unwind_SjLj_Resume"
+                                                       : "_Unwind_Resume");
+  /* LLVM local end */
 }
 
 

Modified: llvm-gcc-4.2/trunk/gcc/expr.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/expr.h?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/expr.h (original)
+++ llvm-gcc-4.2/trunk/gcc/expr.h Wed Aug 29 02:01:18 2007
@@ -750,6 +750,14 @@
 
 /* Call this to initialize an optab function entry.  */
 extern rtx init_one_libfunc (const char *);
+/* LLVM LOCAL begin */
+/* Call this to initialize an optab function tree.  */
+#ifdef ENABLE_LLVM
+extern tree llvm_init_one_libfunc (const char *);
+#else
+#define llvm_init_one_libfunc	init_one_libfunc
+#endif
+/* LLVM LOCAL end */
 
 extern int vector_mode_valid_p (enum machine_mode);
 

Modified: llvm-gcc-4.2/trunk/gcc/java/decl.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/java/decl.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/java/decl.c (original)
+++ llvm-gcc-4.2/trunk/gcc/java/decl.c Wed Aug 29 02:01:18 2007
@@ -1131,9 +1131,12 @@
 			0, NOT_BUILT_IN, NULL, NULL_TREE);
 
   /* Initialize variables for except.c.  */
-  eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
-                                             ? "__gcj_personality_sj0"
-                                             : "__gcj_personality_v0");
+  /* LLVM local begin */
+  llvm_eh_personality_libfunc
+    = llvm_init_one_libfunc (USING_SJLJ_EXCEPTIONS
+                             ? "__gcj_personality_sj0"
+                             : "__gcj_personality_v0");
+  /* LLVM local end */
   default_init_unwind_resume_libfunc ();
 
   lang_eh_runtime_type = do_nothing;

Modified: llvm-gcc-4.2/trunk/gcc/libfuncs.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/libfuncs.h?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/libfuncs.h (original)
+++ llvm-gcc-4.2/trunk/gcc/libfuncs.h Wed Aug 29 02:01:18 2007
@@ -20,6 +20,8 @@
 
 #ifndef GCC_LIBFUNCS_H
 #define GCC_LIBFUNCS_H
+/* LOCAL LLVM */
+#include "tree.h"
 
 /* Enumeration of indexes into libfunc_table.  */
 enum libfunc_index
@@ -49,6 +51,13 @@
 /* SYMBOL_REF rtx's for the library functions that are called
    implicitly and not via optabs.  */
 extern GTY(()) rtx libfunc_table[LTI_MAX];
+/* LLVM LOCAL begin */
+#ifdef ENABLE_LLVM
+/* FUNCTION_DECL nodes for the library functions that are called
+   implicitly and not via optabs.  */
+extern GTY(()) tree llvm_libfunc_table[LTI_MAX];
+#endif
+/* LLVM LOCAL end */
 
 /* Accessor macros for libfunc_table.  */
 
@@ -66,6 +75,15 @@
 #define unwind_sjlj_register_libfunc (libfunc_table[LTI_unwind_sjlj_register])
 #define unwind_sjlj_unregister_libfunc \
   (libfunc_table[LTI_unwind_sjlj_unregister])
+/* LLVM LOCAL begin */
+#ifdef ENABLE_LLVM
+#define llvm_unwind_resume_libfunc	(llvm_libfunc_table[LTI_unwind_resume])
+#define llvm_eh_personality_libfunc	(llvm_libfunc_table[LTI_eh_personality])
+#else
+#define llvm_unwind_resume_libfunc	unwind_resume_libfunc
+#define llvm_eh_personality_libfunc	eh_personality_libfunc
+#endif
+/* LLVM LOCAL end */
 
 #define profile_function_entry_libfunc	(libfunc_table[LTI_profile_function_entry])
 #define profile_function_exit_libfunc	(libfunc_table[LTI_profile_function_exit])

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed Aug 29 02:01:18 2007
@@ -62,6 +62,7 @@
 #include "hard-reg-set.h"
 #include "except.h"
 #include "rtl.h"
+#include "libfuncs.h"
 #include "tree-flow.h"
 extern bool tree_could_throw_p(tree);  // tree-flow.h uses non-C++ C constructs.
 extern int get_pointer_alignment (tree exp, unsigned int max_align);
@@ -368,7 +369,7 @@
   FuncEHException = 0;
   FuncEHSelector = 0;
   FuncEHGetTypeID = 0;
-  FuncCPPPersonality = 0;
+  FuncEHPersonality = 0;
   FuncUnwindResume = 0;
 
   NumAddressTakenBlocks = 0;
@@ -1744,17 +1745,13 @@
   FuncEHGetTypeID = Intrinsic::getDeclaration(TheModule,
                                               Intrinsic::eh_typeid_for);
 
-  FuncCPPPersonality =
-    TheModule->getOrInsertFunction("__gxx_personality_v0",
-                                   Type::getPrimitiveType(Type::VoidTyID),
-                                   NULL);
-
-  FuncUnwindResume =
-    TheModule->getOrInsertFunction("_Unwind_Resume",
-                                   Type::getPrimitiveType(Type::VoidTyID),
-                                   PointerType::get(Type::Int8Ty),
-                                   NULL);
-
+  assert(llvm_eh_personality_libfunc
+         && "no exception handling personality function!");
+  FuncEHPersonality = DECL_LLVM(llvm_eh_personality_libfunc);
+
+  assert(llvm_unwind_resume_libfunc
+         && "no unwind resume function!");
+  FuncUnwindResume = DECL_LLVM(llvm_unwind_resume_libfunc);
 }
 
 /// getPostPad - Return the post landing pad for the given exception handling
@@ -1798,7 +1795,7 @@
 
     // The exception and the personality function.
     Args.push_back(Builder.CreateLoad(ExceptionValue, "eh_ptr"));
-    Args.push_back(CastToType(Instruction::BitCast, FuncCPPPersonality,
+    Args.push_back(CastToType(Instruction::BitCast, FuncEHPersonality,
                               PointerType::get(Type::Int8Ty)));
 
     // Add selections for each handler.

Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Wed Aug 29 02:01:18 2007
@@ -287,8 +287,8 @@
   /// FuncEHGetTypeID - Function used to return type id for give typeinfo.
   Function *FuncEHGetTypeID;
 
-  /// FuncCPPPersonality - Function handling c++ personality.
-  Value *FuncCPPPersonality;
+  /// FuncEHPersonality - Function providing the exception handling personality.
+  Value *FuncEHPersonality;
 
   /// FuncUnwindResume - Function used to continue exception unwinding.
   Value *FuncUnwindResume;

Modified: llvm-gcc-4.2/trunk/gcc/objc/objc-act.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/objc/objc-act.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original)
+++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Wed Aug 29 02:01:18 2007
@@ -7555,8 +7555,10 @@
 #endif
       /* APPPLE LOCAL radar 5023725 */
       OBJC_FLAG_ZEROCOST_EXCEPTIONS; 
-      eh_personality_libfunc
-        = init_one_libfunc ("__objc_personality_v0");
+      /* LLVM local begin */
+      llvm_eh_personality_libfunc
+        = llvm_init_one_libfunc ("__objc_personality_v0");
+      /* LLVM local end */
       default_init_unwind_resume_libfunc ();
       using_eh_for_cleanups ();
       lang_eh_runtime_type = objc2_eh_runtime_type;
@@ -7568,10 +7570,12 @@
   else
     {
       c_eh_initialized_p = true;
-      eh_personality_libfunc
-	= init_one_libfunc (USING_SJLJ_EXCEPTIONS
-			    ? "__gnu_objc_personality_sj0"
-			    : "__gnu_objc_personality_v0");
+      /* LLVM local begin */
+      llvm_eh_personality_libfunc
+	= llvm_init_one_libfunc (USING_SJLJ_EXCEPTIONS
+                                 ? "__gnu_objc_personality_sj0"
+                                 : "__gnu_objc_personality_v0");
+      /* LLVM local end */
       default_init_unwind_resume_libfunc ();
       using_eh_for_cleanups ();
       lang_eh_runtime_type = objc_eh_runtime_type;

Modified: llvm-gcc-4.2/trunk/gcc/optabs.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/optabs.c?rev=41561&r1=41560&r2=41561&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/optabs.c (original)
+++ llvm-gcc-4.2/trunk/gcc/optabs.c Wed Aug 29 02:01:18 2007
@@ -58,6 +58,8 @@
 optab optab_table[OTI_MAX];
 
 rtx libfunc_table[LTI_MAX];
+/* LLVM LOCAL */
+tree llvm_libfunc_table[LTI_MAX];
 
 /* Tables of patterns for converting one mode to another.  */
 convert_optab convert_optab_table[COI_MAX];
@@ -5133,29 +5135,42 @@
 }
 
 
-rtx
-init_one_libfunc (const char *name)
+/* LLVM local begin */
+tree
+llvm_init_one_libfunc (const char *name)
 {
-  rtx symbol;
-  
   /* Create a FUNCTION_DECL that can be passed to
      targetm.encode_section_info.  */
   /* ??? We don't have any type information except for this is
      a function.  Pretend this is "int foo()".  */
   tree decl;
 
-  /* LLVM LOCAL begin */
-#ifdef ENABLE_LLVM
-  return NULL_RTX;
-#endif
   decl = build_decl (FUNCTION_DECL, get_identifier (name),
                      build_function_type (integer_type_node, NULL_TREE));
-  /* LLVM LOCAL end */
 
   DECL_ARTIFICIAL (decl) = 1;
   DECL_EXTERNAL (decl) = 1;
   TREE_PUBLIC (decl) = 1;
 
+  return decl;
+}
+
+/* LLVM local end */
+rtx
+init_one_libfunc (const char *name)
+{
+  rtx symbol;
+
+  /* LLVM local begin */
+  tree decl;
+
+#ifdef ENABLE_LLVM
+  return NULL_RTX;
+#endif
+
+  decl = llvm_init_one_libfunc (name);
+  /* LLVM local end */
+
   symbol = XEXP (DECL_RTL (decl), 0);
 
   /* Zap the nonsensical SYMBOL_REF_DECL for this.  What we're left with





More information about the llvm-commits mailing list