[llvm] r328759 - [LLVM-C] Finish exception instruction bindings
Vlad Tsyrklevich via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 29 23:47:27 PDT 2018
I reverted this change in r328858.
On Thu, Mar 29, 2018 at 2:23 PM Vlad Tsyrklevich <vlad at tsyrklevich.net>
wrote:
> Hi, the http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap bot
> has been failing
> <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/4842/steps/check-llvm%20asan/logs/stdio>
> since this change was committed.
>
> On Wed, Mar 28, 2018 at 8:46 PM Robert Widmann via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: codafi
>> Date: Wed Mar 28 20:43:15 2018
>> New Revision: 328759
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=328759&view=rev
>> Log:
>> [LLVM-C] Finish exception instruction bindings
>>
>> Summary:
>> Add support for cleanupret, catchret, catchpad, cleanuppad and
>> catchswitch and their associated accessors.
>>
>> Test is modified from SimplifyCFG because it contains many diverse usages
>> of these instructions.
>>
>> Reviewers: whitequark, deadalnix, echristo
>>
>> Reviewed By: echristo
>>
>> Subscribers: llvm-commits, harlanhaskins
>>
>> Differential Revision: https://reviews.llvm.org/D44496
>>
>> Modified:
>> llvm/trunk/include/llvm-c/Core.h
>> llvm/trunk/lib/IR/Core.cpp
>> llvm/trunk/test/Bindings/llvm-c/echo.ll
>> llvm/trunk/tools/llvm-c-test/echo.cpp
>>
>> Modified: llvm/trunk/include/llvm-c/Core.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=328759&r1=328758&r2=328759&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Core.h (original)
>> +++ llvm/trunk/include/llvm-c/Core.h Wed Mar 28 20:43:15 2018
>> @@ -2555,11 +2555,12 @@ LLVMValueRef LLVMInstructionClone(LLVMVa
>> /**
>> * Obtain the argument count for a call instruction.
>> *
>> - * This expects an LLVMValueRef that corresponds to a llvm::CallInst or
>> - * llvm::InvokeInst.
>> + * This expects an LLVMValueRef that corresponds to a llvm::CallInst,
>> + * llvm::InvokeInst, or llvm:FuncletPadInst.
>> *
>> * @see llvm::CallInst::getNumArgOperands()
>> * @see llvm::InvokeInst::getNumArgOperands()
>> + * @see llvm::FuncletPadInst::getNumArgOperands()
>> */
>> unsigned LLVMGetNumArgOperands(LLVMValueRef Instr);
>>
>> @@ -2644,9 +2645,12 @@ LLVMBasicBlockRef LLVMGetNormalDest(LLVM
>> /**
>> * Return the unwind destination basic block.
>> *
>> - * This only works on llvm::InvokeInst instructions.
>> + * Works on llvm::InvokeInst, llvm::CleanupReturnInst, and
>> + * llvm::CatchSwitchInst instructions.
>> *
>> * @see llvm::InvokeInst::getUnwindDest()
>> + * @see llvm::CleanupReturnInst::getUnwindDest()
>> + * @see llvm::CatchSwitchInst::getUnwindDest()
>> */
>> LLVMBasicBlockRef LLVMGetUnwindDest(LLVMValueRef InvokeInst);
>>
>> @@ -2662,9 +2666,12 @@ void LLVMSetNormalDest(LLVMValueRef Invo
>> /**
>> * Set the unwind destination basic block.
>> *
>> - * This only works on llvm::InvokeInst instructions.
>> + * Works on llvm::InvokeInst, llvm::CleanupReturnInst, and
>> + * llvm::CatchSwitchInst instructions.
>> *
>> * @see llvm::InvokeInst::setUnwindDest()
>> + * @see llvm::CleanupReturnInst::setUnwindDest()
>> + * @see llvm::CatchSwitchInst::setUnwindDest()
>> */
>> void LLVMSetUnwindDest(LLVMValueRef InvokeInst, LLVMBasicBlockRef B);
>>
>> @@ -2893,11 +2900,26 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilder
>> LLVMValueRef *Args, unsigned NumArgs,
>> LLVMBasicBlockRef Then, LLVMBasicBlockRef
>> Catch,
>> const char *Name);
>> +LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
>> +
>> +/* Exception Handling */
>> +LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
>> LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
>> LLVMValueRef PersFn, unsigned
>> NumClauses,
>> const char *Name);
>> -LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
>> -LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
>> +LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
>> + LLVMBasicBlockRef BB);
>> +LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
>> + LLVMBasicBlockRef BB);
>> +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 LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef
>> ParentPad,
>> + LLVMBasicBlockRef UnwindBB,
>> + unsigned NumHandlers, const char
>> *Name);
>>
>> /* Add a case to the switch instruction */
>> void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
>> @@ -2921,6 +2943,51 @@ LLVMBool LLVMIsCleanup(LLVMValueRef Land
>> /* Set the 'cleanup' flag in the landingpad instruction */
>> void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val);
>>
>> +/* Add a destination to the catchswitch instruction */
>> +void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef Dest);
>> +
>> +/* Get the number of handlers on the catchswitch instruction */
>> +unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch);
>> +
>> +/**
>> + * Obtain the basic blocks acting as handlers for a catchswitch
>> instruction.
>> + *
>> + * The Handlers parameter should point to a pre-allocated array of
>> + * LLVMBasicBlockRefs at least LLVMGetNumHandlers() large. On return, the
>> + * first LLVMGetNumHandlers() entries in the array will be populated
>> + * with LLVMBasicBlockRef instances.
>> + *
>> + * @param CatchSwitch The catchswitch instruction to operate on.
>> + * @param Handlers Memory address of an array to be filled with basic
>> blocks.
>> + */
>> +void LLVMGetHandlers(LLVMValueRef CatchSwitch, LLVMBasicBlockRef
>> *Handlers);
>> +
>> +/* Funclets */
>> +
>> +/* Get the number of funcletpad arguments. */
>> +LLVMValueRef LLVMGetArgOperand(LLVMValueRef Funclet, unsigned i);
>> +
>> +/* Set a funcletpad argument at the given index. */
>> +void LLVMSetArgOperand(LLVMValueRef Funclet, unsigned i, LLVMValueRef
>> value);
>> +
>> +/**
>> + * Get the parent catchswitch instruction of a catchpad instruction.
>> + *
>> + * This only works on llvm::CatchPadInst instructions.
>> + *
>> + * @see llvm::CatchPadInst::getCatchSwitch()
>> + */
>> +LLVMValueRef LLVMGetParentCatchSwitch(LLVMValueRef CatchPad);
>> +
>> +/**
>> + * Set the parent catchswitch instruction of a catchpad instruction.
>> + *
>> + * This only works on llvm::CatchPadInst instructions.
>> + *
>> + * @see llvm::CatchPadInst::setCatchSwitch()
>> + */
>> +void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad, LLVMValueRef
>> CatchSwitch);
>> +
>> /* Arithmetic */
>> LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef
>> RHS,
>> const char *Name);
>>
>> Modified: llvm/trunk/lib/IR/Core.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=328759&r1=328758&r2=328759&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/Core.cpp (original)
>> +++ llvm/trunk/lib/IR/Core.cpp Wed Mar 28 20:43:15 2018
>> @@ -2196,12 +2196,15 @@ LLVMValueRef LLVMInstructionClone(LLVMVa
>> return nullptr;
>> }
>>
>> -/*--.. Call and invoke instructions
>> ........................................--*/
>> -
>> unsigned LLVMGetNumArgOperands(LLVMValueRef Instr) {
>> + if (FuncletPadInst *FPI = dyn_cast<FuncletPadInst>(unwrap(Instr))) {
>> + return FPI->getNumArgOperands();
>> + }
>> return CallSite(unwrap<Instruction>(Instr)).getNumArgOperands();
>> }
>>
>> +/*--.. Call and invoke instructions
>> ........................................--*/
>> +
>> unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
>> return CallSite(unwrap<Instruction>(Instr)).getCallingConv();
>> }
>> @@ -2284,6 +2287,11 @@ LLVMBasicBlockRef LLVMGetNormalDest(LLVM
>> }
>>
>> LLVMBasicBlockRef LLVMGetUnwindDest(LLVMValueRef Invoke) {
>> + if (CleanupReturnInst *CRI =
>> dyn_cast<CleanupReturnInst>(unwrap(Invoke))) {
>> + return wrap(CRI->getUnwindDest());
>> + } else if (CatchSwitchInst *CSI =
>> dyn_cast<CatchSwitchInst>(unwrap(Invoke))) {
>> + return wrap(CSI->getUnwindDest());
>> + }
>> return wrap(unwrap<InvokeInst>(Invoke)->getUnwindDest());
>> }
>>
>> @@ -2292,6 +2300,11 @@ void LLVMSetNormalDest(LLVMValueRef Invo
>> }
>>
>> void LLVMSetUnwindDest(LLVMValueRef Invoke, LLVMBasicBlockRef B) {
>> + if (CleanupReturnInst *CRI =
>> dyn_cast<CleanupReturnInst>(unwrap(Invoke))) {
>> + return CRI->setUnwindDest(unwrap(B));
>> + } else if (CatchSwitchInst *CSI =
>> dyn_cast<CatchSwitchInst>(unwrap(Invoke))) {
>> + return CSI->setUnwindDest(unwrap(B));
>> + }
>> unwrap<InvokeInst>(Invoke)->setUnwindDest(unwrap(B));
>> }
>>
>> @@ -2513,10 +2526,53 @@ LLVMValueRef LLVMBuildLandingPad(LLVMBui
>> return wrap(unwrap(B)->CreateLandingPad(unwrap(Ty), NumClauses, Name));
>> }
>>
>> +LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
>> + LLVMValueRef *Args, unsigned NumArgs,
>> + const char *Name) {
>> + return wrap(unwrap(B)->CreateCatchPad(unwrap(ParentPad),
>> + makeArrayRef(unwrap(Args),
>> NumArgs),
>> + Name));
>> +}
>> +
>> +LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, LLVMValueRef
>> ParentPad,
>> + LLVMValueRef *Args, unsigned NumArgs,
>> + const char *Name) {
>> + if (ParentPad == nullptr) {
>> + Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
>> + ParentPad = wrap(Constant::getNullValue(Ty));
>> + }
>> + return wrap(unwrap(B)->CreateCleanupPad(unwrap(ParentPad),
>> + makeArrayRef(unwrap(Args),
>> NumArgs),
>> + Name));
>> +}
>> +
>> LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn) {
>> return wrap(unwrap(B)->CreateResume(unwrap(Exn)));
>> }
>>
>> +LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef
>> ParentPad,
>> + LLVMBasicBlockRef UnwindBB,
>> + unsigned NumHandlers, const char
>> *Name) {
>> + if (ParentPad == nullptr) {
>> + Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
>> + ParentPad = wrap(Constant::getNullValue(Ty));
>> + }
>> + return wrap(unwrap(B)->CreateCatchSwitch(unwrap(ParentPad),
>> unwrap(UnwindBB),
>> + NumHandlers, Name));
>> +}
>> +
>> +LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
>> + LLVMBasicBlockRef BB) {
>> + return wrap(unwrap(B)->CreateCatchRet(unwrap<CatchPadInst>(CatchPad),
>> + unwrap(BB)));
>> +}
>> +
>> +LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
>> + LLVMBasicBlockRef BB) {
>> + return
>> wrap(unwrap(B)->CreateCleanupRet(unwrap<CleanupPadInst>(CatchPad),
>> + unwrap(BB)));
>> +}
>> +
>> LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
>> return wrap(unwrap(B)->CreateUnreachable());
>> }
>> @@ -2551,6 +2607,40 @@ void LLVMSetCleanup(LLVMValueRef Landing
>> unwrap<LandingPadInst>(LandingPad)->setCleanup(Val);
>> }
>>
>> +void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef Dest) {
>> + unwrap<CatchSwitchInst>(CatchSwitch)->addHandler(unwrap(Dest));
>> +}
>> +
>> +unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch) {
>> + return unwrap<CatchSwitchInst>(CatchSwitch)->getNumHandlers();
>> +}
>> +
>> +void LLVMGetHandlers(LLVMValueRef CatchSwitch, LLVMBasicBlockRef
>> *Handlers) {
>> + CatchSwitchInst *CSI = unwrap<CatchSwitchInst>(CatchSwitch);
>> + for (CatchSwitchInst::handler_iterator I = CSI->handler_begin(),
>> + E = CSI->handler_end(); I != E;
>> ++I)
>> + *Handlers++ = wrap(*I);
>> +}
>> +
>> +LLVMValueRef LLVMGetParentCatchSwitch(LLVMValueRef CatchPad) {
>> + return wrap(unwrap<CatchPadInst>(CatchPad)->getCatchSwitch());
>> +}
>> +
>> +void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad, LLVMValueRef
>> CatchSwitch) {
>> + unwrap<CatchPadInst>(CatchPad)
>> + ->setCatchSwitch(unwrap<CatchSwitchInst>(CatchSwitch));
>> +}
>> +
>> +/*--.. Funclets
>> ...........................................................--*/
>> +
>> +LLVMValueRef LLVMGetArgOperand(LLVMValueRef Funclet, unsigned i) {
>> + return wrap(unwrap<FuncletPadInst>(Funclet)->getArgOperand(i));
>> +}
>> +
>> +void LLVMSetArgOperand(LLVMValueRef Funclet, unsigned i, LLVMValueRef
>> value) {
>> + unwrap<FuncletPadInst>(Funclet)->setArgOperand(i, unwrap(value));
>> +}
>> +
>> /*--.. Arithmetic
>> ..........................................................--*/
>>
>> LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS,
>> LLVMValueRef RHS,
>>
>> Modified: llvm/trunk/test/Bindings/llvm-c/echo.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/llvm-c/echo.ll?rev=328759&r1=328758&r2=328759&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/Bindings/llvm-c/echo.ll (original)
>> +++ llvm/trunk/test/Bindings/llvm-c/echo.ll Wed Mar 28 20:43:15 2018
>> @@ -122,3 +122,38 @@ do:
>> done:
>> ret i32 %p
>> }
>> +
>> +declare void @personalityFn()
>> +
>> +define void @exn() personality void ()* @personalityFn {
>> +entry:
>> + invoke void @decl()
>> + to label %via.cleanup unwind label %exn.dispatch
>> +via.cleanup:
>> + invoke void @decl()
>> + to label %via.catchswitch unwind label %cleanup.inner
>> +cleanup.inner:
>> + %cp.inner = cleanuppad within none []
>> + cleanupret from %cp.inner unwind label %exn.dispatch
>> +via.catchswitch:
>> + invoke void @decl()
>> + to label %exit unwind label %dispatch.inner
>> +dispatch.inner:
>> + %cs.inner = catchswitch within none [label %pad.inner] unwind label
>> %exn.dispatch
>> +pad.inner:
>> + %catch.inner = catchpad within %cs.inner [i32 0]
>> + catchret from %catch.inner to label %exit
>> +exn.dispatch:
>> + %cs = catchswitch within none [label %pad1, label %pad2] unwind label
>> %cleanup
>> +pad1:
>> + catchpad within %cs [i32 1]
>> + unreachable
>> +pad2:
>> + catchpad within %cs [i32 2]
>> + unreachable
>> +cleanup:
>> + %cp = cleanuppad within none []
>> + cleanupret from %cp unwind to caller
>> +exit:
>> + ret void
>> +}
>>
>> Modified: llvm/trunk/tools/llvm-c-test/echo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-c-test/echo.cpp?rev=328759&r1=328758&r2=328759&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-c-test/echo.cpp (original)
>> +++ llvm/trunk/tools/llvm-c-test/echo.cpp Wed Mar 28 20:43:15 2018
>> @@ -146,8 +146,8 @@ struct TypeCloner {
>> return LLVMMetadataTypeInContext(Ctx);
>> case LLVMX86_MMXTypeKind:
>> return LLVMX86MMXTypeInContext(Ctx);
>> - default:
>> - break;
>> + case LLVMTokenTypeKind:
>> + return LLVMTokenTypeInContext(Ctx);
>> }
>>
>> fprintf(stderr, "%d is not a supported typekind\n", Kind);
>> @@ -311,6 +311,13 @@ static LLVMValueRef clone_constant_impl(
>> return LLVMGetUndef(TypeCloner(M).Clone(Cst));
>> }
>>
>> + // Try null
>> + if (LLVMIsNull(Cst)) {
>> + check_value_kind(Cst, LLVMConstantTokenNoneValueKind);
>> + LLVMTypeRef Ty = TypeCloner(M).Clone(Cst);
>> + return LLVMConstNull(Ty);
>> + }
>> +
>> // Try float literal
>> if (LLVMIsAConstantFP(Cst)) {
>> check_value_kind(Cst, LLVMConstantFPValueKind);
>> @@ -631,6 +638,57 @@ struct FunCloner {
>> LLVMSetCleanup(Dst, LLVMIsCleanup(Src));
>> break;
>> }
>> + case LLVMCleanupRet: {
>> + LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0));
>> + LLVMBasicBlockRef Unwind = nullptr;
>> + if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src))
>> + Unwind = DeclareBB(UDest);
>> + Dst = LLVMBuildCleanupRet(Builder, CatchPad, Unwind);
>> + break;
>> + }
>> + case LLVMCatchRet: {
>> + LLVMValueRef CatchPad = CloneValue(LLVMGetOperand(Src, 0));
>> + LLVMBasicBlockRef SuccBB = DeclareBB(LLVMGetSuccessor(Src, 0));
>> + Dst = LLVMBuildCatchRet(Builder, CatchPad, SuccBB);
>> + break;
>> + }
>> + case LLVMCatchPad: {
>> + LLVMValueRef ParentPad =
>> CloneValue(LLVMGetParentCatchSwitch(Src));
>> + SmallVector<LLVMValueRef, 8> Args;
>> + int ArgCount = LLVMGetNumArgOperands(Src);
>> + for (int i = 0; i < ArgCount; i++)
>> + Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
>> + Dst = LLVMBuildCatchPad(Builder, ParentPad,
>> + Args.data(), ArgCount, Name);
>> + break;
>> + }
>> + case LLVMCleanupPad: {
>> + LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0));
>> + SmallVector<LLVMValueRef, 8> Args;
>> + int ArgCount = LLVMGetNumArgOperands(Src);
>> + for (int i = 0; i < ArgCount; i++)
>> + Args.push_back(CloneValue(LLVMGetArgOperand(Src, i)));
>> + Dst = LLVMBuildCleanupPad(Builder, ParentPad,
>> + Args.data(), ArgCount, Name);
>> + break;
>> + }
>> + case LLVMCatchSwitch: {
>> + LLVMValueRef ParentPad = CloneValue(LLVMGetOperand(Src, 0));
>> + LLVMBasicBlockRef UnwindBB = nullptr;
>> + if (LLVMBasicBlockRef UDest = LLVMGetUnwindDest(Src)) {
>> + UnwindBB = DeclareBB(UDest);
>> + }
>> + unsigned NumHandlers = LLVMGetNumHandlers(Src);
>> + Dst = LLVMBuildCatchSwitch(Builder, ParentPad, UnwindBB,
>> NumHandlers, Name);
>> + if (NumHandlers > 0) {
>> + LLVMBasicBlockRef *Handlers = static_cast<LLVMBasicBlockRef*>(
>> + safe_malloc(NumHandlers *
>> sizeof(LLVMBasicBlockRef)));
>> + LLVMGetHandlers(Src, Handlers);
>> + for (unsigned i = 0; i < NumHandlers; i++)
>> + LLVMAddHandler(Dst, DeclareBB(Handlers[i]));
>> + }
>> + break;
>> + }
>> case LLVMExtractValue: {
>> LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0));
>> if (LLVMGetNumIndices(Src) != 1)
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180330/f8cd5de9/attachment.html>
More information about the llvm-commits
mailing list