我使用一个单独的LLVM优化传递'mem2reg‘在一个简单的c-程序。
opt <test>.bc -mem2reg -instcount -o <test>.bc -stats执行完后,我看到stats选项没有显示收集到的统计信息,而且为了使用‘-stats’选项,必须使用启用断言的方法编译LLVM。我不明白,有人能帮我一下吗?
发布于 2016-01-21 15:10:20
它没有什么特别之处。只在+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模式下)或时,不管构建类型如何,都会收集统计信息。
相同的结构在打印统计信息的代码中被镜像。
只有通过重新构建,才能重新启用状态。如果您不需要或不想要+断言构建的开销,只需将-DLLVM_ENABLE_STATS添加到CFLAGS或在(重新)生成Makefile时将其等效。您可以在如何发布LLVM文档页面中找到有关启用断言的更多信息。
至于为什么在发布版本中禁用统计数据,这种行为是在提交fa785cb22d中引入的(2013年3月,它在3.3中登陆),这可能是为了消除由一个特性引入的内存和性能开销,除非您正在处理LLVM本身,否则这个特性很少有趣。
也就是说,像Clang这样的基于LLVM的编译器的大多数用户只想将他们的源代码转换成一个可执行文件,并可能得到有意义的诊断,而且他们肯定希望编译器在这样做的时候尽可能快。他们不太关心LLVM实现这个目标的确切方式,这是完全可以理解的。然而,这只是一个推测,因为我在邮件列表档案中找不到任何相关的讨论。
https://stackoverflow.com/questions/34804240
复制相似问题