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.

    3

    Другие решения

    Других решений пока нет …

    По вопросам рекламы [email protected]