LLVM

Low-Level Virtual Machine (LLVM)是一个编译器设施,包含一系列可重用的库和良定义的接口。 它的核心采用C++进行编写,支持多种前端编程语言及多种后端硬件,第一版由UIUC于2003年发布,开源,目前由苹果维护。

LLVM对应的C/C++编译器即为clang,通常编译时间要比gcc和icc少很多。

安装

注意现在版本的LLVM都采用cmake进行编译,而不是make+configure,下面以最新7.01版本为例

svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_701/final llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_701/final clang
cd ../projects/
svn co http://llvm.org/svn/llvm-project/compiler-rt/RELEASE_701/final compiler-rt
cd ../tools/clang/tools/
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/RELEASE_701/final extra
cd ../../..
mkdir build
cd build
cmake -G "Unix Makefiles" ../
make -j24

llvm-flow

  • 前端:如clangclang++
  • 中端:opt,分析与优化
    注意Bytecodes(bc)都是可解释的(interpretable),可用lli的即时编译器(JIT)直接编译执行
  • 后端:llc,不同计算机架构

用下面的指令可以查看每一级优化的pass

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments

LLVM IR

  • RISC指令集,通常的指令码(opcodes)
    • add, mul, or, shift, branch, load, store
  • 类型表示i32
    %0 = load i32* %X, align 4!
    %add = add nsw i32 %0, 1!
    ret i32 %add!
    
  • 静态单赋值(SSA)格式
  • 控制流显性表示
    switch i32 %0, label %sw.default [
      i32 1, label %sw.bb
      i32 2, label %sw.bb1
      i32 3, label %sw.bb2
      i32 4, label %sw.bb3
      i32 5, label %sw.bb4
    ]
    

Pass

简介

  • 每一个对源程序的分析/变换的流程称为一个pass
  • 与机器无关的pass用opt调出
  • 与机器相关的pass用llc调出

写Pass

假设在lib/Transforms内创建新的文件夹名为CountOp(新的Pass)

  • 创建lib/Transforms/CountOp/CMakeLists.txt
    add_llvm_loadable_module(CountOp
    CountOp.cpp
    
    PLUGIN_TOOL
    opt
    )
    
  • lib/Transforms/CMakeLists.txt内添加
    add_subdirectory(CountOp)
    
  • 创建CountOp.cpp源代码
  • 回到先前编译的build文件夹,更新cmake,然后编译
    cmake -G "Unix Makefiles" ../
    make
    

测试

  • 编译测试文件为llvm ByteCode,注意clang版本
    export PATH=$PATH:~/llvm-project/llvm/build/bin/
    clang-7 -c -emit-llvm file.c -o file.bc
    
  • 将CountOp作用到file.bc上看结果
    ./llvm/build/bin/opt -load llvm/build/lib/CountOp.so -CountOp -disable-output file.bc
    
  • 查看控制流图
    opt –view-cfg const.cp.bc
    

参考资料

  1. A Complete Guide to LLVM for Programming Language Creators, https://mukulrathi.co.uk/create-your-own-programming-language/llvm-ir-cpp-api-tutorial/
  2. Getting Started Quickly, http://releases.llvm.org/7.0.1/docs/GettingStarted.html#getting-started-quickly-a-summary
  3. Programmer’s Manual, http://releases.llvm.org/7.0.1/docs/ProgrammersManual.html
  4. LLVM Pass, http://llvm.org/docs/WritingAnLLVMPass.html
  5. C Lattner, and V Adve, LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation, CGO, 2004