Назовите Монету в пять центов LLVM из c программы

Я генерировал до н.э файл с компилятором онлайн на llvm.org, и я хотел бы знать, возможно ли загрузить это до н.э файл от c или программы C++, выполните IR в до н.э файл с llvm монетой в пять центов (программно в c программе) и получите результаты.

Как я могу выполнить это?

22
задан Machavity 21 August 2017 в 20:09
поделиться

3 ответа

Это должно (более или менее) работать с использованием LLVM 2.6. Похоже, что в SVN есть еще несколько вспомогательных функций для создания ленивого ModuleProvider поверх биткодового файла. Однако я не пытался его скомпилировать, просто склеил несколько битов из одного из моих JIT-приложений.

#include <string>
#include <memory>

#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ModuleProvider.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>

using namespace std;
using namespace llvm;

int main()
{
    InitializeNativeTarget();
    llvm_start_multithreaded();
    LLVMContext context;

    string error;
    auto_ptr<MemoryBuffer> buffer(MemoryBuffer::getFile("bitcode.bc"));
    auto_ptr<Module> module(ParseBitcodeFile(buffer.get(), context, &error));
    auto_ptr<ModuleProvider> mp(new ExistingModuleProvider(module));
    module.release();

    auto_ptr<ExecutionEngine> ee(ExecutionEngine::createJIT(mp.get(), &error));
    mp.release();

    Function* func = ee->getFunction("foo");

    typedef void (*PFN)();
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
    pfn();
}
15
ответ дан 29 November 2019 в 05:03
поделиться

Из командной строки можно использовать LLVM-программу lli для запуска bc-файла. Если файл находится на ассемблере LLVM, то для создания двоичного файла с биткодом сначала нужно запустить llvm-as на нём.

Это легко сделать из C. Я бы порекомендовал взглянуть на обширную документацию по LLVM: http://llvm.org/docs

Канал LLVM irc, ссылка на который есть на этой странице, полон очень знающих людей, готовых ответить на вопросы.

Извините за косвенный ответ. Я широко использую LLVM, но я генерирую прямой код не только во временном дополнении.

.
-3
ответ дан 29 November 2019 в 05:03
поделиться

Вот какой-то рабочий код на основе Натана Хауэлла:

#include <string>
#include <memory>
#include <iostream>

#include <llvm/LLVMContext.h>
#include <llvm/Target/TargetSelect.h>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ModuleProvider.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>

using namespace std;
using namespace llvm;

int main()
{
    InitializeNativeTarget();
    llvm_start_multithreaded();
    LLVMContext context;
    string error;
    Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error);
    ExecutionEngine *ee = ExecutionEngine::create(m);

    Function* func = ee->FindFunctionNamed("main");

    typedef void (*PFN)();
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
    pfn();
    delete ee;
}

Одной стразности было то, что без окончательного включения EE NULL. Причудливый

Для генерации My TST.BC я использовал http://llvm.org/demo/index.cgi и средний инструмент командной строки LLVM.

23
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: