wllvm安装及使用步骤说明
第1步:wllvm安装
- 如果不需要使用开发版本,可以直接通过指令
(sudo) pip install wllvm
来安装 - 如果需要使用开发版本
- (可选)安装
anaconda
以管理python
环境 - 下载
wllvm
源码项目:git clone https://github.com/travitch/whole-program-llvm
- 进入
wllvm
项目目录并通过pip
命令安装:cd whole-program-llvm
sudo pip install -e .
- (可选)也可以将
wllvm
安装到虚拟python
环境中以避免全局安装virtualenv venv
source venv/bin/activate
pip install -e .
- (可选)安装
第2步:配置环境变量
- 每次使用
wllvm
前需要设置以下环境变量:LLVM_COMPILER
:使用的编译器LLVM_COMPILER_PATH
:使用的编译器所在目录路径- 需要注意的是在我自己的电脑上,不能通过编译器的绝对路径来设置
LLVM_COMPILER
,因此我是先将clang
作为其绝对路径的别名写入~/.bashrc
配置文件中,然后直接通过export LLVM_COMPILER=clang
来进行设置的
~/.bashrc
文件内容参考 & 设置步骤- 其中
llvm-dis
,llvm-ar
和opt
与方便后续的处理有关
- 其中
第3步:编译构建项目
- 前置条件:所选项目需要有
CMakeLists.txt
文件 - 以
libco
项目为例,首先需要在CMakeLists.txt
文件中添加我们需要的编译参数- 添加内容:
add_compile_options(-Xclang -disable-O0-optnone -fno-discard-value-names -O0 -g)
- 添加内容:
- (可选)为了方便对于编译后得到的内容进行管理,我们在项目所在目录下新建一个目录
**-bin
,以libco
为例就是新建一个libco-bin
目录 - 然后我们在
**-bin
目录中生成指定了通过wllvm
编译项目的Makefile
CC=wllvm CXX=wllvm++ cmake ../libco/
- 接着直接在
**-bin
目录下执行命令:make
即可通过wllvm
编译项目- (FYI)所选的示例项目
libco
在CMakeLists.txt
的add source file
配置部分遗漏了一个文件,可以参考前面CMakeLists.txt
的截图手动补全
- (FYI)所选的示例项目
- 其中前缀是
example
的文件都是使用libco
库的一些示例,我们需要关心的只有以.a
结尾的文件,即libcolib.a
- 为方便后续处理,我们将其单独放入一个
ir
文件夹下
- 其中前缀是
第4步:生成IR文件
- 首先我们先生成一个针对全项目的整体
IR
文件- 通过执行命令:
extract-bc -b libcolib.a
生成后缀为.bc
的文件 - 通过执行命令:
llvm-dis libcolib.a.bc
生成后缀为.ll
的文件 - 通过执行命令:
opt --mem2reg --ipsccp --argpromotion --loop-simplify --loop-rotate -S libcolib.a.ll -o libcolib.a.ll
来进行ir
的优化处理 - 此时得到的是针对整个
libco
库的整体的IR
文件
- 通过执行命令:
- 然后我们生成项目中各个源代码文件对应的
IR
文件- 首先我们将第3步得到的
libcolib.a
文件单独移动到ir
文件夹下的新文件夹src
- 通过执行命令:
extract-bc libcolib.a
生成后缀为.bca
的文件 - 通过执行命令:
llvm-ar -x libcolib.bca
生成项目各个源码文件对应的.bc
文件 - 接下来的步骤就和生成全项目
ir
文件一样,通过llvm-dis
和opt
来处理,为了不一个一个文件地处理,我们通过shell
命令进行(注意:由于生成的.bc
文件的文件名都以.
开头,会被认为是隐藏文件,所以需要通过ls -a
才能显示)for F in $(ls -a); do llvm-dis $F; done
for FILE in $(ls -a); do opt --mem2reg --ipsccp --argpromotion --loop-simplify --loop-rotate -S $FILE -o $FILE; done
- 如此一来我们便得到了全项目的
ir
文件和项目各个源代码文件对应的ir
文件了(_),为了看起来更加直观,我将.ll
以外的文件都删掉
- 首先我们将第3步得到的
特别说明
- 如果项目编译构建的结果是可执行文件,例如上述例子中以
example
开头的那些文件,只能够生成针对整个二进制文件的ir
文件(以example_closure
为例)