I am writing a pass where I need to make a function deceleration for printf. Below is the code I'm trying to use. ----- bool MyPass::runOnModule(Module &m) { vector<const Type*> args; args.push_back(PointerType::get(Type::SByteTy)); Function* f = m.getOrInsertFunction("printf", FunctionType::get(Type::IntTy, args, true)); ----- When I insert a call instruction to printf, I am using the following code: ----- /* i an Instruction*, and f is the Function* from above */ std::vector<Value*> args; args.push_back(ConstantArray::get("test")); new CallInst(f, args, "", i); ----- However, when my pass is run with opt it complains: ----- Call parameter type does not match function signature! [5 x sbyte] c"test\00" sbyte* call int (sbyte*, ...)* %printf( [5 x sbyte] c"test\00" ) ; <int>:0 [#uses=0] ----- Does anyone know what the problem is? Thanks, Ryan -- Ryan M. Lefever [217.333.7231] [http://www.ews.uiuc.edu/~lefever]
Ok, I think I figured it out. I talked to someone, and we figured out that when I make a call to printf with a constant string, I need to make a global variable and use getElementPtr to reference it. The modified call for accessing the printf is: /* m is Module*, f is Function*, i is Instruction* */ Constant* constStr = ConstantArray::get("test\n"); GlobalVariable* gv = new GlobalVariable (constStr->getType(), true, GlobalValue::InternalLinkage, constStr, "", m); std::vector<Constant*> geplist; geplist.push_back(ConstantUInt::get(Type::UIntTy,0)); geplist.push_back(ConstantUInt::get(Type::UIntTy,0)); Constant* gep = ConstantExpr::getGetElementPtr(gv,geplist); std::vector<Value*> args; args.push_back(gep); new CallInst(f, args, "", i); Ryan M. Lefever wrote:> I am writing a pass where I need to make a function deceleration for > printf. Below is the code I'm trying to use. > > ----- > bool MyPass::runOnModule(Module &m) { > vector<const Type*> args; > args.push_back(PointerType::get(Type::SByteTy)); > Function* f = m.getOrInsertFunction("printf", > FunctionType::get(Type::IntTy, args, true)); > ----- > > When I insert a call instruction to printf, I am using the following code: > > ----- > /* i an Instruction*, and f is the Function* from above */ > std::vector<Value*> args; > args.push_back(ConstantArray::get("test")); > > new CallInst(f, args, "", i); > ----- > > However, when my pass is run with opt it complains: > > ----- > Call parameter type does not match function signature! > [5 x sbyte] c"test\00" > sbyte* call int (sbyte*, ...)* %printf( [5 x sbyte] c"test\00" ) ; > <int>:0 [#uses=0] > ----- > > Does anyone know what the problem is? > > Thanks, > Ryan >-- Ryan M. Lefever [217.333.7231] [http://www.ews.uiuc.edu/~lefever]
On Mon, 1 May 2006, Ryan M. Lefever wrote:> Ok, I think I figured it out. I talked to someone, and we figured out that > when I make a call to printf with a constant string, I need to make a global > variable and use getElementPtr to reference it. The modified call for > accessing the printf is:Yup, that sounds right! -Chris> /* m is Module*, f is Function*, i is Instruction* */ > Constant* constStr = ConstantArray::get("test\n"); > GlobalVariable* gv = new GlobalVariable > (constStr->getType(), true, GlobalValue::InternalLinkage, constStr, > "", m); > std::vector<Constant*> geplist; > geplist.push_back(ConstantUInt::get(Type::UIntTy,0)); > geplist.push_back(ConstantUInt::get(Type::UIntTy,0)); > Constant* gep = ConstantExpr::getGetElementPtr(gv,geplist); > > std::vector<Value*> args; > args.push_back(gep); > > new CallInst(f, args, "", i); > > Ryan M. Lefever wrote: >> I am writing a pass where I need to make a function deceleration for >> printf. Below is the code I'm trying to use. >> >> ----- >> bool MyPass::runOnModule(Module &m) { >> vector<const Type*> args; >> args.push_back(PointerType::get(Type::SByteTy)); >> Function* f = m.getOrInsertFunction("printf", >> FunctionType::get(Type::IntTy, args, true)); >> ----- >> >> When I insert a call instruction to printf, I am using the following code: >> >> ----- >> /* i an Instruction*, and f is the Function* from above */ >> std::vector<Value*> args; >> args.push_back(ConstantArray::get("test")); >> >> new CallInst(f, args, "", i); >> ----- >> >> However, when my pass is run with opt it complains: >> >> ----- >> Call parameter type does not match function signature! >> [5 x sbyte] c"test\00" >> sbyte* call int (sbyte*, ...)* %printf( [5 x sbyte] c"test\00" ) ; >> <int>:0 [#uses=0] >> ----- >> >> Does anyone know what the problem is? >> >> Thanks, >> Ryan >> > >-Chris -- http://nondot.org/sabre/ http://llvm.org/