Clang++ PGO: пустой.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
  • В конце я могу скомпилировать с интеграцией профилей, используя -fprofile-instr-use для.profdata
  • Но с большим проектом есть некоторые проблемы. Я использую make-файл и скрипт для автоматизации процесса, но это поток операций:

  • Я компилирую источники, содержащие классы, создающие объектные файлы:
    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 в моем проекте.

    Может ли кто-нибудь помочь мне, пытаясь понять, в чем проблема? Заранее спасибо!

  • 1 ответ

    Решение

    Решаемые. Проблема была в том, что профили генерировались только в случае нормального выхода (return или exit), в то время как в моем коде основное заканчивалось на _exit.

    Другие вопросы по тегам