summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-05-16 01:24:12 +0000
committerDouglas Gregor <dgregor@apple.com>2010-05-16 01:24:12 +0000
commit51150ab1f13a9272d06e96f45ca2f10697b4b364 (patch)
tree1b397129500a8178930cf7fecfb591aa3ea7caef /clang/test
parentb8829825f1c62a53c8f4b7d2e71658a549d77744 (diff)
downloadbcm5719-llvm-51150ab1f13a9272d06e96f45ca2f10697b4b364.tar.gz
bcm5719-llvm-51150ab1f13a9272d06e96f45ca2f10697b4b364.zip
When initializing thread-safe statics, put the call to
__cxa_guard_abort along the exceptional edge into (in effect) a nested "try" that rethrows after aborting. Fixes PR7144 and the remaining Boost.ProgramOptions failures, along with the regressions that r103880 caused. The crucial difference between this and r103880 is that we now follow LLVM's little dance with the llvm.eh.exception and llvm.eh.selector calls, then use _Unwind_Resume_or_Rethrow to rethrow. llvm-svn: 103892
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/threadsafe-statics-exceptions.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/threadsafe-statics-exceptions.cpp b/clang/test/CodeGenCXX/threadsafe-statics-exceptions.cpp
new file mode 100644
index 00000000000..9347cc9616a
--- /dev/null
+++ b/clang/test/CodeGenCXX/threadsafe-statics-exceptions.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -emit-llvm -o - -fexceptions -triple x86_64-apple-darwin10 %s | FileCheck %s
+
+struct X {
+ X();
+ ~X();
+};
+
+struct Y { };
+
+// CHECK: define void @_Z1fv
+void f() {
+ // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZ1fvE1x)
+ // CHECK: invoke void @_ZN1XC1Ev
+ // CHECK: call void @__cxa_guard_release(i64* @_ZGVZ1fvE1x)
+ // CHECK: call i32 @__cxa_atexit
+ // CHECK: br
+ static X x;
+ // CHECK: call i8* @llvm.eh.exception()
+ // CHECK: call i32 (i8*, i8*, ...)* @llvm.eh.selector
+ // CHECK: call void @__cxa_guard_abort(i64* @_ZGVZ1fvE1x)
+ // CHECK: call void @_Unwind_Resume_or_Rethrow
+ // CHECK: unreachable
+
+ // CHECK: call i8* @__cxa_allocate_exception
+ throw Y();
+}
OpenPOWER on IntegriCloud