llvmpipe是什么显卡 LLVM

llvm是什么LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本 。

llvmpipe是什么显卡 LLVM

文章插图
LLVM相比于GCC,有哪些技术上的优势首先简要介绍一下LLVM 。LLVM是一个针对LLVM Intermediate Representation(IR,中间语言)的跨平台优化编译器,它的模块化设计很好,使得这个编译器中的很多功能可以被单独实现或者改进,这与其C++实现无法分开 。由此,LLVM可以被设计成很多语言编译器实现的后端,负责处理程序优化和跨平台,而前端只需将程序转换成LLVM IR即可 。比如说,Clang就是基于LLVM实现的C/C++编译器,它的主要功能就是将C/C++程序转换成LLVM IR,然后由LLVM负责后续的工作 。
【llvmpipe是什么显卡 LLVM】LLVM技术上的(最大)优势就在于它的模块化设计 。在LLVM中,IR的解析,优化,汇编码的生成,寄存器分配,汇编码优化以及机器码生成,各种类型的二进制文件生成全部都是接口定义清晰的模块完成的,很容易分别改进或者添加定制功能 。而且由于LLVM的C++实现,很多模块理解和使用比较容易 。这些特性使得LLVM可以很容易地被用在科研和生产实践当中 。反观GCC,模块化做得不如LLVM好,这使得它定制或者改进比较不方便 。
LLVM - 工具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/中查看 。
LLVM和GCC的区别LLVM与GCC在三段式架构上并没有本质区别 。LLVM与其它编译器最大的差别是,它不仅仅是Compiler
Collection,也是Libraries
Collection 。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方 。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法 。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来 。LLVM不仅仅是编译器,也是一个SDK 。

秒懂生活扩展阅读