Index: include/llvm-c/Core.h =================================================================== --- include/llvm-c/Core.h +++ include/llvm-c/Core.h @@ -1521,6 +1521,11 @@ LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty); /** + * Obtain the constant token "none", used in SEH instructions. + */ +LLVMValueRef LLVMConstTokenNone(void); + +/** * @defgroup LLVMCCoreValueConstantScalar Scalar constants * * Functions in this group model LLVMValueRef instances that correspond @@ -2908,9 +2913,27 @@ LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, const char *Name); +LLVMValueRef LLVMBuildInvokeInPad(LLVMBuilderRef B, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, + LLVMValueRef Pad, const char *Name); LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef PersFn, unsigned NumClauses, const char *Name); +LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef ParentPad, + LLVMBasicBlockRef UnwindBB, unsigned NumHandlers, + const char *Name); +void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef HandlerVal); +LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad, + LLVMValueRef *Args, unsigned NumArgs, + const char *Name); +LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, LLVMValueRef ParentPad, + LLVMValueRef *Args, unsigned NumArgs, + const char *Name); +LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad, + LLVMBasicBlockRef BB); +LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CleanupPad, + LLVMBasicBlockRef UnwindBB); LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn); LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef); @@ -3083,6 +3106,9 @@ LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, const char *Name); +LLVMValueRef LLVMBuildCallInPad(LLVMBuilderRef B, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMValueRef Pad, const char *Name); LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If, LLVMValueRef Then, LLVMValueRef Else, const char *Name); Index: lib/IR/Core.cpp =================================================================== --- lib/IR/Core.cpp +++ lib/IR/Core.cpp @@ -814,6 +814,10 @@ return wrap(ConstantPointerNull::get(unwrap(Ty))); } +LLVMValueRef LLVMConstTokenNone(void) { + return wrap(ConstantTokenNone::get(*unwrap(LLVMGetGlobalContext()))); +} + /*--.. Operations on metadata nodes ........................................--*/ LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str, @@ -2513,6 +2517,17 @@ Name)); } +LLVMValueRef LLVMBuildInvokeInPad(LLVMBuilderRef B, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, + LLVMValueRef Pad, const char *Name) { + SmallVector BundleList; + BundleList.emplace_back("funclet", unwrap(Pad)); + return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch), + makeArrayRef(unwrap(Args), NumArgs), + BundleList, Name)); +} + LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef PersFn, unsigned NumClauses, const char *Name) { @@ -2529,6 +2544,50 @@ return wrap(unwrap(B)->CreateResume(unwrap(Exn))); } +LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, + LLVMValueRef ParentPad, + LLVMBasicBlockRef UnwindBB, + unsigned NumHandlers, + const char *Name) { + return wrap(unwrap(B)->CreateCatchSwitch(unwrap(ParentPad), unwrap(UnwindBB), + NumHandlers, Name)); +} + +void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef handler) { + unwrap(CatchSwitch)->addHandler(unwrap(handler)); +} + +LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, + LLVMValueRef ParentPad, + LLVMValueRef *Args, + unsigned NumArgs, + const char *Name) { + ArrayRef ArgList(unwrap(Args), NumArgs); + return wrap(unwrap(B)->CreateCatchPad(unwrap(ParentPad), ArgList, Name)); +} + +LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, + LLVMValueRef ParentPad, + LLVMValueRef *Args, + unsigned NumArgs, + const char *Name) { + ArrayRef ArgList(unwrap(Args), NumArgs); + return wrap(unwrap(B)->CreateCleanupPad(unwrap(ParentPad), ArgList, Name)); +} + +LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, + LLVMValueRef CatchPad, + LLVMBasicBlockRef BB) { + return wrap(unwrap(B)->CreateCatchRet(unwrap(CatchPad), unwrap(BB))); +} + +LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, + LLVMValueRef CleanupPad, + LLVMBasicBlockRef UnwindBB) { + return wrap(unwrap(B)->CreateCleanupRet(unwrap(CleanupPad), unwrap(UnwindBB))); +} + + LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) { return wrap(unwrap(B)->CreateUnreachable()); } @@ -3013,6 +3072,17 @@ Name)); } +LLVMValueRef LLVMBuildCallInPad(LLVMBuilderRef B, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMValueRef Pad, const char *Name) { + SmallVector BundleList; + BundleList.emplace_back("funclet", unwrap(Pad)); + return wrap(unwrap(B)->CreateCall(unwrap(Fn), + makeArrayRef(unwrap(Args), NumArgs), + BundleList, + Name)); +} + LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If, LLVMValueRef Then, LLVMValueRef Else, const char *Name) {