aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-c-test/echo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r--llvm/tools/llvm-c-test/echo.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 3478636..5187161 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -570,6 +570,46 @@ struct FunCloner {
LLVMDisposeOperandBundle(Bundle);
break;
}
+ case LLVMCallBr: {
+ LLVMTypeRef FnTy = CloneType(LLVMGetCalledFunctionType(Src));
+ LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src));
+
+ LLVMBasicBlockRef DefaultDest =
+ DeclareBB(LLVMGetCallBrDefaultDest(Src));
+
+ // Clone indirect destinations
+ SmallVector<LLVMBasicBlockRef, 8> IndirectDests;
+ unsigned IndirectDestCount = LLVMGetCallBrNumIndirectDests(Src);
+ for (unsigned i = 0; i < IndirectDestCount; ++i)
+ IndirectDests.push_back(DeclareBB(LLVMGetCallBrIndirectDest(Src, i)));
+
+ // Clone input arguments
+ SmallVector<LLVMValueRef, 8> Args;
+ unsigned ArgCount = LLVMGetNumArgOperands(Src);
+ for (unsigned i = 0; i < ArgCount; ++i)
+ Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
+
+ // Clone operand bundles
+ SmallVector<LLVMOperandBundleRef, 8> Bundles;
+ unsigned BundleCount = LLVMGetNumOperandBundles(Src);
+ for (unsigned i = 0; i < BundleCount; ++i) {
+ auto Bundle = LLVMGetOperandBundleAtIndex(Src, i);
+ Bundles.push_back(CloneOB(Bundle));
+ LLVMDisposeOperandBundle(Bundle);
+ }
+
+ Dst = LLVMBuildCallBr(Builder, FnTy, Fn, DefaultDest,
+ IndirectDests.data(), IndirectDests.size(),
+ Args.data(), Args.size(), Bundles.data(),
+ Bundles.size(), Name);
+
+ CloneAttrs(Src, Dst);
+
+ for (auto Bundle : Bundles)
+ LLVMDisposeOperandBundle(Bundle);
+
+ break;
+ }
case LLVMUnreachable:
Dst = LLVMBuildUnreachable(Builder);
break;