[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