[LLVMdev] printf decleration
Ryan M. Lefever
lefever at crhc.uiuc.edu
Sun Apr 30 23:04:35 PDT 2006
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]
More information about the llvm-dev
mailing list