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 文件内容参考 & 设置步骤
    • wllvm安装及使用说明 - 图1
      • 其中 llvm-disllvm-aropt 与方便后续的处理有关
    • wllvm安装及使用说明 - 图2

第3步:编译构建项目

  • 前置条件:所选项目需要有 CMakeLists.txt 文件
  • libco 项目为例,首先需要在 CMakeLists.txt 文件中添加我们需要的编译参数
    • 添加内容:add_compile_options(-Xclang -disable-O0-optnone -fno-discard-value-names -O0 -g)
    • wllvm安装及使用说明 - 图3
  • (可选)为了方便对于编译后得到的内容进行管理,我们在项目所在目录下新建一个目录 **-bin,以 libco 为例就是新建一个 libco-bin 目录
    • wllvm安装及使用说明 - 图4
  • 然后我们在 **-bin 目录中生成指定了通过 wllvm 编译项目的 Makefile
    • CC=wllvm CXX=wllvm++ cmake ../libco/
    • wllvm安装及使用说明 - 图5
    • wllvm安装及使用说明 - 图6
  • 接着直接在 **-bin 目录下执行命令:make 即可通过 wllvm 编译项目
    • wllvm安装及使用说明 - 图7
      • (FYI)所选的示例项目 libcoCMakeLists.txtadd source file 配置部分遗漏了一个文件,可以参考前面 CMakeLists.txt 的截图手动补全
    • wllvm安装及使用说明 - 图8
      • 其中前缀是 example 的文件都是使用 libco 库的一些示例,我们需要关心的只有以 .a 结尾的文件,即 libcolib.a
      • 为方便后续处理,我们将其单独放入一个 ir 文件夹下
      • wllvm安装及使用说明 - 图9

第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 的优化处理
    • wllvm安装及使用说明 - 图10
    • 此时得到的是针对整个 libco 库的整体的 IR 文件
  • 然后我们生成项目中各个源代码文件对应的 IR 文件
    • 首先我们将第3步得到的 libcolib.a 文件单独移动到 ir 文件夹下的新文件夹 src
    • 通过执行命令:extract-bc libcolib.a 生成后缀为 .bca 的文件
    • 通过执行命令:llvm-ar -x libcolib.bca 生成项目各个源码文件对应的 .bc 文件
    • wllvm安装及使用说明 - 图11
    • wllvm安装及使用说明 - 图12
    • 接下来的步骤就和生成全项目 ir 文件一样,通过 llvm-disopt 来处理,为了不一个一个文件地处理,我们通过 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
    • wllvm安装及使用说明 - 图13
    • 如此一来我们便得到了全项目的 ir 文件和项目各个源代码文件对应的 ir 文件了(_),为了看起来更加直观,我将 .ll 以外的文件都删掉
    • wllvm安装及使用说明 - 图14

特别说明

  • 如果项目编译构建的结果是可执行文件,例如上述例子中以 example 开头的那些文件,只能够生成针对整个二进制文件的 ir 文件(以 example_closure 为例)
    • wllvm安装及使用说明 - 图15