【问题标题】:LLVM -stats optionLLVM -stats 选项
【发布时间】:2016-01-15 04:07:03
【问题描述】:
我在一个简单的 c 程序上使用单独的 LLVM 优化传递“mem2reg”。
opt <test>.bc -mem2reg -instcount -o <test>.bc -stats
执行后我看到 stats 选项没有显示收集的统计信息,而且似乎为了使用“-stats”选项,必须在启用断言的情况下编译 LLVM。
没看懂,谁能帮帮我。
【问题讨论】:
标签:
llvm
llvm-clang
llvm-ir
llvm-gcc
llvm-c++-api
【解决方案1】:
没有什么特别之处。仅在 +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 本身。
也就是说,大多数基于 LLVM 的编译器(如 Clang)的用户只想将他们的源代码转换为可执行文件并可能接收有意义的诊断信息,并且他们肯定希望编译器在执行此操作时尽可能快。他们不太关心 LLVM 实现这一目标的确切方式,这是完全可以理解的。然而,这只是一个猜测,因为我在邮件列表档案中找不到任何相关的讨论。