aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-04-16 09:04:28 +0000
committerBill Wendling <isanbard@gmail.com>2010-04-16 09:04:28 +0000
commitfef4c69728cdc098339a42e212bf0e69c545935f (patch)
tree20db5eeeefe5271e1608e6c4e2170c2e9d20b91b
parent47639fc5be0b8f4873d076a9ed24b9a3c0682b15 (diff)
downloadexternal_llvm-fef4c69728cdc098339a42e212bf0e69c545935f.tar.gz
external_llvm-fef4c69728cdc098339a42e212bf0e69c545935f.tar.bz2
external_llvm-fef4c69728cdc098339a42e212bf0e69c545935f.zip
Add JIT exception handling test.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101455 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/ExecutionEngine/eh.ll41
1 files changed, 41 insertions, 0 deletions
diff --git a/test/ExecutionEngine/eh.ll b/test/ExecutionEngine/eh.ll
new file mode 100644
index 0000000000..7e82f145fe
--- /dev/null
+++ b/test/ExecutionEngine/eh.ll
@@ -0,0 +1,41 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: lli -enable-eh %t.bc > /dev/null
+
+%struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo }
+%struct.__type_info_pseudo = type { i8*, i8* }
+
+@_ZTIi = external constant %struct.__fundamental_type_info_pseudo ; <%struct.__fundamental_type_info_pseudo*> [#uses=1]
+@.llvm.eh.catch.all.value = linkonce constant i8* null, section "llvm.metadata" ; <i8**> [#uses=1]
+
+define i32 @main() optsize ssp {
+entry:
+ %0 = tail call i8* @__cxa_allocate_exception(i64 4) nounwind ; <i8*> [#uses=2]
+ %1 = bitcast i8* %0 to i32* ; <i32*> [#uses=1]
+ store i32 1, i32* %1, align 4
+ invoke void @__cxa_throw(i8* %0, i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIi to i8*), void (i8*)* null) noreturn
+ to label %invcont unwind label %lpad
+
+invcont: ; preds = %entry
+ unreachable
+
+lpad: ; preds = %entry
+ %eh_ptr = tail call i8* @llvm.eh.exception() ; <i8*> [#uses=2]
+ %eh_select = tail call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %eh_ptr, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8** @.llvm.eh.catch.all.value) ; <i32> [#uses=0]
+ %2 = tail call i8* @__cxa_begin_catch(i8* %eh_ptr) nounwind ; <i8*> [#uses=0]
+ tail call void @__cxa_end_catch()
+ ret i32 0
+}
+
+declare i8* @__cxa_allocate_exception(i64) nounwind
+
+declare void @__cxa_throw(i8*, i8*, void (i8*)*) noreturn
+
+declare i8* @__cxa_begin_catch(i8*) nounwind
+
+declare i8* @llvm.eh.exception() nounwind readonly
+
+declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind
+
+declare void @__cxa_end_catch()
+
+declare i32 @__gxx_personality_v0(...)