Извлечение LLVM :: Module из LLVM :: ModuleRef - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать простое устройство чтения битовых кодов (а не выделенный проход, чтобы можно было легче отлаживать), и у меня возникли некоторые проблемы при извлечении модуля. Вот что у меня внутри main:

LLVMModuleRef module;    
char *message = nullptr;
LLVMMemoryBufferRef memoryBuffer;

LLVMCreateMemoryBufferWithContentsOfFile(
    argv[1],
    &memoryBuffer,
    &message);

LLVMParseBitcode2(memoryBuffer,&module);

// for (auto func:module->getFunctionList())
{
    /* ... */
}

Как мне извлечь модуль из LLVMModuleRef ? Конечно, я упускаю что-то тривиальное здесь.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я также прилагаю полное решение для копирования и вставки, надеясь, что оно кому-нибудь пригодится.

Вот мой main.cpp файл:

/**********************/
/* LLVM INCLUDE FILES */
/**********************/
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/IR/LLVMContext.h"

/**************/
/* NAMESPACES */
/**************/
using namespace std;
using namespace llvm;

int main(int argc, char **argv)
{
    LLVMContext ctx;
    SMDiagnostic Err;
    unique_ptr<Module> M = parseIRFile(argv[1],Err,ctx);

    if (M)
    {
        Module *module = M.get();
        for (auto
            func  = module->begin();
            func != module->end();
            func++)
        {
            errs() << func->getName() << "\n";
        }
    }

    return 0;
}

А здесьмой CMakeLists.txt файл:

################
# PROJECT NAME #
################
project(my_bc_reader)

#########################
# CMAKE MINIMUM VERSION #
#########################
cmake_minimum_required(VERSION 3.4.3)

####################
# LLVM INSTALL DIR #
####################
set(LLVM_INSTALL_DIR "~/GIT/llvm-6.0.0/build" CACHE STRING "An LLVM install directory.")

###############
# MODULE PATH #
###############
list(APPEND CMAKE_MODULE_PATH ${LLVM_INSTALL_DIR}/lib/cmake/llvm)

################
# INCLUDE LLVM #
################
include(LLVMConfig)

###########
# ADD SRC #
###########
add_executable(my_bc_reader ~/Downloads/main.cpp)

################
# INCLUDE DIRS #
################
target_include_directories(my_bc_reader PUBLIC ${LLVM_INCLUDE_DIRS})

#############
# LINK LIBS #
#############
target_link_libraries(my_bc_reader PUBLIC LLVMIRReader)

А потом просто:

$ ./my_bc_reader ./some_input.bc
0 голосов
/ 19 ноября 2018

Почему вы смешиваете API C и C ++?

Если вы хотите работать с llvm::Module, я предполагаю, что вы кодируете в C ++, поэтому просто используйте API C ++ для разбора битового кода:

    #include "llvm/IRReader/IRReader.h"

    SMDiagnostic Err;
    LLVMContext ctx;
    unique_ptr<Module> M = parseIRFile(path, Err, ctx);

    if (!M) {
        Err.print("Error loading bitcode", errs());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...