wllvm安装及使用步骤说明
第1步:wllvm安装
- 如果不需要使用开发版本,可以直接通过指令
(sudo) pip install wllvm来安装 - 如果需要使用开发版本
- (可选)安装
anaconda以管理python环境 - 下载
wllvm源码项目:git clone https://github.com/travitch/whole-program-llvm - 进入
wllvm项目目录并通过pip命令安装:cd whole-program-llvmsudo pip install -e .
- (可选)也可以将
wllvm安装到虚拟python环境中以避免全局安装virtualenv venvsource venv/bin/activatepip 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编译项目的MakefileCC=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; donefor 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为例)


