[LLVMdev] Extending FunctionType

John Criswell criswell at illinois.edu
Mon Feb 28 08:10:25 PST 2011


On 2/28/11 10:04 AM, Frits van Bommel wrote:
> 2011/2/28 John Criswell<criswell at illinois.edu>:
>> On 2/28/11 6:31 AM, Gabriel Rodríguez wrote:
>>
>> Hi all,
>>
>> I am trying to extend a FunctionType to include new parameters. In
>> particular, I want to
>> ensure that the main function has been declared with both argsc and argsv.
>> However
>> there seems to be no easy way to accomplish this:
>> llvm::Function::getFunctionType() returns a
>> a reference to a const object, while modifying only the argument list yields
>> an error during verification
>> since the function type does not match its arguments. Is there any approach
>> that I am missing or
>> a simple workaround to this problem?
>>
>> If I understand correctly, you are trying to add a parameter to the main()
>> function, correct?
>>
>> If so, then you can't just modify the existing main() function.  Instead,
>> you have to create a new function with an empty function body with the new
>> parameter and then clone the body of the old main() function into the new
>> main() function.
> I don't think a full clone is necessary, since he wants to replace the
> function. He only needs to create the new function and splice in the
> body of the old one.

That is exactly what MakeFunctionClone() does.  It creates a new 
function and uses CloneFunctionInto() to create a copy of the 
instructions in the old function in the new function.  The old function 
can be removed afterward if desired.

I'm not sure if the code below would work.  I don't see a mechanism that 
updates instructions that use the old function's arguments to use the 
new function's arguments.

> Gabriel: look at Function::getBasicBlockList() and
> iplist<>::splice(iterator, iplist). Something like
>    Function *NewF = Function::Create(NewFnType, OldF->getLinkage());
>    NewF->getBasicBlockList().splice(NewF->begin(), OldF->getBasicBlockList());
>    NewF->takeName(OldF);
>    OldF->eraseFromParent();
> is probably what you're looking for.
> (Note: completely untested)

-- John T.




More information about the llvm-dev mailing list