diff options
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 40 |
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; |