LLVM代码研读(1)---- 安装篇
前序:LLVM的安装
前言:这里提供了最新版本v4.0.1(2017/3)的完整安装过程,对已经有经验的LLVM/Clang完全可以忽略这些内容。相关文件与目录的组织建议尽量参考我这里的定义。以保证之后使用上的一致
1 LLVM安装前准备:
-
- OS:Ubuntu Linux 16.04 LTS 64Bits(可以是实际Linux系统,我使用Windows10 64Bits + VMWare)
- 硬件:至少120G以上硬盘。因为我们这里是为了研究LLVM/Clang,在包含Debug信息下,Build完所有源码连同Linux系统大约使用硬盘空间85G;如果使用虚拟机建议更大的可用硬盘空间
-
-
- sudo apt-get install g++-4.9g++-4.9 g++-4.9
- sudo apt-get install g++-4.9-arm-linux-gnueabig++-4.9-arm-linux-gnueabi
-
- sudo apt-get install g++-4.9-arm-linux-gnueabihf g++-4.9-arm-linux-gnueabihf
-
-
-
- 为了看ast-view生成的树,graphviz和xdot需要安装
-
- LLVM 3.8起推荐使用cmake,因此,cmake需要安装
-
2 代码下载与安装:
-
- 建立llvm源码目录,假定:llvm_source
- 建立llvm工作目录(build目录),假定:llvm_project
- 建立llvm安装目录,假定:llvm_install
- 下载llvm程序:
- 安装clang
- 安装clang extratools
- 安装compiler-rt
- 安装llvm testsuite
- OpenMP、libcxx和libcxxabi的安装:
- llvm link/debug文件安装(不建议安装)
- 代码建立与安装:
-
- Debug版本的LLVM/Clang
-
- Release版本的LLVM/Clang
-
- 关于cmake的所有设置请参考:http://www.llvm.org/docs/CMake.html
3 安装后检查:
4 其他,关于安装Windows版本:
- 尽量使用SVN抓取所有代码(或git)而不要使用现成压缩包。因为在Windows下解压缩clang存在错误(早先v3.8有这样问题,v4.0是否还存在,未曾试过)
- 需要手工安装clang,compiler-RT和extra(注意同样是由svn获得)
- 我们假定所有下载完的源码在E:/llvm路径下
- 需要安装cmake(2.8.12.2)、python(2.7)、GnuWin32几个工具;
- 运行cmake,我们这里假定需要安装的路径是:F:/llvm-install;因为VS下当前并非我们主要目的,通常我们选择默认设置就可以了;选择Configure,选择Visual Studio 14 2015。存放安装文件磁盘至少预留40G以上的空间
- 运行VisualStudio 2015,找目录F:/llvm-install
- Build正确后注意设置环境变量:
5 常见Clang工具的使用:
-
- opt:该工具的目标是针对IR阶段的程序进行优化,其输入文件必须是LLVM的Bit code,输出为相同格式的IR文件
- llc:将LLVM的IR文件转换成设备相关的汇编语言文件或Obj文件。您可以指定优化等级、Debug使能、是否针对目标平台优化。
- llvm-mc:将汇编代码生成为指定格式的OBJ文件,如:ELF文件、MachO文件、PE文件等。也可反汇编相应的OBJ文件
- lli:以解释方式或JIT运行LLVM IR文件
- llvm-link:将几个LLVM Bitcode整合为单一一个LLVM Bitcode,注意却别于我们在编译时实用的通常的Link文件,如Linux下ld
- llvm-as:将LLVM中人工可识别IR文件(ll)转换为LLVM Bitcode(BC)文件
- llvm-dis:将LLVM Bitcode(BC)转换成人可阅读的IR文件(LL)
-
- libLLVMCore:LLVM核心库,主要是:1)LLVM IR指令构造、检查。2)Pass管理
- libLLVMAnalysis:包含了IR相关的几个分析Pass:如对其别名分析、相关性分析、常量折叠(Constant folding)、循环信息、内存依赖分析、指令化简等,详细见目录:lib\Analysis
- libLLVMCodeGen:目标无关的代码生成、低级LLVM IR(机器相关)分析和转换,见相关目录:lib\CodeGen
- libLLVMTarget:由通用目标及抽象提供对目标机的访问。这些通用的抽象提供了libLLVMCodeGen中通用的后端算法和目标相关逻辑间的通讯途径。详细目录:lib\Target,其中各目录包含了已经支持的各平台
- libLLVMxxxxCodeGen(xxxx表示具体支持的平台,如X86等):具体平台相关的代码生成、转换和分析Pass,其是相关平台的后端。
- libLLVMSupport:LLVM的支持库:错误处理、整形和浮点处理、命令行解析、调试、文件支持、字符串操作等;所在目录:lib\Support
- libclangxxxx(各clang前端功能,如AST、词法分析、语法分析):提供了访问Clang前端各功能的接口。可以用于任何语言中,如Python中