LLVM Вставить вызов функции в другую функцию - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь вставить вызов функции в основную функцию, поэтому, когда я запускаю сгенерированный двоичный файл, функция будет выполняться автоматически.Так как язык, который я пытаюсь «скомпилировать», выглядит как «скриптовый» язык:

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

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

, где writeln - функция, доступная по умолчанию, и после выполнения бинарного файла я ожидаю увидеть 7 8 9. Есть лиспособ вставить последний вызов функции прямо перед оператором возврата основной функции?Прямо сейчас у меня есть

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-файл вручную и скомпилирующее его впоследствии, но я хочу сделать это в части кода моегокод.

edit

, что я генерирую прямо сейчас, это

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

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

, поэтому, когда я выполняю двоичный файл - ничего не происходит

1 Ответ

2 голосов
/ 12 мая 2019

не стесняйтесь найти здесь свое вдохновение

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