我正在为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
然后我链接对象:
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&#34的配置文件数据;对于我项目中的每个foo * .cpp文件。
有人能帮助我试着了解问题所在吗?
提前谢谢!