LLVM将函数调用插入另一个函数

时间:2019-05-12 11:59:41

标签: c++ llvm

我试图在主函数中插入函数调用,因此当我运行生成的二进制文件时,函数将自动执行。由于我尝试“编译”的语言看起来像是“脚本”语言:

function foo () begin 3 end;
function boo () begin 4 end;

writeln (foo()+boo()) ;
writeln (8) ;
writeln (9) ;

其中writeln是默认可用的函数,在执行二进制文件后,我希望看到7 8 9.是否可以在主函数的return语句之前插入最后一个函数调用? 现在我有

define i32 @main() {
entry:
  ret i32 0
}

我想拥有类似的东西

define i32 @main() {
entry:
  %calltmp = call double @writeln(double 7.000000e+00)
  %calltmp = call double @writeln(double 8.000000e+00)
  %calltmp = call double @writeln(double 9.000000e+00)
  ret i32 0
}

手动编辑IR文件并在以后进行编译,但是我想在代码的代码生成部分中完成它。

编辑

我现在生成的是

define double @__anon_expr() {
entry:
  %main = call double @writeln(double 3.000000e+00)
  ret double %main
}

define i32 @main() {
entry:
  ret i32 0
}

所以当我执行二进制文件时-什么也没发生

1 个答案:

答案 0 :(得分:2)

随时从这里获取灵感

Type * returnType = Type::getInt32Ty(TheContext);
std::vector<Type *> argTypes;
FunctionType * functionType = FunctionType::get(returnType, argTypes, false);
Function * function = Function::Create(functionType, Function::ExternalLinkage, "main", TheModule.get());

    BasicBlock * BB = BasicBlock::Create(TheContext, "entry", function);
    Builder.SetInsertPoint(BB);
    vector<Value *> args;
    args.push_back(ConstantFP::get(TheContext, APFloat(4.0)));
    Builder.CreateCall(getFunction("writeln"), args, "call");
    Value * returnValue = Builder.getInt32(0);
    Builder.CreateRet(returnValue);