我正在使用单独的LLVM优化传递' mem2reg'在一个简单的c程序上。
opt <test>.bc -mem2reg -instcount -o <test>.bc -stats
执行后我看到stats选项没有显示收集的统计信息,似乎为了使用'-stats'选项,必须在启用断言的情况下编译LLVM。 我不明白,任何人都可以帮助我。
答案 0 :(得分:3)
没有什么特别之处。仅在+ Assert构建中收集统计信息是一项设计决策。如果您查看llvm/ADT/Statistic.h
,Statistic
类看起来像这样:
class Statistic {
public:
// Initialization stuff
#if !defined(NDEBUG) || defined(LLVM_ENABLE_STATS)
// Actually keeping track of the stat
#else
// Dummy ops that will be optimized away
#endif
};
正如您所看到的,当NDEBUG
未定义时(即使用断言构建时,例如在Release + Assers或Debug + Asserts模式下),收集统计信息或定义LLVM_ENABLE_STATS
时,无论构建类型如何。
在打印统计信息的代码中镜像了相同的结构。
您只能通过重建重新启用统计信息。如果您不需要或不需要+ Asserts构建的开销,只需在(重新)生成Makefile时将-DLLVM_ENABLE_STATS
添加到CFLAGS
或等效项。您可以在How To Release LLVM文档页面中找到有关启用断言的更多信息。
为什么在发布版本中禁用统计信息,这种行为是在commit fa785cb22d中引入的(2013年3月,它在3.3中登陆),可能是为了消除由一个很少有趣的功能引入的内存和性能开销,除非你正在研究LLVM本身。
也就是说,像Clang这样基于LLVM的编译器的大多数用户只想将他们的源代码转换为可执行文件并可能接收有意义的诊断,他们肯定希望编译器尽可能快地执行此操作。他们不太关心LLVM实现这一目标的确切方式,这完全可以理解。但是,这只是一个推测,因为我在邮件列表档案中找不到任何相关的讨论。