在此方法中,要声明依赖的pass是填充在AnalysisUsage这个对象中的,具体方法如下:
如果本pass执行之前需要依赖其它pass的执行,那么可以使用这两种方法中的一种来添加需要执行的pass。对于单个pass使用 AnalysisUsage::addRequired<>添加。
若所需要先执行的pass过多形成Analysis链,则使用第二种方法: addRequiredTransitive<>添加所有的pass。
考虑另外一种情况,当某一个pass经常会被用到时,我们希望它的结果可以暂时保存避免经常重复进行计算,那么就需要使用下面的方法:
AnalysisUsage::addPreserved<>
它用来暂时保存某个pass的结果。
Pass::getAnalysis<>方法提供了一种访问依赖pass的方式,它使用一些简单的模板参数来标志对应的pass里的class,它返回了访问这些class的接口:
这个方法返回的是 LoopInfoWrapperPass 对应的 getLoopInfo 方法的接口,不过在这之前,你需要将 LoopInfoWrapperPass 声明为一个addRequired Pass。
module级的pass可以返回一个函数级的接口:
在上面的例子中, runOnFunction 和 DominatorTree 由passmanager调用并返回接口给当前的pass。
详细参考
在查找可以看到。LLVM与GCC在三段式架构上并没有本质区别。输出存入文件在查找可以看到,LLVM与其它编译器最大的差别是,它不仅仅是CompilerCollection,也是LibrariesCollection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。
LLVM工具通过调用LLVM的一部分库,实现库的功能,通常使用编译器或者开发编译器的人会用到这些工具。
这是一个在LLVM IR级别做程序优化的工具,输入和输出都是LLVM IR。编译器,或者基于LLVM做优化的开发者通常会使用这一标准工具来查看优化的效果。它也提供了很多option, 可以执行某一特定的pass。
这是微观意义上的LLVM编译器,不同于gcc的编译器,它的输入是LLVM IR,输出是汇编文件或者是目标文件。通过-filetype=asm或者-filetype=obj来指定输出是汇编文件还是目标文件,若生成是目标文件,llc会调用LLVM中的汇编输出的代码库来工作(注意这个汇编器和gcc的汇编器也不同,它输入的是MI,是一种后端的中间表示)。除此之外,还可以用-On来指定优化级别(llc默认优化级别是-O2),或者其他一些参数。
(.bc文件换成.ll文件也可以)
这是LLVM汇编器,它输入汇编文件,输出目标文件, 类似于gnu中的as命令。同时,它也可以反汇编,指定特殊参数(–disassemble)就行。可以发现,llc和llvm-mc都会调用到输出目标文件的库,也就是MCObjectStreamer。
这个工具是LLVM IR的解释器,也是一个JIT编译器。LLVM可以把C语言翻译成LLVM IR,然后解释执行,与Java的那一套类似,这也是最初LLVM编写时的实现(一个虚拟机运行IR)。
最早看到这个工具,以为是链接器,其实它是IR级别的链接器,链接的是IR文件。谈到这里,可以说一下LLVM针对多个源文件编译时的两种目标码输出方式。
第一种是LLVM先通过前端把每个源文件单独翻译成IR级别,然后用llvm-link链接成一个IR,然后再经过优化、后端等步骤生成目标文件,使用llvm-link的同时,可以使用链接时优化。不过需要注意,这种方式同样需要最终调用链接器,将这个目标文件链接成可执行文件。
第二种是LLVM通过前端把每个源文件单独翻译后,再单独经过优化、后端等工作,将每个源文件生成目标文件,之后再调用链接器,将所有目标文件链接成可执行文件。
这是针对LLVM IR的汇编器,其实名字里带as,实际上不是gcc那个as,它的功能是将.ll文件翻译为.bc文件,LLVM项目里,.ll称为LLVM汇编码,所以llvm-as也就是IR的汇编器了。
与llvm-as刚好相反,IR的反汇编器,用来将.bc文件翻译为.ll文件。
最后也提一下clang,它也是现在LLVM项目中一个很重要的前端工具。clang能够调用整个编译器的流程,也就是上边其他工具调用的库,它很多都同样会调用。clang通过指定-emit-llvm参数,可以配合-S或-c生成.ll或.bc文件,这样我们就能把Clang的部分和LLVM的后端分离开来独立运行,对于观察编译器流程来说,很实用。
还有一些其他工具,就不举例了,可以查看LLVM项目路径下/src/tools/中查看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)