summaryrefslogtreecommitdiff
path: root/test/backtrace_test.pass.cpp
diff options
context:
space:
mode:
authorJonathan Roelofs <jonathan@codesourcery.com>2015-01-21 19:05:37 +0000
committerJonathan Roelofs <jonathan@codesourcery.com>2015-01-21 19:05:37 +0000
commitc0b48088747387dd36c652afc37f854d5bba3c24 (patch)
tree5c0783510e3ca981653e737a027259cc8c806097 /test/backtrace_test.pass.cpp
parentd2a72c45bb125271df1e68aa66bdf6bc77a2ce96 (diff)
Rename all of the tests in preparation for merging lit configs with libcxx
http://reviews.llvm.org/D7101 git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@226691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/backtrace_test.pass.cpp')
-rw-r--r--test/backtrace_test.pass.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/test/backtrace_test.pass.cpp b/test/backtrace_test.pass.cpp
new file mode 100644
index 0000000..f54a478
--- /dev/null
+++ b/test/backtrace_test.pass.cpp
@@ -0,0 +1,63 @@
+//===---------------------- backtrace_test.cpp ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// XFAIL: arm
+#include <assert.h>
+#include <stddef.h>
+#include <unwind.h>
+
+extern "C" _Unwind_Reason_Code
+trace_function(struct _Unwind_Context* context, void* ntraced) {
+ (*reinterpret_cast<size_t*>(ntraced))++;
+ // We should never have a call stack this deep...
+ assert(*reinterpret_cast<size_t*>(ntraced) < 20);
+ return _URC_NO_REASON;
+}
+
+void call3_throw(size_t* ntraced) {
+ try {
+ _Unwind_Backtrace(trace_function, ntraced);
+ } catch (...) {
+ assert(false);
+ }
+}
+
+void call3_nothrow(size_t* ntraced) {
+ _Unwind_Backtrace(trace_function, ntraced);
+}
+
+void call2(size_t* ntraced, bool do_throw) {
+ if (do_throw) {
+ call3_throw(ntraced);
+ } else {
+ call3_nothrow(ntraced);
+ }
+}
+
+void call1(size_t* ntraced, bool do_throw) {
+ call2(ntraced, do_throw);
+}
+
+int main() {
+ size_t throw_ntraced = 0;
+ size_t nothrow_ntraced = 0;
+
+ call1(&nothrow_ntraced, false);
+
+ try {
+ call1(&throw_ntraced, true);
+ } catch (...) {
+ assert(false);
+ }
+
+ // Different platforms (and different runtimes) will unwind a different number
+ // of times, so we can't make any better assumptions than this.
+ assert(nothrow_ntraced > 1);
+ assert(throw_ntraced == nothrow_ntraced); // Make sure we unwind through catch
+ return 0;
+}