I wish to write an LLVM pass that two arguments of type i32 to select functions. My first try (sketched below) failed:
bool MyFunctionPass::runOnFunction(Function &f) 
{
    Type *int32 = Type::getInt32Ty(f.getParent()->getContext());
    Argument *xC = new Argument(int32, "__xC", &f);
    ...
The module verifier crashes if I try the above. The newly added argument type is junk 0xCDCDCDCD (uninitialized heap memory). The function type remains:
void (i32 addrspace(1)*, i32 addrspace(1)*, i32)
instead of being extended by the new i32.
Also, adding the parameter directly to the parameter list Function::getArgumentList() failed as the Argument constructor links itself to the function, and this is detected as a double link.
Thanks!
Adding arguments to a function is surprisingly tricky - as you've discovered, it's not as easy as modifying the argument list.
The most foolproof way of doing it is probably to first create a new function with all the original arguments + the extra arguments, and then call CloneFunctionInto to embed the original function inside your new function. 
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With