llvm

LLVM

llvm 是一个模块化的开源编译器框架,最早的时候是Illinois 大学的一个研究项目,早先的主要负责人是Chris Lattner。
llvm 有一个表达形式很好的IR语言(intermediate representation),高度模块化的结构,因此它可以作为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的目标代码生成功能。

其借鉴了 GCC 等传统编译器的分段设计方式,引入了高度模块化的设计。
llvm_第1张图片
正是由于贯穿编译过程的统一的IR表示,llvm 支持快速开发编程语言,添加各种前后端来完成编译器的构建。
llvm_第2张图片

Low Level Virtual Machine
A set of reusable libraries that collect of compiler technology components
Program analyzer and optimizator
Machine code generator
Clang: C based language front-end such as C, C++
Just-In-Time compiler

Implemented in C++ with well-defined interfaces: Easy to add, remove, and change funcitionality

Open source, and BSD licensed

Website: http://llvm.org/

Clang

  • clang
  • clang-format
  • clang-check
  • clang-rename
  • clang-refactor

llvm_第3张图片

llvm_第4张图片

进阶工具

  • opt
  • llc
  • lli
  • llvm-config
  • llvm-diff
  • llvm-mc
  • llvm-bcanalyzer
  • llvm-opt-report
  • bugpoint
  • llvm-stress
  • llvm-tblgen
  • llvm-mcmarkup
  • clang-offload-bundler
  • obj2yaml / yaml2obj
  • llvm-rtdyld
  • llvm-cfi-verify
  • verify-uselistorder

opt foo.ll -O1 -view-cfg

优化 opt 选项
Constant Propagation -constprop
Function Inlining -inline
Dead Code Elimination -dce
Common Sub-expression Elimination -early-cse
Loop Unrolling -loop-unroll

IR 操作

  • llvm-link
  • llvm-as
  • llvm-dis
  • llvm-extract
  • llvm-split
  • llvm-cat
  • llvm-modextract
  • llvm-lto
  • llvm-lto2

Debug Info 相关

  • llvm-dwp
  • llvm-dwarfdump
  • llvm-dsymutil

LLVM IR

  • Low level assembly like language
  • RISC-like three address code
  • Target independence
  • Infinite virtual register set
  • Static Single Assignment form
  • LLVM IR is strongly typed
  • https://llvm.org/docs/LangRef.html
IR Format
  • in-memory: binary in-memory format, used during compilation process
  • bitcode: binary on-disk format, suitable for fast loading
  • assembly: human-readable format

三种类型是等价的。bitcode file 的后缀名是 .bc;assembly file 的后缀名是 .ll

IR Generation
  • Assembly

llvm-dis: LLVM IR assembly code, llvm .bc => .ll
llc: native assembly code, llvm .bc => .s

clang -emit-llvm -S filename.c -o out.ll
opt -S xx.bc -o out.ll
llvm-dis xxx.bc -o -out.ll
  • Bitcode
clang -emit-llvm -c filename.c -o out.bc
opt xx.ll -o out.bc
llvm-as xx.ll -o out.bc

你可能感兴趣的:(LLVM)