aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-c-test/echo.cpp
diff options
context:
space:
mode:
authorRobert Widmann <devteam.codafi@gmail.com>2018-03-30 17:49:53 +0000
committerRobert Widmann <devteam.codafi@gmail.com>2018-03-30 17:49:53 +0000
commit478fce9ebfa809e0f75741bbcf1de1a7a379f5c4 (patch)
tree400a138835389691a03eb7368aa1847d322daf09 /llvm/tools/llvm-c-test/echo.cpp
parent5f8c3e85aae8f0a34c69053e746af439622bf96e (diff)
downloadllvm-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.cpp63
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)