LLVM создает исполняемый код из построителя C/C++
У меня есть пример кода llvm отсюда. В этом коде есть некоторые проблемы, которые я тоже исправил. На этом этапе все, что он делает, это сбрасывает переведенный ИК-код. Мне нужно создать исполняемый файл из моегоC++
код без звонка llvm-as
/llc
/clang
в моем bash. Как я могу этого добиться?
Я также не хочу создавать промежуточные файлы IR или байт-кода.
#include <llvm/ADT/ArrayRef.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/IRBuilder.h>
#include <vector>
#include <string>
int main()
{
llvm::LLVMContext context;
llvm::Module *module = new llvm::Module("myModule", context);
llvm::IRBuilder<> builder(context);
llvm::FunctionType *funcType = llvm::FunctionType::get(builder.getVoidTy(), false);
llvm::Function *mainFunc =
llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, "main", module);
llvm::BasicBlock *entry = llvm::BasicBlock::Create(context, "entrypoint", mainFunc);
builder.SetInsertPoint(entry);
llvm::Value *helloWorld = builder.CreateGlobalStringPtr("hello world!\n");
std::vector<llvm::Type *> putsArgs;
putsArgs.push_back(builder.getInt8Ty()->getPointerTo());
llvm::ArrayRef<llvm::Type*> argsRef(putsArgs);
llvm::FunctionType *putsType =
llvm::FunctionType::get(builder.getInt32Ty(), argsRef, false);
llvm::FunctionCallee putsFunc = module->getOrInsertFunction("puts", putsType);
builder.CreateCall(putsFunc, helloWorld);
builder.CreateRetVoid();
module->print(llvm::errs(), nullptr);
}
Дополнительный вопрос: кстати, когда я ищу примеры LLVM, многие результаты являются примерами IR. Как я могу получить результаты, чтобы научить создавать из C++?