Problem with variable argument intrinsics

Hi,
I tried creating variable argument intrinsics which
are to be placeholders for some instructions which
should not be executed by the backend.

Kindly help me with the errors in my "migrate_begin"
intrinsic creation

//Additions made to Intrinsics.td file:

def llvm_migrate_begin : LLVMType<iAny>;
def int_migrate_begin :
Intrinsic<[llvm_migrate_begin,llvm_vararg_ty],[IntrWriteMem],"llvm.migrate_begin">;

//A section of the code which deals with the
//"migrate_begin" intrinsic creation is as follows:

const Type **Tys=(const
Type**)calloc(extTys.size(),sizeof(Type*)); /*
extTys
vector contains data types(pointers) of formal
parameters of the
function "f" */
int i=0;
for(vector<const Type*>::iterator
it=extTys.begin(),e=extTys.end();it!=e;it++)
        {Tys[i++]=*it;}
extTys.clear();
Module *M = bbp->getParent()->getParent();
Function *f =
Intrinsic::getDeclaration(M,Intrinsic::migrate_begin,Tys,i);
/*
migrate_begin intrinsic creation */
CallInst* CI = new CallInst(f,"migrate_begin",bbp);
/*bbp is pointer to basic block where
intrinsic is to be inserted*/

//Errors:

Overloaded intrinsic has incorrect suffix: '.i32.i32'.
It should be '.i32'
i32 (...)* @llvm.migrate_begin.i32.i32

Overloaded intrinsic has incorrect suffix:
'.i32.i32.i32'. It should be '.i32'
i32 (...)* @llvm.migrate_begin.i32.i32.i32

Broken module found, compilation aborted!

Hi,
I tried creating variable argument intrinsics which
are to be placeholders for some instructions which
should not be executed by the backend.

Kindly help me with the errors in my "migrate_begin"
intrinsic creation

//Additions made to Intrinsics.td file:

def llvm_migrate_begin : LLVMType<iAny>;
def int_migrate_begin :
Intrinsic<[llvm_migrate_begin,llvm_vararg_ty],[IntrWriteMem],"llvm.migrate_begin">;

This says that the return type is overloaded (because it's iAny). But that's
the only overloaded part here; using variadic argument lists is different
from overloading.

Overloaded intrinsic has incorrect suffix: '.i32.i32'.
It should be '.i32'
i32 (...)* @llvm.migrate_begin.i32.i32

Overloaded intrinsic has incorrect suffix:
'.i32.i32.i32'. It should be '.i32'
i32 (...)* @llvm.migrate_begin.i32.i32.i32

The suffix has a part for each overloaded type in the function type. Since only
the return type is overloaded, the verifier is expecting only one type to be passed
into getDeclaration.

Dan

Hi,
Thank You for the advice and we were able to solve
that problem by the following modifications to the
Instrinsics.td file.
But I now have an "Invalid Intrinsic name" error

This error occurs presumably because the created
intrinsic is named:
llvm.migrate_begin.i32
Intrinsics.gen checks for a string length of 18
(i.e. the length without the .i32).
Kindly help me through it.

//Additions made to Intrinsics.td file:

def int_migrate_begin :
Intrinsic<[llvm_i32_ty,llvm_vararg_ty],
[IntrWriteMem],"llvm.migrate_begin">;

//A section of the code which deals with the
//"migrate_begin" intrinsic creation is as follows:

const Type **Tys=(const
Type**)calloc(extTys.size(),sizeof(Type*));
/*extTys vector contains function type of the
function "f" */
int i=0;
for(vector<const Type*>::iterator
it=extTys.begin(),e=extTys.end();it!=e;it++)
{Tys[i++]=*it;}
extTys.clear();
Module *M = bbp->getParent()->getParent();
Function *f =

Intrinsic::getDeclaration(M,Intrinsic::migrate_begin,Tys,i);
/* migrate_begin intrinsic creation */
CallInst* CI = new CallInst(f,"migrate_begin");

//Error:

NAME:llvm.migrate_begin.i32
opt: Function.cpp:293: unsigned int
llvm::Function::getIntrinsicID(bool)
const: Assertion `noAssert && "Invalid LLVM intrinsic
name"' failed.

P.S:

> > Hi,
> > I tried creating variable argument intrinsics
>
> which
>
> > are to be placeholders for some instructions
which

def int_migrate_begin :
Intrinsic<[llvm_i32_ty,llvm_vararg_ty],
[IntrWriteMem],"llvm.migrate_begin">;

This is now an intrinsic with no overloaded types. It will have
an empty-string suffix.

Intrinsic::getDeclaration(M,Intrinsic::migrate_begin,Tys,i);
/* migrate_begin intrinsic creation */
CallInst* CI = new CallInst(f,"migrate_begin");

//Error:

NAME:llvm.migrate_begin.i32
opt: Function.cpp:293: unsigned int
llvm::Function::getIntrinsicID(bool)
const: Assertion `noAssert && "Invalid LLVM intrinsic
name"' failed.

Without overloading, there should be no types passed to
Intrinsic::getDeclaration.

Dan