我正在寻求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合并合并
最后,我可以使用.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
然后我链接对象:
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的配置文件数据”。 任何人都可以帮助我试图了解问题出在哪里? 先感谢您!