LLVM создает исполняемый код из построителя C / C ++ - PullRequest
0 голосов
/ 30 мая 2020

Я получил пример кода 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 ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...