Index: docs/ExceptionHandling.rst =================================================================== --- docs/ExceptionHandling.rst +++ docs/ExceptionHandling.rst @@ -401,6 +401,26 @@ outlined. After the handler is outlined, this intrinsic is simply removed. +.. _llvm.eh.padparam: + +``llvm.eh.padparam`` +---------------------- + +.. code-block:: llvm + + retTy @llvm.eh.padparam.retTy(token %pad, ...) + + +This intrinsic retrieves the value of a parameter of a ``catchpad`` or +``cleanuppad``. Such parameters are typically supplied by the runtime upon +entry to the EH pad. The ``padparam`` intrinsic takes one fixed argument, +which is the ``catchpad`` or ``cleanuppad`` whose parameter is extracted. +Any number of selector arguments (determined by the personality routine) may +follow. The result type is also determined by the personality routine. +Examples of EH pad parameters include exception codes and pointers to caught +exception objects. + + SJLJ Intrinsics --------------- Index: docs/ExtendingLLVM.rst =================================================================== --- docs/ExtendingLLVM.rst +++ docs/ExtendingLLVM.rst @@ -49,9 +49,9 @@ 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 - that any intrinsic using the ``llvm_int_ty`` type for an argument will - be deemed by ``tblgen`` as overloaded and the corresponding suffix will - be required on the intrinsic's name. + that any intrinsic using one of the ``llvm_any*_ty`` types for an argument or + return type will be deemed by ``tblgen`` as overloaded and the corresponding + suffix will be required on the intrinsic's name. #. ``llvm/lib/Analysis/ConstantFolding.cpp``: Index: include/llvm/IR/Intrinsics.td =================================================================== --- include/llvm/IR/Intrinsics.td +++ include/llvm/IR/Intrinsics.td @@ -436,6 +436,11 @@ [NoCapture<0>, NoCapture<1>]>; def int_eh_endcatch : Intrinsic<[], []>; +// eh.padparam takes a token catchpad/cleanuppad, plus personality-specific +// arguments, and produces a value of personality-specific type +def int_eh_padparam : Intrinsic<[llvm_any_ty], [llvm_token_ty, llvm_vararg_ty], + [IntrReadWriteArgMem]>; + // Represents the list of actions to take when an exception is thrown. def int_eh_actions : Intrinsic<[llvm_ptr_ty], [llvm_vararg_ty], []>; Index: test/CodeGen/WinEH/wineh-intrinsics.ll =================================================================== --- /dev/null +++ test/CodeGen/WinEH/wineh-intrinsics.ll @@ -0,0 +1,37 @@ +; 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.padparam intrinsic. + +target triple = "x86_64-pc-windows-msvc" + +declare i8 addrspace(1)* @llvm.eh.padparam.p1i8(token, ...) +declare i32 @llvm.eh.padparam.i32(token, ...) + +declare void @f(...) + +define void @test1() personality i32 (...)* @__CxxFrameHandler3 { +entry: + invoke void (...) @f(i32 1) + to label %after_catch unwind label %catchpad +catchpad: + %catch = catchpad [i32 1] to label %do_catch unwind label %catchend +do_catch: + %exn = call i8 addrspace(1)* (token, ...) @llvm.eh.padparam.p1i8(token %catch, i32 1) + call void (...) @f(i8 addrspace(1)* %exn) + catchret %catch to label %after_catch +catchend: + catchendpad unwind to caller +after_catch: + invoke void (...) @f(i32 1) + to label %exit unwind label %cleanuppad +cleanuppad: + %cleanup = cleanuppad [] + %state = call i32 (token, ...) @llvm.eh.padparam.i32(token %cleanup, i8 2) + call void (...) @f(i32 %state) + cleanupret %cleanup unwind to caller +exit: + ret void +} + +declare i32 @__CxxFrameHandler3(...)