Clang++ PGO:空 .profraw

Clang++ PGO: empty .profraw


我正在寻求有关 Clang Profile Guided Optimization 问题的帮助。我正在使用 clang++-3.7,但问题仍然存在于 clang++-3.6。
如果我尝试使用虚拟代码进行 PGO,一切都很好:

  • 我用 -fprofile-instr-generate:
    clang++ -o test -fprofile-instr-generate dummy.cpp
  • 编译
  • 可执行文件 "test" 在启动时会生成一个 default.profraw 文件
  • 我可以使用 llvm-profdata merge 合并配置文件
  • 最后我可以使用配置文件集成进行编译,在 .profdata
  • 上使用 -fprofile-instr-use

    但是对于更大的项目,存在一些问题。我使用 makefile 和脚本来自动执行该过程,但这是操作流程:

  • 我编译包含 类 创建目标文件的源代码:
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src/foo1.cpp -o obj/foo1.o
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src/foo2.cpp -o obj/foo2.o
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-generate src/foo3.cpp -o obj/foo3.o
  • 然后我 link 对象:
    clang++ -O3 -flto -fprofile-instr-generate obj/foo1.o obj/foo2.o obj/foo3.o -o foobar.out
  • 此时出现问题:当我尝试用训练实例执行 foobar.out 时,生成的 .profraw 始终为空(并且执行速度正常,不会像创建 pgo 时那样慢),并且当我尝试使用配置文件集成进行编译时(在合并 .profraw 文件之后),编译器总是给我项目中每个 foo*.cpp 文件的警告 "warning: no profile data available for file foo*.cpp"。

    谁能帮我弄清楚问题出在哪里? 提前致谢!

  • 已解决。 问题是配置文件仅在正常退出(return 或退出)的情况​​下生成,而在我的代码中,主要以 _exit.

    结尾