mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
[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
This commit is contained in:
parent
bce9d857cc
commit
2e31412faa
@ -401,6 +401,20 @@ intrinsic serves as a placeholder to delimit code before a catch handler is
|
|||||||
outlined. After the handler is outlined, this intrinsic is simply removed.
|
outlined. After the handler is outlined, this intrinsic is simply removed.
|
||||||
|
|
||||||
|
|
||||||
|
.. _llvm.eh.exceptionpointer:
|
||||||
|
|
||||||
|
``llvm.eh.exceptionpointer``
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
.. code-block:: llvm
|
||||||
|
|
||||||
|
i8 addrspace(N)* @llvm.eh.padparam.pNi8(token %catchpad)
|
||||||
|
|
||||||
|
|
||||||
|
This intrinsic retrieves a pointer to the exception caught by the given
|
||||||
|
``catchpad``.
|
||||||
|
|
||||||
|
|
||||||
SJLJ Intrinsics
|
SJLJ Intrinsics
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
@ -49,9 +49,9 @@ function and then be turned into an instruction if warranted.
|
|||||||
|
|
||||||
Add an entry for your intrinsic. Describe its memory access characteristics
|
Add an entry for your intrinsic. Describe its memory access characteristics
|
||||||
for optimization (this controls whether it will be DCE'd, CSE'd, etc). Note
|
for optimization (this controls whether it will be DCE'd, CSE'd, etc). Note
|
||||||
that any intrinsic using the ``llvm_int_ty`` type for an argument will
|
that any intrinsic using one of the ``llvm_any*_ty`` types for an argument or
|
||||||
be deemed by ``tblgen`` as overloaded and the corresponding suffix will
|
return type will be deemed by ``tblgen`` as overloaded and the corresponding
|
||||||
be required on the intrinsic's name.
|
suffix will be required on the intrinsic's name.
|
||||||
|
|
||||||
#. ``llvm/lib/Analysis/ConstantFolding.cpp``:
|
#. ``llvm/lib/Analysis/ConstantFolding.cpp``:
|
||||||
|
|
||||||
|
@ -436,6 +436,11 @@ def int_eh_begincatch : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
|
|||||||
[NoCapture<0>, NoCapture<1>]>;
|
[NoCapture<0>, NoCapture<1>]>;
|
||||||
def int_eh_endcatch : Intrinsic<[], []>;
|
def int_eh_endcatch : Intrinsic<[], []>;
|
||||||
|
|
||||||
|
// eh.exceptionpointer returns the pointer to the exception caught by
|
||||||
|
// the given `catchpad`.
|
||||||
|
def int_eh_exceptionpointer : Intrinsic<[llvm_anyptr_ty], [llvm_token_ty],
|
||||||
|
[IntrNoMem]>;
|
||||||
|
|
||||||
// Represents the list of actions to take when an exception is thrown.
|
// Represents the list of actions to take when an exception is thrown.
|
||||||
def int_eh_actions : Intrinsic<[llvm_ptr_ty], [llvm_vararg_ty], []>;
|
def int_eh_actions : Intrinsic<[llvm_ptr_ty], [llvm_vararg_ty], []>;
|
||||||
|
|
||||||
|
@ -3681,6 +3681,11 @@ void Verifier::visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS) {
|
|||||||
"gc.relocate: relocating a pointer shouldn't change its address space", CS);
|
"gc.relocate: relocating a pointer shouldn't change its address space", CS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Intrinsic::eh_exceptionpointer: {
|
||||||
|
Assert(isa<CatchPadInst>(CS.getArgOperand(0)),
|
||||||
|
"eh.exceptionpointer argument must be a catchpad", CS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
26
test/CodeGen/WinEH/wineh-intrinsics-invalid.ll
Normal file
26
test/CodeGen/WinEH/wineh-intrinsics-invalid.ll
Normal file
@ -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(...)
|
46
test/CodeGen/WinEH/wineh-intrinsics.ll
Normal file
46
test/CodeGen/WinEH/wineh-intrinsics.ll
Normal file
@ -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(...)
|
Loading…
Reference in New Issue
Block a user