diff options
author | Benji Smith <6193112+Benjins@users.noreply.github.com> | 2024-05-07 21:59:53 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-08 10:59:53 +0900 |
commit | 584253c4e2f788f870488fc32193b52d67ddaccc (patch) | |
tree | 5541665a794a6fb1771822d5ce75b64f9fcc35d7 /llvm/tools/llvm-c-test/echo.cpp | |
parent | 34ae2265e88c8a04350de5a244d0d888e74a8388 (diff) | |
download | llvm-584253c4e2f788f870488fc32193b52d67ddaccc.zip llvm-584253c4e2f788f870488fc32193b52d67ddaccc.tar.gz llvm-584253c4e2f788f870488fc32193b52d67ddaccc.tar.bz2 |
[C API] Add getters and build function for CallBr (#91154)
This adds LLVMBuildCallBr to create CallBr instructions, and getters for
the CallBr-specific data. The remainder of its data, e.g.
arguments/function, can be accessed using existing getters.
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; |