Make exceptions work on Darwin
llvm-svn: 45009
diff --git a/llvm-gcc-4.0/gcc/config/darwin.h b/llvm-gcc-4.0/gcc/config/darwin.h
index 46a4795..4ae9141 100644
--- a/llvm-gcc-4.0/gcc/config/darwin.h
+++ b/llvm-gcc-4.0/gcc/config/darwin.h
@@ -1748,6 +1748,10 @@
else if (!MACHO_DYNAMIC_NO_PIC_P) \
argvec.push_back ("--relocation-model=static")
#endif /* defined (TARGET_386) */
+
+/* On Darwin _Unwind_Resume is sensitive to the dynamic stack layout; we
+ use _Unwind_Resume_or_Rethrow instead. */
+#define LLVM_STACKSENSITIVE_UNWIND_RESUME 1
#endif
/* APPLE LOCAL end LLVM */
diff --git a/llvm-gcc-4.0/gcc/except.c b/llvm-gcc-4.0/gcc/except.c
index f7d3cff..65bea83 100644
--- a/llvm-gcc-4.0/gcc/except.c
+++ b/llvm-gcc-4.0/gcc/except.c
@@ -3510,9 +3510,13 @@
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");
+ unwind_resume_libfunc = init_one_libfunc ( USING_SJLJ_EXCEPTIONS ?
+ "_Unwind_SjLj_Resume"
+#ifdef LLVM_STACKSENSITIVE_UNWIND_RESUME
+ : "_Unwind_Resume_or_Rethrow");
+#else
+ : "_Unwind_Resume");
+#endif
}
/* APPLE LOCAL end LLVM */
diff --git a/llvm-gcc-4.0/gcc/llvm-convert.cpp b/llvm-gcc-4.0/gcc/llvm-convert.cpp
index 6472ad7..514fd35 100644
--- a/llvm-gcc-4.0/gcc/llvm-convert.cpp
+++ b/llvm-gcc-4.0/gcc/llvm-convert.cpp
@@ -2178,7 +2178,12 @@
NULL);
FuncUnwindResume =
- TheModule->getOrInsertFunction("_Unwind_Resume",
+ TheModule->getOrInsertFunction(
+#ifdef LLVM_STACKSENSITIVE_UNWIND_RESUME
+ "_Unwind_Resume_or_Rethrow",
+#else
+ "_Unwind_Resume",
+#endif
Type::getPrimitiveType(Type::VoidTyID),
PointerType::get(Type::Int8Ty),
NULL);
diff --git a/llvm-gcc-4.0/gcc/unwind-dw2.c b/llvm-gcc-4.0/gcc/unwind-dw2.c
index 4ffdd02..724e4e2 100644
--- a/llvm-gcc-4.0/gcc/unwind-dw2.c
+++ b/llvm-gcc-4.0/gcc/unwind-dw2.c
@@ -1318,7 +1318,14 @@
static inline _Unwind_Ptr
uw_identify_context (struct _Unwind_Context *context)
{
+/* LLVM LOCAL begin
+ This change is needed to match Apple's installed libgcc. */
+#ifdef LLVM_STACKSENSITIVE_UNWIND_RESUME
+ return _Unwind_GetCFA (context);
+#else
return _Unwind_GetIP (context);
+#endif
+/* LLVM LOCAL end */
}