用llvm简单遍历一个bc文件

来源:互联网 发布:数据 英文 编辑:程序博客网 时间:2024/06/05 04:20

我是个编程菜鸟,学了很久编程,都不知道通过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 libraryset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -std=c++14")include_directories(${LLVM_INCLUDE_DIRS})add_definitions(${LLVM_DEFINITIONS})add_executable(llvmtest DynamicValue.cppmain.cpp)llvm_map_components_to_libnames(llvm_libs support core irreader engine nativecodegen)target_link_libraries(llvmtest    pthread    dl)#link llvm componenttarget_link_libraries(llvmtest ${llvm_libs})#link llvm librarytarget_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)


0 0
原创粉丝点击