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 _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits