mypass.cpp #include "mypass.h" #include "llvm/IR/Instructions.h" #include "llvm/Support/raw_ostream.h" // #include "llvm/Analysis/CallGraph.h" using namespace llvm; /* 必要 */ char MyPass::ID = 0; /* 一般用于使用已注册的Pass,比如Function call graph */ void MyPass::getAnalysisU...
见上图,首先再次pass内准备需要的分析pass,之后在409行的scheduleRegions函数内真正进入核心的处理逻辑。 上图遍历此函数内所有的basicblock,以basicblock为单位进行处理,我们此次要跟的是bb2。 startBlock函数: 将此次需要处理的basicblock放入到此指令调度的实例对象中 将此basicblock放入Scheduler对象中 上图中的getSc...
复制 llvm::legacy::FunctionPassManager g_fpm(&g_module); int main() { g_fpm.add(llvm::createInstructionCombiningPass()); g_fpm.add(llvm::createReassociatePass()); g_fpm.add(llvm::createGVNPass()); g_fpm.add(llvm::createCFGSimplificationPass()); g_fpm.doInitialization(); ......
cs_malloc分配capstone的handle,用这个handle通过cs_disasm_iter把二进制翻译为汇编生成capstone的insn结构,并把函数入口地址pc保存在"asm_program_counter"这个全局变量中,这只是起到的标识的作用,在后面的pass会自动把这个优化掉.然后调用translateInstruction从_i2fm这张全局指令解析表中获取对应的translateXXX转换函数将...
LLVM 框架可以通过多种方式进行扩展,您将学习如何向 LLVM 添加新的 pass、新的机器指令,甚至是一个全新的后端。高级主题,如为不同的 CPU 架构进行编译,以及使用自己的插件和检查器扩展 clang 和 clang 静态分析器也会被涵盖。本书采用实用的方法,包含大量示例源代码,使得在自己的项目中应用所学知识变得容易。 本...
而这个vftable的地址减去一个sizeof(void*)大小后指向一个RTTICompleteObjectLocator结构体,它的相关结构体描述了这个类C++的所有多态性(运行时)相关信息,具体可以参考dynamic_cast实现原理相关文章,相关结构体如下,retdec原有代码分析x64的rtti结构体有问题,主要出在偏移量为int32类型是基于模块基址的偏移而不是绝对...
llvm::legacy::FunctionPassManager g_fpm(&g_module); int main() { g_fpm.add(llvm::createInstructionCombiningPass()); g_fpm.add(llvm::createReassociatePass()); g_fpm.add(llvm::createGVNPass()); g_fpm.add(llvm::createCFGSimplificationPass()); ...
dynamic init routine name --cpu core Specify target core Valid options are core names such as Cortex-M3 and architecture names such as 7M default is extracted from objects --debug_heap Use heap with runtime checks --default_to_complex_ranges Make "complex ranges" the default in initialize ...
而这个vftable的地址减去一个sizeof(void*)大小后指向一个RTTICompleteObjectLocator结构体,它的相关结构体描述了这个类C++的所有多态性(运行时)相关信息,具体可以参考dynamic_cast实现原理相关文章,相关结构体如下,retdec原有代码分析x64的rtti结构体有问题,主要出在偏移量为int32类型是基于模块基址的偏移而不是绝对...
实际的代码是(记住,因为我们在编写FunctionPass,我们的FunctionPass派生类只需要重载runOnFunction方法): Function* targetFunc = ...; class OurFunctionPass : public FunctionPass { public: OurFunctionPass(): callCounter(0) { } virtual runOnFunction(Function& F) { for (BasicBlock &B : F) { for...