用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
- 用llvm简单遍历一个bc文件
- LLVM 加载bc文件
- 用BC命令做简单的benchmark
- Linux - 简单好用的计算器 bc
- python 简单遍历文件...
- llvm 文件后缀转换
- 一个简单的Mysql 遍历
- 用Visual Studio实现一个最小的LLVM JIT程序
- linux下简单好用的计算器: bc
- Linux下的简单好用的计算器bc
- LLVM(一):简单介绍
- LLVM的简单入手步骤
- Linux bc --简单的计算器
- 用C++遍历一个文件夹下面所有的文件
- 一个用递归遍历目录文件的脚本
- 用递归遍历一个目录下的所有文件
- 一个简易的bc计算器
- LLVM每日谈之三 如何创建一个LLVM工程
- GCD主队列死锁和全局队列
- win7无法获得administrator权限???? unity导入插件提示dll文件出错。对dll无法复制移动解决办法!
- c#对象反序列化与对象序列化示例详解
- CABasicAnimation animationWithKeyPath Types
- 8bit校准测试工具mtd-utils的移植和使用
- 用llvm简单遍历一个bc文件
- 第十五章课后第6题
- 嵌入式开发经验学习
- 贯通Hibernate开发:从入门到精通
- 使用MyBatis对表执行CRUD操作——基于XML的实现
- redhat使用centos中的yum源
- Launcher3_布局
- 终于把稿子审完了~
- sqoop常用命令