从 LLVM::ModuleRef 中提取 LLVM::Module
Extracting LLVM::Module from LLVM::ModuleRef
我正在尝试构建一个简单的位码reader(而不是专用通道,以便能够更轻松地进行调试)并且我有一些提取模块的问题。这是我在 main 中的内容:
LLVMModuleRef module;
char *message = nullptr;
LLVMMemoryBufferRef memoryBuffer;
LLVMCreateMemoryBufferWithContentsOfFile(
argv[1],
&memoryBuffer,
&message);
LLVMParseBitcode2(memoryBuffer,&module);
// for (auto func:module->getFunctionList())
{
/* ... */
}
我如何从 LLVMModuleRef 中提取模块?当然,我在这里遗漏了一些微不足道的东西。
为什么要混合使用 C 和 C++ API?
如果你想使用 llvm::Module
,我假设你正在用 C++ 编码,所以只需使用 C++ API 来解析位码:
#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());
}
我在这里也附上了一个完整的复制粘贴解决方案,希望它对某些人有用。
这是我的 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
我正在尝试构建一个简单的位码reader(而不是专用通道,以便能够更轻松地进行调试)并且我有一些提取模块的问题。这是我在 main 中的内容:
LLVMModuleRef module;
char *message = nullptr;
LLVMMemoryBufferRef memoryBuffer;
LLVMCreateMemoryBufferWithContentsOfFile(
argv[1],
&memoryBuffer,
&message);
LLVMParseBitcode2(memoryBuffer,&module);
// for (auto func:module->getFunctionList())
{
/* ... */
}
我如何从 LLVMModuleRef 中提取模块?当然,我在这里遗漏了一些微不足道的东西。
为什么要混合使用 C 和 C++ API?
如果你想使用 llvm::Module
,我假设你正在用 C++ 编码,所以只需使用 C++ API 来解析位码:
#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());
}
我在这里也附上了一个完整的复制粘贴解决方案,希望它对某些人有用。
这是我的 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