有没有办法防止发出的 LLVM IR 删除未使用的函数?

Bha*_*waj 4 volatile llvm rust llvm-ir

rustc我正在尝试分析前端发出的 LLVM-IR 。该计划是针对特定语言元素发出 IR。是否有这样的元素列表和IR代码模板映射或列表?

编译器足够智能,可以删除发出的 IR 中未使用的函数:除非使用 打印到控制台println!,否则编译器将删除所有使用的函数。

这也不太有效,话虽如此,它x不会在任何地方使用,也不会在x被覆盖时使用。

let x = function();
Run Code Online (Sandbox Code Playgroud)

Rust 中是否有某种限定符,以便发出的 IR 保留所有功能?

Mat*_* M. 5

是否有这样的元素列表和IR代码模板映射或列表?

代码rustc

这似乎是开玩笑,但这实际上是唯一可用的答案。

Rust 的 ABI 并不稳定,特别是因为 Rust 开发人员希望保留在出现更好的执行方式时更改这些事情的能力。

这适用于结构的内存表示、调用约定等......

Rust 中是否有某种限定符,以便发出的 IR 保留所有功能?

保留函数的最简单方法是:

  • 编译为库并标记函数pub

也可以使用#[inline(never)],但这更脆弱,因为智能链接器可能会意识到该函数永远不会被调用。使符号在外部可用会迫使链接器保留它。