summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-c-test/echo.cpp
diff options
context:
space:
mode:
authorRobert Widmann <devteam.codafi@gmail.com>2018-03-29 03:43:15 +0000
committerRobert Widmann <devteam.codafi@gmail.com>2018-03-29 03:43:15 +0000
commit6775f52fe00bc02355075de0b190e8c50f765018 (patch)
tree1e24f5f8390227df853409285218976884c5ca8b /llvm/tools/llvm-c-test/echo.cpp
parentf8aa23879e4719fbb040c59276dfec8f4854f9a1 (diff)
downloadbcm5719-llvm-6775f52fe00bc02355075de0b190e8c50f765018.tar.gz
bcm5719-llvm-6775f52fe00bc02355075de0b190e8c50f765018.zip
[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 llvm-svn: 328759
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r--llvm/tools/llvm-c-test/echo.cpp62
1 files changed, 60 insertions, 2 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 29eb8d89840..20269bcbc96 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,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)
OpenPOWER on IntegriCloud