]> granicus.if.org Git - clang/commitdiff
ARM EH uses a different personality function in C.
authorJohn McCall <rjmccall@apple.com>
Sun, 7 Nov 2010 02:35:25 +0000 (02:35 +0000)
committerJohn McCall <rjmccall@apple.com>
Sun, 7 Nov 2010 02:35:25 +0000 (02:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118366 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGException.cpp
lib/CodeGen/CGException.h
test/CodeGen/exceptions.c [new file with mode: 0644]

index cb7bad25756ac591b51a19dc8eabdd2439928d34..22ce184eb5de129a41da61da8b0ddda388570bc4 100644 (file)
@@ -300,6 +300,7 @@ static llvm::Constant *getCatchallRethrowFn(CodeGenFunction &CGF,
 }
 
 const EHPersonality EHPersonality::GNU_C("__gcc_personality_v0");
+const EHPersonality EHPersonality::GNU_C_SJLJ("__gcc_personality_sj0");
 const EHPersonality EHPersonality::NeXT_ObjC("__objc_personality_v0");
 const EHPersonality EHPersonality::GNU_CPlusPlus("__gxx_personality_v0");
 const EHPersonality EHPersonality::GNU_CPlusPlus_SJLJ("__gxx_personality_sj0");
@@ -307,6 +308,8 @@ const EHPersonality EHPersonality::GNU_ObjC("__gnu_objc_personality_v0",
                                             "objc_exception_throw");
 
 static const EHPersonality &getCPersonality(const LangOptions &L) {
+  if (L.SjLjExceptions)
+    return EHPersonality::GNU_C_SJLJ;
   return EHPersonality::GNU_C;
 }
 
index 9c81a4e7a84de9743739406b9761e991380023e1..5e6f1511aec6adc8712a4e9e6dc719d08a9ca93b 100644 (file)
@@ -44,6 +44,7 @@ class EHPersonality {
 public:
   static const EHPersonality &get(const LangOptions &Lang);
   static const EHPersonality GNU_C;
+  static const EHPersonality GNU_C_SJLJ;
   static const EHPersonality GNU_ObjC;
   static const EHPersonality NeXT_ObjC;
   static const EHPersonality GNU_CPlusPlus;
diff --git a/test/CodeGen/exceptions.c b/test/CodeGen/exceptions.c
new file mode 100644 (file)
index 0000000..018b975
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fexceptions -fblocks | FileCheck %s
+// RUN: %clang_cc1 -triple armv7-apple-unknown -emit-llvm -o - %s -fexceptions -fsjlj-exceptions -fblocks | FileCheck %s -check-prefix=CHECK-ARM
+
+// rdar://problem/8621849
+void test1() {
+  extern void test1_helper(void (^)(int));
+
+  // CHECK:     define void @test1()
+  // CHECK-ARM: define arm_aapcscc void @test1()
+
+  __block int x = 10;
+
+  // CHECK:     invoke void @test1_helper(
+  // CHECK-ARM: invoke arm_aapcscc void @test1_helper(
+  test1_helper(^(int v) { x = v; });
+
+  // CHECK:     call {{.*}} @llvm.eh.selector({{.*}}, i8* bitcast (i32 (...)* @__gcc_personality_v0 to i8*)
+  // CHECK-ARM: call {{.*}} @llvm.eh.selector({{.*}}, i8* bitcast (i32 (...)* @__gcc_personality_sj0 to i8*)
+}