[LLVMdev] Cloning a function

Zack Rusin zack at tungstengraphics.com
Mon Mar 3 05:21:05 PST 2008


Hi,

we have two modules, one that we basically use as a library in which we store 
a lot of simple function calls, the other is small program generated at 
run-time.

Whenever a function call for to one of the builtin functions is being called 
we use CloneFunction to clone the instruction from the library module and 
insert it in the generated module.

The problem is for example when we have something like:
declare float @powf(float, float)
define void @pow(<4 x float>* %res, /*other args*/...) {
entry:
	...
	%call = tail call float @powf( float %tmp1, float %tmp3 )
	...
}
while powf has a similar extern declaration in the generated module, the 
cloned function after the CloneFunction call obviously refers to the powf 
from the library module and asserts as an invalid module. To solve that we 
add a mapping to DenseMap from the powf declaration in the library module to 
the powf declaration in the generated module, as in:

DenseMap<const Value*, Value *> val;
val[m_builtins->getFunction("powf")] = currentModule()->getFunction("powf");
func = CloneFunction(originalFunc, val);
currentModule()->getFunctionList().push_back(func);

unfortunately after this we get an assert:
vp-tris: /home/zack/projects/general/llvm/lib/Target/X86/X86CodeEmitter.cpp:412: 
unsigned int sizeOfImm(const llvm::TargetInstrDesc*): Assertion `0 
&& "Immediate size not set!"' failed.

which I'm a little confused about. Any idea what might be causing this and how 
to fix it?

z



More information about the llvm-dev mailing list