[LLVMdev] Extending FunctionType

Gabriel Rodríguez grodriguez at udc.es
Mon Feb 28 12:25:13 PST 2011


Thank you John and Frits. I had been experimenting with the creation of a new function 
and the moving of the BBs from the old one into the new one, but couldn't make it work. 
The code Frits proposed works quite well, but if the original main defined argsc but not argsv (which 
shouldn't happen but oh well, both clang and gcc let it through with a warning) then the 
verification pass fails due to uses of the old argsc parameter being present in the new body. 


oldArgsc->replaceAllUsesWith( newArgsc ) solves this problem completely. 


Thank you again, 
Gabriel 


De: "Frits van Bommel" <fvbommel at gmail.com> 
Para: "John Criswell" <criswell at illinois.edu> 
CC: "Gabriel Rodríguez" <grodriguez at udc.es>, llvmdev at cs.uiuc.edu 
Enviados: Lunes, 28 de Febrero 2011 17:23:17 
Asunto: Re: [LLVMdev] Extending FunctionType 

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. 
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. 

> 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. 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110228/c15c0cfe/attachment.html>


More information about the llvm-dev mailing list