有没有办法防止发出的 LLVM IR 删除未使用的函数?
Is there a way to prevent emitted LLVM IR from removing unused functions?
我正在尝试分析 rustc
前端发出的 LLVM-IR。计划是针对特定语言元素发出 IR。有没有这样的元素列表和IR代码模板映射或列表?
编译器足够智能,可以删除发出的 IR 中未使用的函数:,除非使用 println!
将某些内容打印到控制台,否则编译器会删除所有使用的函数。
这也不起作用,说过 x
没有在任何地方使用,也没有在 x
被覆盖时使用。
let x = function();
Rust 中是否有某种限定符,以便发出的 IR 保留所有功能?
Is there such a list of elements and IR code template mapping or list?
rustc
代码。
这似乎是开玩笑,但实际上这是唯一可用的答案。
Rust 的 ABI 并不稳定,特别是因为 Rust 开发人员希望在出现更好的执行方式时保留更改这些类型的能力。
这适用于结构的 in-memory 表示、调用约定等...
Is there some sort of qualifier in Rust so that emitted IR retains all the functions?
保留功能的最简单方法是:
- 编译为库并标记函数
pub
也可以使用 #[inline(never)]
但这更脆弱,因为智能链接器可以实现永远不会调用该函数。使符号在外部可用会迫使链接器的手保留它。
我正在尝试分析 rustc
前端发出的 LLVM-IR。计划是针对特定语言元素发出 IR。有没有这样的元素列表和IR代码模板映射或列表?
编译器足够智能,可以删除发出的 IR 中未使用的函数:,除非使用 println!
将某些内容打印到控制台,否则编译器会删除所有使用的函数。
这也不起作用,说过 x
没有在任何地方使用,也没有在 x
被覆盖时使用。
let x = function();
Rust 中是否有某种限定符,以便发出的 IR 保留所有功能?
Is there such a list of elements and IR code template mapping or list?
rustc
代码。
这似乎是开玩笑,但实际上这是唯一可用的答案。
Rust 的 ABI 并不稳定,特别是因为 Rust 开发人员希望在出现更好的执行方式时保留更改这些类型的能力。
这适用于结构的 in-memory 表示、调用约定等...
Is there some sort of qualifier in Rust so that emitted IR retains all the functions?
保留功能的最简单方法是:
- 编译为库并标记函数
pub
也可以使用 #[inline(never)]
但这更脆弱,因为智能链接器可以实现永远不会调用该函数。使符号在外部可用会迫使链接器的手保留它。