如何将Rust crate及其所有依赖的代码编译生成LLVM IR?
解决方法
你之前仅能拿到 crate A 的IR,是因为 cargo rustc 传入的参数仅作用于当前工作区的根 crate,不会传递给依赖项的编译过程。要让所有依赖都生成LLVM IR,可通过以下两种方案实现:
方案1:单次编译临时生效
通过 RUSTFLAGS 环境变量传递编译参数,该变量的参数会作用于所有参与编译的 crate 对应的 rustc 进程:
RUSTFLAGS="--emit=llvm-ir" cargo build
编译完成后,包括A、B在内的所有依赖的 .ll 格式IR文件都会输出到 target/debug/deps/ 目录下。如果需要release版本的IR,执行 cargo build --release 即可,对应文件会生成在 target/release/deps/ 目录。
方案2:项目级永久生效
如果需要该项目所有编译默认生成所有依赖的IR,可在项目根目录下新建/编辑 .cargo/config.toml,添加以下配置:
[build] rustflags = ["--emit=llvm-ir"]
后续直接执行 cargo build 即可自动生成所有依赖的IR文件。
可选补充配置
- 若需要保留所有未被A调用的B的代码,避免被编译器优化剔除,可添加
-C link-dead-code参数:RUSTFLAGS="--emit=llvm-ir -C link-dead-code" cargo build - 若需要将分散的多个IR文件合并为单个文件,可使用LLVM自带的
llvm-link工具:llvm-link target/debug/deps/*.ll -o merged_full.ll
内容的提问来源于stack exchange,提问作者Cactus
相关产品推荐
相关产品推荐

