您的位置:首页 > 其它

用llvm简单遍历一个bc文件

2016-09-21 16:25 239 查看
我是个编程菜鸟,学了很久编程,都不知道通过main函数参数传递的强大,之前想写个llvm小程序去遍历bc文件里的指令,通过文件流的方式去读写操作,最终错漏百出。

今天带来一个简单的入门程序,这个程序遍历bc文件的所以instruction。

#include <fstream>
#include <iostream>
#include <memory>
#include <iosfwd>
#include <llvm-c/IRReader.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/IR/IRBuilder.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/Instruction.h>
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/FormattedStream.h"
using namespace llvm;
using namespace std;
int main(int argc, char** argv)
{
if (argc < 2) {
errs() << "Expected an argument - IR file name\n";
exit(1);
}

LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;

std::unique_ptr<llvm::Module> module = parseIRFile(argv[1], Err, Context);
Module *Mod = module.get();

if (!Mod) {
Err.print(argv[0], errs());
return 1;
}

for (Module::iterator FunIt = Mod->begin() ; FunIt != Mod->end() ; ++FunIt) {
for (Function::iterator i = FunIt->begin(), e = FunIt->end(); i != e; ++i) {

std::cout<< "Basic block name=" << i->getName().str() << std::endl;
for(auto j=i->begin(),f=i->end(); j!=f;j++)
{
j->dump();
}

}

}

formatted_raw_ostream *Out;

}



之前,我直接编译,老是提示有未定义函数的使用,主要是没有在cmakelist.txt中添加需要link的library。
该程序编译成功后,生成llvmtest(我在cmakelist文本中自己命名的输出文件名),

进入到该可执行文件的目录下:

./llvmtest /home/xx/test1.bc

tip:llvmtest是可执行文件,后面的bc文件是要传递进去的参数。

还是顺带贴上我的cmakelist.txt吧,之前我也是因为这个才一直没法编译,更别提实现代码测试。

project(llvmtest)
cmake_minimum_required(VERSION 2.8)

find_package(LLVM REQUIRED CONFIG)

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

# Needed to use support library

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -std=c++14")

include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})

add_executable(llvmtest
DynamicValue.cpp
main.cpp)

llvm_map_components_to_libnames(llvm_libs support core irreader engine nativecodegen)

target_link_libraries(llvmtest
pthread
dl
)

#link llvm component
target_link_libraries(llvmtest ${llvm_libs})

#link llvm library
target_link_libraries(llvmtest
LLVMX86AsmParser # MC, MCParser, Support, X86Desc, X86Info
LLVMX86Desc # MC, Support, X86AsmPrinter, X86Info
LLVMX86AsmPrinter # MC, Support, X86Utils
LLVMX86Info # MC, Support, Target
LLVMX86Utils # Core, Support
LLVMipo
LLVMScalarOpts
LLVMInstCombine
LLVMTransformUtils
LLVMipa
LLVMAnalysis
LLVMTarget
LLVMOption # Support
LLVMMCParser # MC, Support
LLVMMC # Object, Support
LLVMObject # BitReader, Core, Support
LLVMBitReader # Core, Support
LLVMCore # Support
LLVMSupport
LLVMExecutionEngine
LLVMMCJIT
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: