[LLVMdev] Extending FunctionType

John Criswell criswell at illinois.edu
Mon Feb 28 08:32:39 PST 2011


On 2/28/11 10:23 AM, Frits van Bommel wrote:
> On Mon, Feb 28, 2011 at 5:10 PM, John Criswell<criswell at illinois.edu>  wrote:
>> On 2/28/11 10:04 AM, Frits van Bommel wrote:
>>> 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 pretty sure MakeFunctionClone() actually *copies* basic blocks +
> instructions instead of moving them over.

Yes, you're correct.  I didn't think that detail was all that important.

> Splicing the basic block list into the new function should be much
> more efficient, especially for large functions; it's probably
> constant-time operation and shouldn't allocate any memory.

Yes, it would more likely be faster.

>> 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.
> He's adding explicit argc and argv arguments to main(), implying the
> old function didn't have any arguments. But for a general function
> it'd be easy enough to call replaceAllUsesWith() on each old argument,
> since there's no need to worry about preserving the integrity of the
> old function.
>
>>> 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)
> And I did put a disclaimer about correctness :).
>
>
> Reading MakeFunctionClone() though, I do see some other things that I missed:
> * A Module* argument to Function::Create (necessitating an empty ""
> name argument) so it gets inserted in the module.
> * Copying function attributes.
> * Copying the calling convention.

Yeah, I think for modifying main(), your approach is better.

-- John T.




More information about the llvm-dev mailing list