diff options
| author | Joseph Tremoulet <jotrem@microsoft.com> | 2015-09-03 09:15:32 +0000 |
|---|---|---|
| committer | Joseph Tremoulet <jotrem@microsoft.com> | 2015-09-03 09:15:32 +0000 |
| commit | 61efbc32a6b15baa856a89c62de5cb2100a9f866 (patch) | |
| tree | 655a9447a2c17c6912a3ec525808ce80beaff3ba /llvm/test/CodeGen | |
| parent | 9ce71f76b9497d3b50bc267b2ba9a92de48f13e2 (diff) | |
| download | bcm5719-llvm-61efbc32a6b15baa856a89c62de5cb2100a9f866.tar.gz bcm5719-llvm-61efbc32a6b15baa856a89c62de5cb2100a9f866.zip | |
[WinEH] Add llvm.eh.exceptionpointer intrinsic
Summary:
This intrinsic can be used to extract a pointer to the exception caught by
a given catchpad. Its argument has token type and must be a `catchpad`.
Also clarify ExtendingLLVM documentation regarding overloaded intrinsics.
Reviewers: majnemer, andrew.w.kaylor, sanjoy, rnk
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D12533
llvm-svn: 246752
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-intrinsics-invalid.ll | 26 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-intrinsics.ll | 46 |
2 files changed, 72 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WinEH/wineh-intrinsics-invalid.ll b/llvm/test/CodeGen/WinEH/wineh-intrinsics-invalid.ll new file mode 100644 index 00000000000..17d6e70ad1e --- /dev/null +++ b/llvm/test/CodeGen/WinEH/wineh-intrinsics-invalid.ll @@ -0,0 +1,26 @@ +; RUN: sed -e s/.T1:// %s | not opt -lint -disable-output 2>&1 | FileCheck --check-prefix=CHECK1 %s +; RUN: sed -e s/.T2:// %s | not opt -lint -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s + +target triple = "x86_64-pc-windows-msvc" + +declare void @f() + +;T1: declare i8* @llvm.eh.exceptionpointer.p0i8(i32) +;T1: +;T1: define void @test1() personality i32 (...)* @__CxxFrameHandler3 { +;T1: call i8* @llvm.eh.exceptionpointer.p0i8(i32 0) +;T1: ret void +;T1: } +;CHECK1: Intrinsic has incorrect argument type! +;CHECK1-NEXT: i8* (i32)* @llvm.eh.exceptionpointer.p0i8 + +;T2: declare i8* @llvm.eh.exceptionpointer.p0i8(token) +;T2: +;T2: define void @test2() personality i32 (...)* @__CxxFrameHandler3 { +;T2: call i8* @llvm.eh.exceptionpointer.p0i8(token undef) +;T2: ret void +;T2: } +;CHECK2: eh.exceptionpointer argument must be a catchpad +;CHECK2-NEXT: call i8* @llvm.eh.exceptionpointer.p0i8(token undef) + +declare i32 @__CxxFrameHandler3(...) diff --git a/llvm/test/CodeGen/WinEH/wineh-intrinsics.ll b/llvm/test/CodeGen/WinEH/wineh-intrinsics.ll new file mode 100644 index 00000000000..acdeb796ac1 --- /dev/null +++ b/llvm/test/CodeGen/WinEH/wineh-intrinsics.ll @@ -0,0 +1,46 @@ +; RUN: opt -lint -disable-output < %s + +; This test is meant to prove that the verifier does not report errors for correct +; use of the llvm.eh.exceptionpointer intrinsic. + +target triple = "x86_64-pc-windows-msvc" + +declare i8* @llvm.eh.exceptionpointer.p0i8(token) +declare i8 addrspace(1)* @llvm.eh.exceptionpointer.p1i8(token) + +declare void @f(...) + +define void @test1() personality i32 (...)* @__CxxFrameHandler3 { +entry: + invoke void (...) @f(i32 1) + to label %exit unwind label %catchpad +catchpad: + %catch = catchpad [i32 1] to label %do_catch unwind label %catchend +do_catch: + %exn = call i8* @llvm.eh.exceptionpointer.p0i8(token %catch) + call void (...) @f(i8* %exn) + catchret %catch to label %exit +catchend: + catchendpad unwind to caller +exit: + ret void +} + +define void @test2() personality i32 (...)* @ProcessManagedException { +entry: + invoke void (...) @f(i32 1) + to label %exit unwind label %catchpad +catchpad: + %catch = catchpad [i32 1] to label %do_catch unwind label %catchend +do_catch: + %exn = call i8 addrspace(1)* @llvm.eh.exceptionpointer.p1i8(token %catch) + call void (...) @f(i8 addrspace(1)* %exn) + catchret %catch to label %exit +catchend: + catchendpad unwind to caller +exit: + ret void +} + +declare i32 @__CxxFrameHandler3(...) +declare i32 @ProcessManagedException(...) |

