Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LLVM如何将自定义函数调用映射到printf_C++_Llvm - Fatal编程技术网

C++ LLVM如何将自定义函数调用映射到printf

C++ LLVM如何将自定义函数调用映射到printf,c++,llvm,C++,Llvm,我刚从LLVM开始。我用C++来创建一个PASCAL语言的编译器。鉴于打印函数是系统调用,如何将我的语言writeln(5)映射到系统函数printf(“%d”,5)?我认为下面的代码应该可以做到这一点 NamedValues.clear(); vector<Type *> Doubles(1, Type::getInt32Ty(TheContext)); FunctionType * FT = FunctionType::get(Type::getInt32Ty(TheConte

我刚从LLVM开始。我用C++来创建一个PASCAL语言的编译器。鉴于打印函数是系统调用,如何将我的语言
writeln(5)
映射到系统函数
printf(“%d”,5)
?我认为下面的代码应该可以做到这一点

NamedValues.clear();

vector<Type *> Doubles(1, Type::getInt32Ty(TheContext));
FunctionType * FT = FunctionType::get(Type::getInt32Ty(TheContext), Doubles, false);
Function * function = Function::Create(FT, Function::ExternalLinkage, "writeln", TheModule.get());

// create function body
BasicBlock * BB = BasicBlock::Create(TheContext, "entry", function);
Builder.SetInsertPoint(BB);

// get param
Function::arg_iterator AI = function->arg_begin();
Value * val = AI;
AI->setName("val");

// get format string
string format = "%d";
Constant * ConstStr = ConstantDataArray::getString(TheContext, format.c_str());
ConstStr = new GlobalVariable(*TheModule, ConstStr->getType(), true, GlobalValue::InternalLinkage, ConstStr, format);
Constant * Idxs[] = {ConstantInt::get(Type::getInt32Ty(TheContext), 0), 0};
Idxs[1] = Idxs[0];

// make params
vector<Type *> params;
params.push_back(PointerType::getUnqual(Type::getInt8Ty(TheContext)));

// get printf function
FunctionCallee PrintF = TheModule->getOrInsertFunction("printf", FunctionType::get(Type::getVoidTy(TheContext), params, true));

// call
/*
 * CallInst *CreateCall(FunctionCallee Callee, ArrayRef<Value *> Args = None,
                   const Twine &Name = "", MDNode *FPMathTag = nullptr)
 */
Builder.CreateCall(PrintF.getFunctionType(), ConstantExpr::getGetElementPtr(ConstStr->getType(), ConstStr, Idxs), val);

Builder.CreateRet(Builder.getInt32(0));

main_loop();
NamedValues.clear();
向量加倍(1,类型::getInt32Ty(上下文));
FunctionType*FT=FunctionType::get(Type::getInt32Ty(上下文),双精度,false);
Function*Function=Function::Create(FT,Function::ExternalLinkage,“writeln”,TheModule.get());
//创建函数体
BasicBlock*BB=BasicBlock::Create(上下文“entry”,函数);
生成器设置插入点(BB);
//获取参数
函数::arg_迭代器AI=Function->arg_begin();
值*val=AI;
AI->setName(“val”);
//获取格式字符串
字符串格式=“%d”;
常量*ConstStr=ConstantDataArray::getString(上下文,format.c_str());
ConstStr=newglobalvariable(*模块,ConstStr->getType(),true,GlobalValue::InternalLinkage,ConstStr,format);
常量*Idxs[]={ConstantInt::get(类型::getInt32Ty(上下文),0),0};
Idxs[1]=Idxs[0];
//制造参数
向量参数;
参数push_back(指针类型::getUnqual(类型::getInt8Ty(上下文));
//获取printf函数
FunctionCallee PrintF=TheModule->getOrInsertFunction(“PrintF”,FunctionType::get(Type::getVoidTy(context),params,true));
//召唤
/*
*CallInst*CreateCall(FunctionCallee-Callee,ArrayRef-Args=None,
const Twine&Name=“”,MDNode*FPMathTag=nullptr)
*/
CreateCall(PrintF.getFunctionType(),ConstantExpr::getGetElementPtr(ConstStr->getType(),ConstStr,Idxs),val);
Builder.CreateRet(Builder.getInt32(0));
主循环();
我得到的错误是:

Assertion failed: (Ty == cast<PointerType>(C->getType()->getScalarType())->getElementType()), function getGetElementPtr, file /Users/ustynov/Documents/Study/HOMEWORKS/semestralwork/llvm/lib/IR/Constants.cpp, line 2012.
断言失败:(Ty==cast(C->getType()->getScalarType())->getElementType()),函数getElementPtr,file/Users/ustynov/Documents/Study/HOMEWORKS/semestralwork/llvm/lib/IR/Constants.cpp,第2012行。

简短的版本是:您编写一个函数。函数接受语言的调用约定和类型,根据需要检查、处理和转换其参数,并调用另一个函数。这可能是一个非常小的函数,它可能会自动生成。简短的版本是:您编写一个函数。函数接受语言的调用约定和类型,根据需要检查、处理和转换其参数,并调用另一个函数。这可能是一个非常小的函数,可以自动生成。