目录
概述
下面我们了解一下Llvm源码工程目录介绍、Llvm相关lib库的介绍、Llvm生成的工具链介绍,方便我们后期学习Llvm。
LLVM 源码工程目录介绍
一、docs目录
这个目录下存放Llvm各个模块的相关介绍文档。
二、examples目录
这个目录是一些使用LLVM IR和JIT的简单例子。
三、include目录
include 目录主要是包含llvm做为lib的c++和c的api头文件。在include下还有三个主要的子目录:
【1】include/llvm
所有LLVM特定的头文件和头文件子目录。子目录对应LLVM各个部分:Analysis,CodeGen,Target,Transforms,etc...
【2】include/llvm/Support
LLVM提供的通用支持工具的lib头文件目录。例如,一些C++ STL小工具和命令行选项相关的lib的头文件会放在该文件夹里。
【3】include/llvm/Config
由cmake配置的头文件。他们包括标准UNIX和C的头文件。源码可以引入这些自动处理的头文件。#include that cmake generates
四、lib目录
这个目录下存放着大部分的源码,将源码放进库中,可以使得LLVM能在一些工具间分享代码。
【1】lib/IR/
核心LLVM源文件,实现了核心的类比如:Instruction和BasicBlock
【2】lib/AsmParser/
解释汇编语言的源码
【3】lib/Bitcode/
读写字节码的源码
【4】lib/Analysis/
各种分析程序的源码,例如:Call-Graphs,Induction-Variables,Natural-Loop-Identification,etc
【5】lib/Transforms/
IR-to-IR 程序转换,例如:主动死代码消除,稀疏有条件常量传播,内联,循环不变码变化,死全局消除...
【6】lib/Target/
Target目录是目标平台指令集相关内容,内部代码量很大,具体芯片指令,版本等相关信息都在其中,最新的专有功能,比如AMD,NVIDIA相关的显卡计算目标代码生成也在其中。
【7】lib/CodeGen/
代码生成的主要部分:指令选择器,指令调度以及寄存器分配。
【8】lib/ExecutionEngine/
用于直接在JIT解释器中执行字节码的库。
【9】lib/Support/
对应于llvm/include/ADT和llvm/include/Support的头文件。
五、projects目录
这个目录严格上来说并不是llvm的一部分,是附属于llvm。这个目录可以存放用户自己利用llvm,构建的系统。
六、test目录
LLVM基础结构上的特性和回归测试以及其他健全性检查。它们旨在快速运行并覆盖很多领域,而不会很低效。
七、tools目录
这个目录下存放的是由之前介绍过的库文件build而成的可执行文件(工具),这是用户交互的主要部分。
基本命令
- llvm-as - 汇编器,将 .ll 汇编成字节码。
- llvm-dis - 反汇编器,将字节码编成可读的 .ll 文件。
- opt - 字节码优化器。
- llc - 静态编译器,将字节码编译成汇编代码。
- lli - 直接执行 LLVM 字节码。
- llvm-link - 字节码链接器,可以把多个字节码文件链接成一个。
- llvm-ar - 字节码文件打包器。
- llvm-lib - LLVM lib.exe 兼容库工具。
- llvm-nm - 列出字节码和符号表。
- llvm-config - 打印 LLVM 编译选项。
- llvm-diff - 对两个进行比较。
- llvm-cov - 输出 coverage infomation。
- llvm-profdata - Profile 数据工具。
- llvm-stress - 生成随机 .ll 文件。
- llvm-symbolizer - 地址对应源码位置,定位错误。
- llvm-dwarfdump - 打印 DWARF。
调试工具
- bugpoint - 自动测试案例工具
- llvm-extract - 从一个 LLVM 的模块里提取一个函数。
- llvm-bcanalyzer - LLVM 字节码分析器。
开发工具
- FileCheck - 灵活的模式匹配文件验证器。
- tblgen - C++ 代码生成器。
- lit - LLVM 集成测试器。
- llvm-build - LLVM 构建工程时需要的工具。
- llvm-readobj - LLVM Object 结构查看器。
更多工具信息,请参考http://llvm.org/docs/CommandGuide/index.html
八、unittests目录
这个目录下存放Llvm各个模块下的一些单元测试。
九、utils目录
LLVM源码的实用程序。有些是构建器的一部分,因为它们是代码生成的一部分。
【1】codegen-diff
codegen-diff找出LLC和LLI生成代码的不同之处。如果你在调试其中一个,另一个是正确的程序,这个工具将对你非常有用。使用命令:perldoc codegen-diff, 获取全部的用户参考手册。
【2】emacs
LLVM汇编文件和TableGen描述文件的Emacs和XEmacs语法高亮。查看README来获取更多的使用信息。
【3】llvmgrep
使用正则表达式查找每个LLVM源文件(在每个文件中执行egrep -H -n re-expression)。这是一个非常高效的基于正则表达式的源文件搜索工具。
【4】TableGen
用于生成寄存器信息,指令集描述,以及其他普通的编译器描述文件。
【5】vim
vim高亮语法文件
结论
学习Llvm库的源码目录结构,有助于我们后期学习Llvm源码。Llvm源码功能目录划分的很清晰,各个模块的耦合性也很低,是一套非常不错的开源代码。学习Llvm源码有助于我们更深入的理解编译器的工作原理和底层的编译原理相关知识。
参考资料
1. http://llvm.org/docs/GettingStarted.html

微信公众号名称:技术茶馆
微信公众号ID : Night_ZW