LLVM как сопоставить вызов пользовательской функции с printf - PullRequest
1 голос
/ 12 мая 2019

Я только начал с 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();

Ошибка, которую я получил:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...