在rust语言中使用Cargo命令输出汇编文档

首先来一波效果展示:(这是我使用方法二输出的文档,使用vscode工具查看的结果)

 

正文如下: 

一、您可以使用Cargo的cargo rustc命令直接向rustc发送参数:

方法一:

1 cargo rustc -- --emit asm
2 ls target/debug/deps/<crate_name>-<hash>.s

对于优化的装配:

1 cargo rustc --release -- --emit asm
2 ls target/release/deps/<crate_name>-<hash>.s

如果您看到多个<crate_name>-<hash>-<hash>.rcgu.s档案,而不是一个<crate_name>-<hash>.s档案,请设定环境变量CARGO_INCREMENTAL=0来停用累加编译。

二、可以使用RUSTFLAGS环境变量和标准的cargo命令:

方法二:

1 RUSTFLAGS="--emit asm" cargo build
2 cat target/debug/deps/project_name-hash.s

或者在发布模式下(经过优化):

1 RUSTFLAGS="--emit asm" cargo build --release
2 cat target/release/deps/project_name-hash.s

您可以将不同的值传递给--emit参数,* 包括 *(但不限于):

  • mir( rust 中间表现法)
  • llvm-ir(LLVM中间表示法)
  • llvm-bc(LLVM字节码)
  • asm(组件)

三、现有的两个答案(使用cargo rustcRUSTFLAGS)都是使用标准工具获得汇编的最佳方法。如果您发现自己经常尝试查看汇编,您可能需要考虑使用the cargo asm subcommand。在使用cargo install cargo-asm安装它之后,您可以打印如下汇编:

方法三:

1 cargo build --release
2 cargo asm my_crate::my_function

不过,有几件事需要注意:

  • 不确定函数的路径吗?只要运行cargo asm,它就会列出所有可以检查的符号。
  • 在尝试查看程序集之前,您必须先查看cargo build --release,因为cargo asm(显然)只查看已经存在的构建构件
  • 你要检查的函数的代码必须是实际生成的。对于泛型函数来说,这意味着该函数必须用一个具体的类型进行示例化/单态化。如果你的机箱中没有这样的情况,你可以在顶层添加一个伪函数,它可以完成你想要检查的汇编的所有事情。

四、如果您只想查看汇编输出而不是保存它,例如判断它是否经过了良好的优化,那么一个简单的选项是用途:

方法四:https://rust.godbolt.org/

(don'不要忘记将-O添加到编译器选项框中)

 

总结 https://www.saoniuhuo.com/question/detail-2199731.html 链接中的回复。

posted @ 2022-12-20 14:45  莴苣&  阅读(857)  评论(0编辑  收藏  举报