diff options
author | Robert Widmann <devteam.codafi@gmail.com> | 2018-03-30 17:49:53 +0000 |
---|---|---|
committer | Robert Widmann <devteam.codafi@gmail.com> | 2018-03-30 17:49:53 +0000 |
commit | 478fce9ebfa809e0f75741bbcf1de1a7a379f5c4 (patch) | |
tree | 400a138835389691a03eb7368aa1847d322daf09 /llvm/tools/llvm-c-test/echo.cpp | |
parent | 5f8c3e85aae8f0a34c69053e746af439622bf96e (diff) | |
download | llvm-478fce9ebfa809e0f75741bbcf1de1a7a379f5c4.zip llvm-478fce9ebfa809e0f75741bbcf1de1a7a379f5c4.tar.gz llvm-478fce9ebfa809e0f75741bbcf1de1a7a379f5c4.tar.bz2 |
[LLVM-C] Finish exception instruction bindings - Round 2
Summary:
Previous revision caused a leak in the echo test that got caught by the ASAN bots because of missing free of the handlers array and was reverted in r328759. Resubmitting the patch with that correction.
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
Reviewed By: whitequark
Subscribers: llvm-commits, vlad.tsyrklevich
Differential Revision: https://reviews.llvm.org/D45100
llvm-svn: 328883
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 29eb8d8..4b6423d 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -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(LLVMValueRef Cst, LLVMModuleRef M) { 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,58 @@ 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])); + free(Handlers); + } + break; + } case LLVMExtractValue: { LLVMValueRef Agg = CloneValue(LLVMGetOperand(Src, 0)); if (LLVMGetNumIndices(Src) != 1) |