[LLVMdev] Extending FunctionType

Frits van Bommel fvbommel at gmail.com
Mon Feb 28 08:04:03 PST 2011


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.

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)




More information about the llvm-dev mailing list