根据背景知识,llvm13以上通过 -fpass-plugin=libPass.so 指定被加载的 library,加载后调用该共享库的导出符号 llvmGetPassPluginInfo 获取相关信息,该函数需要返回结构体 llvm::PassPluginLibraryInfo,位于 llvm/include/llvm/Passes/PassPlugin.h。 structPassPluginL...
–FunctionPass –LoopPass –… 源自 适当的基类 Pass 3个步骤 1) 申报pass 2) 注册pass 3) 定义pass 制作ModulePass(1) ● 声明ModulePass struct CallPrinterPass : public llvm::ModulePass { static char ID; DenseMap<Function*, uint64_t> counts; CallPrinterPass() : ModulePass(ID) { } virtual...
#if _WINDOWSusingmyPassType=void(__stdcall*)(ModulePassManager&MPM);autohModule=::LoadLibraryA("QVMProtect.dll");if(!hModule){errs()<<"[QVMProtect] : QVMProtect.dll not found\n";}else{autopfn=(myPassType)::GetProcAddress(hModule,"clangAddPass");if(pfn!=NULL){errs()<<"[QVMProtect] ...
hello.bc 是给Pass输入的二进制文件,也就是Pass要处理的二进制文件。至于如何生成该文件(使用命令:clang -emit-llvm -c hello.c -o hello.bc, hello.c就是个输出helloworld的简单C语言程序),在llvm每日谈之二 LLVM IR中有介绍,后续介绍clang的时候还会继续介绍。 所有的Pass都是继承自Pass类的。Pass类的API...
对于一个编译器来说,从上层抽象的高级语言到底层的汇编语言,要经历很多个环节(pass),经历不同的表现形式。而编译优化技术有很多种,每种技术作用的编译环节不同。但是IR是一个明显的分水岭。IR以上的编译优化,不需要关心底层硬件的细节,比如硬件的指令集、寄存器文件大小等。IR以下的编译优化,需要和硬件打交道...
LLVM Pass的一些重要API也很有必要看一看:LLVM Programmer’s Manual(https://llvm.org/docs/ProgrammersManual.html) 控制流平坦化的实现代码我参考的是:OLLVM控制流平坦化源代码(https://github.com/obfuscator-llvm/obfuscator/blob/llvm-4.0/lib/Transforms/Obfuscation/...
对于一个编译器来说,从上层抽象的高级语言到底层的汇编语言,要经历很多个环节(pass),经历不同的表现形式。而编译优化技术有很多种,每种技术作用的编译环节不同。但是IR是一个明显的分水岭。IR以上的编译优化,不需要关心底层硬件的细节,比如硬件的指令集、寄存器文件大小等。IR以下的编译优化,需要和硬件打交道。LLV...
所有的Pass都是继承自Pass类的。Pass类的API文档地址: http://llvm.org/docs/doxygen/html/classllvm_1_1Pass.html 如果想仔细了解这个类的同学可以去这里看下。这里的函数都是可以通过点击跳转到源码中去的。 几个常用的Pass类的子类: The ImmutablePass class ...
对于一个编译器来说,从上层抽象的高级语言到底层的汇编语言,要经历很多个环节(pass),经历不同的表现形式。而编译优化技术有很多种,每种技术作用的编译环节不同。但是IR是一个明显的分水岭。IR以上的编译优化,不需要关心底层硬件的细节,比如硬件的指令集、寄存器文件大小等。IR以下的编译优化,需要和硬件打交道。LLV...
LLVM:LLVM为开发者提供了丰富的API,例如开发者可以通过LLVM Pass框架干预中间代码优化过程,并且配备了完善的文档 GCC:虽然GCC是开源的,但要在GCC的基础上进行扩展门槛很高、难度很大 LLVM编译过程总结 对于C/C++程序来说,LLVM的编译过程如图所示: LLVM环境搭建 ...