Clang не генерирует файл profraw при связывании вручную - PullRequest
0 голосов
/ 13 мая 2019

Я испытываю функцию профилирования clang, используя llvm-cov и llvm-profdata. У меня все настроено с CMake, но он не генерирует default.profraw, как ожидалось. Я попробовал эти шаги вручную и обнаружил, что clang не генерирует файл default.profraw в случае, если я разделил шаги между генерацией объектных файлов и компиляцией исполняемого файла.

Например, следующие работы:

$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a binoperator.cpp main.cpp
$ ./a.out
38
Done...
$ ls -al default.profraw
-rw-rw-r--. 1 marten marten 224 May 13 13:59 default.profraw

Следующее не работает (это примерно то, что пытается сделать CMake):

$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o binoperator.cpp.o -c binoperator.cpp
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o main.cpp.o -c main.cpp
$ clang++ -o a.out binoperator.cpp.o main.cpp.o 
$ ./a.out
38
Done...
$ ls -al default.profraw
ls: cannot access 'default.profraw': No such file or directory

Почему? В чем разница? Как я могу заставить работать второй случай?

С уважением,

Мартен


Дополнительная информация:

  • main.cpp
#include "binoperator.h"

#include <iostream>

int main()
{
    BinOperator bo;

    int result = bo.add(5, 33);

    std::cout << result << std::endl;
    std::cout << "Done..." << std::endl;

    return 0;
}
  • binoperator.h

#ifndef BINOPERATOR_H
#define BINOPERATOR_H

class BinOperator
{
public:
    int add(int a, int b) const;
};

#endif
  • binoperator.cpp
#include "binoperator.h"

int BinOperator::add(int a, int b) const
{
    return (a + b);
}
$ clang --version
clang version 8.0.0 (Fedora 8.0.0-1.fc30)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

1 Ответ

0 голосов
/ 14 мая 2019

Я обнаружил, что во втором случае опции -fprofile-instr-generate -fcoverage-mapping также должны быть указаны при соединении с clang++:

$ clang++ -O0 -fprofile-instr-generate -fcoverage-mapping binoperator.cpp.o main.cpp.o -o a.out

В CMake это можно сделать с помощью target_link_options().

...