llvm作為一套成熟的編譯體系,提供了很多指令用于不同階段的使用。通過這些指令的組合使用,可以将一個完整的編譯過程,拆分成多個步驟。
llvm-as: 将IR檔案編譯為二進制檔案,預設生成字尾名為.bc的檔案,也可以使用-o指定輸出:
llvm-as -o hello hello.ll
llvm-dis: 将二進制檔案回溯成IR檔案,生成.ll字尾的檔案
llvm-dis hello
opt: opt可以作為LLVM的優化器和分析器。如果标明-analyze就是作為分析器使用,如果沒有就是作為優化器使用。
當作為分析器時,通常會把分析結果列印到螢幕,當然少數時候也可以有其他目标方式。
當作為優化器時,opt會根據連結的動态庫和使用-load選項加載的庫做優化。
opt指令的輸入可以接受.ll格式和.bc格式的檔案。
如果-o沒有指定,opt會将結果輸出到标準輸出。
opt -S -load=xxx.so < hello.ll > hello.new.ll
llc: 将.ll或.bc檔案編譯為彙編檔案,輸出為字尾名.s的檔案
llc hello.ll
lli: 直接運作LLVM的二進制檔案。
lli hello.bc
llvm-link:将多個LLVM的二進制檔案合并為一個二進制檔案
llvm-link -o hello hello.bc bye.bc
llvm-ar:建立靜态庫,用法和ar基本一緻。
值得注意的是llvm-ar會建立一個新的符号表來統一記錄靜态庫中所有的成員,這有助于提升速度。
llvm-ar r -hello.a hello.bc bye.bc
llvm-nm: 列出LLVM二進制檔案或者靜态庫檔案中的符号表。
llvm-nm hello.a
llvm-diff:對比兩個檔案的差別,可以用來比較.ll檔案和LLVM的二進制檔案
llvm-diff hello1.ll hello2.ll
llvm-nm: 列出LLVM二進制檔案或者靜态庫檔案中的符号表。
llvm-nm hello.a
llvm-diff:對比兩個檔案的差別,可以用來比較.ll檔案和LLVM的二進制檔案
llvm-diff hello1.ll hello2.ll