[LLVMdev] llvm-gcc Bug, Looking for Advice on Fix

David Greene
2007-04-20T16:52:29Z

David Greene wrote:

> The problem is that Intrinsic::getDeclaration takes four
> parameters but is only passed two:
>
> Function *Intrinsic::getDeclaration(Module *M, ID id, const Type **Tys,
>                                      unsigned numTys)

It turns out that this happens all over llvm-convert.c.  Tys and numTys
default to zero, which is why it builds.  The problem is, getDeclaration
calls getType(id, Tys, numTys) where this code is executed:

   case Intrinsic::memcpy_i32:		// llvm.memcpy.i32
   case Intrinsic::memmove_i32:		// llvm.memmove.i32
     ResultTy = Type::getPrimitiveType(Type::VoidTyID);
     ArgTys.push_back(Tys[1]);
     ArgTys.push_back(Tys[2]);
     ArgTys.push_back(IntegerType::get(32));
     ArgTys.push_back(IntegerType::get(32));

Oops, Tys is 0!

Similar code exists for llvm.memcpy.i64, so it's not the case that
the select expression returned the "wrong" answer.

How the heck did this ever work?

                                         -Dave