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 */
 }