[llvm-dev] Passing arguments of a function to a call to another
Aditi Gupta via llvm-dev
llvm-dev at lists.llvm.org
Wed Jul 10 14:09:44 PDT 2019
Hi,
I am trying to change a call to one function (which might have multiple
arguments) into a call to a different function that takes the same
arguments, but I’m having trouble passing the arguments to the new call. I
saw the post at
http://lists.llvm.org/pipermail/llvm-dev/2009-June/023247.html and am using
CallSite, but I cannot see the implementation of the createCallInst wrapper
function, so I’m unsure how to use the arg_iterator to give my function the
correct signature.
Currently, once I have the arg_iterators, I put them into a vector of
arguments and convert that to an ArrayRef, which I then pass into
CreateCall, as shown below (I am working with LLVM version 4.0.1).
if (auto *op = dyn_cast<CallInst>(&I)) {
auto function = op->getCalledFunction();
FunctionType *newFunctionType = FunctionType::get(retType,
function->getFunctionType()->params(), false);
Function *newFunction = (Function
*)(F.getParent()->getOrInsertFunction("replacement", newFunctionType));
std::vector<Value *> arguments;
CallSite CS(&I);
CallSite::arg_iterator ait = CS.arg_begin(), aend = CS.arg_end();
while (ait != aend) {
Value *arg = (Value *)(&(*ait));
arguments.push_back(arg);
ait++;
}
ArrayRef<Value *> argArray = ArrayRef<Value *>(arguments);
IRBuilder<> builder(op);
Value *newCall = builder.CreateCall(newFunction, argArray);
…}
This throws an error that says that I am calling a function with a bad
signature. I think that the CallSite method of retrieving arguments is
correct, as that is what was suggested in the previous post, but is passing
the output into CreateCall the right approach, or is there a different way
of doing this?
Thank you,
Aditi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190710/7f4cf20d/attachment-0001.html>
More information about the llvm-dev
mailing list