type
status
date
slug
summary
tags
category
icon
password
LLVM 环境搭建
- Ubuntu 18.04
- LLVM 12.0.1
- CMake 3.21.1
下载 LLVM-Core 和 Clang 源代码
在 llvm-project 仓库的 Releases 界面
- llvm-12.0.1.src.tar.xz
- clang-12.0.1.src.tar.xz
因为编译 llvm-core 的 cmake 版本必须高于 3.13.4,因为 ubuntu18.0 apt 安装的 cmake 版本小于这个版本,所以需要自己下载并编译,我试过最新版的 cmake,也编译失败,最后还是老老实实用了课程推荐的 3.21.1 版本
下载 cmake3.21.1
- cmake3.21.1.tar.xz
编译 cmake
下载完进入文件夹,然后运行一下下面的指令,防止下一步报错
执行:
最后检验安装是否成功
编译 LLVM 项目
在 llvm 和 clang 源码同级目录下创建一个 build 文件夹,用于存放 camke 编译完的 LLVM 项目
同时也创建一个 shell 编译脚本
Shell 脚本内容如下:
cmake 参数解释:
- -G "Unix Makefiles":生成 Unix 下的 Makefile
- -DLLVM_ENABLE_PROJECTS="clang":除了 LLVM Core 外,还需要编译的子项目。
- -DLLVM_BUILD_TYPE=Release:在 cmake 里,有四种编译模式:Debug, Release, RelWithDebInfo, 和 MinSizeRel。使用 Release 模式编译会节省很多空间。
- -DLLVM_TARGETS_TO_BUILD="X86":默认是 ALL,选择 X86 可节约很多编译时间。
- -DBUILD_SHARED_LIBS=On:指定动态链接 LLVM 的库,可以节省空间。
make install 指令是将编译好的二进制文件和头文件等安装到本机的 /usr/local/bin 和 /usr/local/include 目录,方便后续使用
最后
然后耐心等待几个小时,最后输入
验证是否安装成功
LLVM 基本用法
LLVM 编译源代码大致分为三步
- 将源代码转换成 LLVM IR 指令(IR 指令类似于 x86 汇编)
- 通过优化器优化 LLVM IR
- 编译 LLVM IR 为可执行文件
示例
(一) 将源代码转化成 LLVM IR
LLVM IR 有两种表现形式
一种是人类可阅读的文本形式,对应文件后缀为 . ll
另一种是方便机器处理的二进制格式,对应文件后缀为 . bc
使用以下命令将源代码转化为 LLVM IR:
或
(二)优化 LLVM IR
使用 opt 指令对 LLVM IR 进行优化
Opt 是 llvm 项目里面的优化器命令行工具
- -load 加载特定的 LLVM Pass (集合) 进行优化(通常为. so 文件)
- -hlw 是 LLVM Pass 中自定义的参数,用来指定使用哪个 Pass 进行优化
这一步最难懂,说简单点,就是优化器通过这个 pass 优化这个 IR
(三) 编译 LLVM IR 为可执行文件
这一步通过 Clang 完成,从 LLVM IR 到可执行文件中间还有一系列复杂的流程,Clang 帮助我们整合了这个过程: