LLVM - 工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LLVM - 工具相关的知识,希望对你有一定的参考价值。

参考技术A 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 入门/教程

Getting Started/Tutorials — LLVM 15.0.0git documentationhttps://llvm.org/docs/GettingStartedTutorials.html

对于那些刚接触 LLVM 系统的人。

LLVM 系统入门

讨论如何使用 LLVM 基础架构快速启动和运行。从解压和编译分发到执行某些工具的一切。

LLVM 教程:目录

关于使用 LLVM 的教程。包括有关使用 LLVM 制作自定义语言的教程。

LLVM 程序员手册

介绍 LLVM 源库的总体布局、重要的类和 API,以及一些提示和技巧。

前端作者的性能提示

前端作者关于如何生成 LLVM 能够有效优化的 IR 的一系列技巧。

使用 Microsoft Visual Studio 开始使用 LLVM 系统

主要入门指南的附录,适用于在 Windows 上使用 Visual Studio 的用户。

编译器编写者的架构和平台信息

对编译器作者有用的链接列表。

MyFirstTypoFix

本教程将指导您完成对 LLVM 进行更改并将其贡献回 LLVM 项目的过程。

以上是关于LLVM - 工具的主要内容,如果未能解决你的问题,请参考以下文章

LLVM 之 IR 篇:如何编写生成 LLVM IR 的工具

Klee 的限制(LLVM 程序分析工具)

使用 LLVM-for-Arm 工具链编译 RT-Thread 源码

LLVM编译器

iOS 常用命令行工具使用方法

怎样构建一个不依赖gcc/binutils的llvm/clang Linux工具链