Clang++ PGO:空.profraw

Mar*_*gno 1 c++ optimization clang pgo


我正在寻求有关 Clang 配置文件引导优化问题的帮助。我使用的是 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-生成 src/foo2.cpp -o obj/foo2.o
    clang++ -c --std=c++0x -O3 -flto -fprofile-instr-生成 src /foo3.cpp -o obj/foo3.o
  • 然后我链接对象:
    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 文件发出警告“警告:文件 foo*.cpp 没有可用的配置文件数据”。

    谁能帮助我尝试了解问题出在哪里?先感谢您!

  • Mar*_*gno 6

    解决了。问题是配置文件仅在正常退出(返回或退出)的情况​​下生成,而在我的代码中,主文件以 _exit 结尾。