c 源碼到 LLVM 匯編碼
$clang -emit-llvm -S multiply.c -o multiply.ll
IR 到bytecode
llvm-as test.ll -o test.bc
llvm-as 為LLVM 的匯編器
LLVM 靜態(tài)編譯器llc
將llvm bytecoe 轉(zhuǎn)換為目標(biāo)平臺的匯編碼
llc test.bc -o test.s
或
clang -S test.bc -o test.s -fomit-frame-pointer # 使用clang 前端
在以上命令中加入-march=architechture 指定目標(biāo)構(gòu)架的匯編碼
,-mcpu=cpu 指定cpu , -reg allow = baseic /greedy/fast/pbqp 指定寄存器分配類型
將LLVM bitcode 轉(zhuǎn)回LLVM 匯編碼
llvm-dis test.bc -o test.ll
轉(zhuǎn)換LLVM IR
opt -passname input.ll -o output.ll
如:
clang -emit-llvm -S multiply.c -o multiply.ll
用opt , 優(yōu)化內(nèi)存訪問
opt -mem2reg -S multiply.ll -o multiply1.ll
將多個bc 鏈接成單個bc
llvm-link test1.bc test2.bc -o output.bc
執(zhí)行LLVM bitcode
lli output.bc
clang 前端
$clang test.c
編譯得到可執(zhí)行文件
-E 調(diào)用預(yù)編譯器
$clang -S test.c -o - 對到test.c 測試碼的機器碼
llgo 編譯器是LLVM 的僅使用Go 語言寫的Go語言前端
DragonEgg
DragonEgg 是一個GCC 的插件, 它使GCC 能夠使用LLVM 優(yōu)化器和代碼生成器來取代GCC 自己的優(yōu)化器和代碼生成器
$gcc testprog.c -S -O1 -o - fplugin=./dragonegg.so