2

如果我用cargo rustc -- --emit=llvm-ir编译器编译将发出 LLVM IR。

以下是 Rust 使用的 LLVM 通行证。对发出的 IR 执行了哪些 LLVM 传递(如果有)?

有什么方法可以指定在发出 IR 之前要执行哪些传递?

4

1 回答 1

3

对发出的 IR 执行了哪些 LLVM 传递(如果有)?

如果您使用的是 nightly 编译器,您可以使用-Z print-llvm-passes让 LLVM 打印运行的通行证。我建议传入,-Z no-parallel-llvm-C codegen-units=1可以使输出更清晰,重复更少。

$ rustc -C codegen-units=1 -Z no-parallel-llvm -Z print-llvm-passes 1.rs

Pass Arguments:  -tti -targetlibinfo -verify -ee-instrument
Target Transform Information
Target Library Information
  FunctionPass Manager
    Module Verifier
    Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
Pass Arguments:  -tti -assumption-cache-tracker -profile-summary-info -targetlibinfo -forceattrs -basiccg -always-inline
Target Transform Information
Assumption Cache Tracker
Profile summary info
Target Library Information
  ModulePass Manager
    Force set function attributes
    CallGraph Construction
    Call Graph SCC Pass Manager
      Inliner for always_inline functions
...

(该-Z print-llvm-passes标志相当于-C llvm-args=-debug-pass=Structurewhich is used on stable rustc。但是,没有-Z no-parallel-llvm输出是非常不可读的。)


有什么方法可以指定在发出 IR 之前要执行哪些传递?

-C passes您可以使用参数附加额外的通行证。您也可以使用 清除默认优化通道-C no-prepopulate-passes。例子:

$ rustc -C passes=print-alias-sets 1.rs

Alias sets for function 'Alias sets for function '_ZN3std3sys4unix7process14process_common8ExitCode6as_i3217h65e06df78d6f4a47E':
_ZN3std2rt10lang_start17hd8fe8cd552faf2aaE':
...
于 2018-06-03T17:53:01.520 回答