如何通过模块生成器系统在LLVM中调用@printf

如何通过模块生成器系统在LLVM中调用@printf,llvm,llvm-ir,Llvm,Llvm Ir,我正在学习LLVM。据我所知,LLVM中已经提供了许多有用的C函数,这些函数是内在的。所以我试图从我的代码中调用@printf函数 我在LLVM参考手册中找到了相应的部分,这些部分描述了实现这一点的IR代码,这是相对清晰的: declare i32 @printf(i8* noalias nocapture, ...) call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42) 等等,但我无法找到如何使用IRBuilder类来实现这一点。我查看了

我正在学习LLVM。据我所知,LLVM中已经提供了许多有用的C函数,这些函数是内在的。所以我试图从我的代码中调用@printf函数

我在LLVM参考手册中找到了相应的部分,这些部分描述了实现这一点的IR代码,这是相对清晰的:

declare i32 @printf(i8* noalias nocapture, ...)
call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42)
等等,但我无法找到如何使用IRBuilder类来实现这一点。我查看了builder类,但什么都没弄明白

我不想传递任何花哨的变量,基本上就像

printf( "%lu", variable_64_bit );
用C或类似的语言

有谁能告诉我,要通过生成器调用printf函数,我必须做些什么

提前谢谢

我在别处找到了一份工作。事实上,它有点超出了我最初的问题,但它对我很有帮助,希望它也能帮助其他人。

void kprintf(Module*mod,BasicBlock*bb,const char*format,…)
{
函数*func_printf=mod->getFunction(“printf”);
如果(!func_printf){
PointerType*Pty=PointerType::get(IntegerType::get(mod->getContext(),8),0);
FunctionType*Function9=FunctionType::get(IntegerType::get(mod->getContext(),32),true);
func_printf=Function::Create(FuncTy9,GlobalValue::ExternalLinkage,“printf”,mod);
func_printf->setCallingConv(CallingConv::C);
AttrListPtr func_printf_PAL;
func_printf->setAttributes(func_printf_PAL);
}
IRBuilder生成器(mod->getContext());
生成器设置插入点(bb);
Value*str=builder.CreateGlobalStringPtr(格式);
std::vector int32_call_参数;
int32调用参数后推(str);
va_列表ap;
va_开始(ap,格式);
char*str_ptr=va_arg(ap,char*);
Value*format_ptr=builder.CreateGlobalStringPtr(str_ptr);
int32调用参数后推(格式ptr);
std::向量额外;
做{
llvm::Value*op=va_arg(ap,llvm::Value*);
如果(op){
int32调用参数后推(op);
}否则{
打破
}
}而(1),;
va_端(ap);
CallInst*int32_call=CallInst::Create(func_printf,int32_call_参数,“call”,bb);
}
#定义oprintf(…)kprintf(_VA_ARGS__)
#定义llvm_printf(…)oprintf(mod,bb,_VA_ARGS,NULL)
llvm_printf(“输出:0x%08X%f%d\n”,0x12345678,3.1415926,12345);

希望能对您有所帮助

您是指
IRBuilder
?是的,对不起,我更正了我的问题