天天看点

llvm 常见命令

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