c 源码到 LLVM 汇编码
$clang -emit-llvm -S multiply.c -o multiply.ll
IR 到bytecode
llvm-as test.ll -o test.bc
llvm-as 为LLVM 的汇编器
LLVM 静态编译器llc
将llvm bytecoe 转换为目标平台的汇编码
llc test.bc -o test.s
或
clang -S test.bc -o test.s -fomit-frame-pointer # 使用clang 前端
在以上命令中加入-march=architechture 指定目标构架的汇编码
,-mcpu=cpu 指定cpu , -reg allow = baseic /greedy/fast/pbqp 指定寄存器分配类型
将LLVM bitcode 转回LLVM 汇编码
llvm-dis test.bc -o test.ll
转换LLVM IR
opt -passname input.ll -o output.ll
如:
clang -emit-llvm -S multiply.c -o multiply.ll
用opt , 优化内存访问
opt -mem2reg -S multiply.ll -o multiply1.ll
将多个bc 链接成单个bc
llvm-link test1.bc test2.bc -o output.bc
执行LLVM bitcode
lli output.bc
clang 前端
$clang test.c
编译得到可执行文件
-E 调用预编译器
$clang -S test.c -o - 对到test.c 测试码的机器码
llgo 编译器是LLVM 的仅使用Go 语言写的Go语言前端
DragonEgg
DragonEgg 是一个GCC 的插件, 它使GCC 能够使用LLVM 优化器和代码生成器来取代GCC 自己的优化器和代码生成器
$gcc testprog.c -S -O1 -o - fplugin=./dragonegg.so