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

标签 rust llvm volatile llvm-ir

我正在尝试分析 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 开发人员希望在出现更好的执行方式时保留更改这些类型的能力。

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

Is there some sort of qualifier in Rust so that emitted IR retains all the functions?

保留功能的最简单方法是:

  • 编译为库并标记函数pub

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

关于rust - 有没有办法防止发出的 LLVM IR 删除未使用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136775/

相关文章:

rust - Fmt::Display 'Cleaner' 比 Fmt::Debug 怎么样?

rust - 如何使用Default初始化具有通用const长度的数组?

generics - 在使用 Option::None 时,有没有办法提示编译器使用某种默认泛型类型?

c++ - LLVM 段错误/需要使用指令而不是指令*

vector - 索引向量的向量

c++ - std::vector<T> 编译错误 "T cannot appear in a constant-expression"

c++ - LLVM 中编译单元的正确抽象是什么?

java - 将对象引用存储到 volatile 字段中

c - —"volatile void function( ... )"是做什么的?

c - 评估/访问结构