LLVM14:配置文件引导优化产生“格式错误的仪器配置文件数据”

问题描述 投票:0回答:1

Windows 10、Ryzen 3700x、gcc 8.1.0(Posix、启用 SEH)

我正在从源代码构建 clang、llvm 和编译器-rt(PGO 工具)。我已经下载了 14.0.0 的 clang+llvm 源代码,并使用以下命令成功构建了它:

cmake -G "MinGW Makefiles" -DLLVM_ENABLE_PROJECTS="clang;lld;compiler-rt" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 ../llvm

在此之后,我可以调用 clang 并构建项目,范围从简单的“Hello, World”到更复杂的项目。我可以使用 -flto,并添加 -fuse-ld=lld。

但是,如果我尝试进行任何类型的 PGO 建设,我都会失败。例如,这是演示该问题的最小示例。

Andrew@Ryzen3700x MINGW64 ~/Desktop
$ cat test.c
#include <stdio.h>

int main() {
    printf("Hello, World!");
    return 0;
}

Andrew@Ryzen3700x MINGW64 ~/Desktop
$ clang -fprofile-instr-generate test.c

Andrew@Ryzen3700x MINGW64 ~/Desktop
$ ./a.exe
Hello, World!
Andrew@Ryzen3700x MINGW64 ~/Desktop
$ llvm-profdata merge -output=test.profdata default.profraw
warning: default.profraw: malformed instrumentation profile data
error: no profile can be merged

Andrew@Ryzen3700x MINGW64 ~/Desktop
$ llvm-profdata show default.profraw
error: default.profraw: malformed instrumentation profile data: function name is empty

我知道这个问题有很多答案,但似乎没有一个适用。我的 .profraw 文件不为空。

我会注意到,当我直接安装 LLVM/Clang(不是自己构建)时,PGO 部分确实有效。然而,几个小时后我无法解决有关 -flto 的链接问题。

clang llvm pgo
1个回答
0
投票

似乎您错过了参数“-fcoverage-mapping” 此序列适用于我的项目(作为 .bat 文件):

set LLVM_PROFILE_FILE=fuzzer.profraw 
clang++ -O0 -fprofile-instr-generate -fcoverage-mapping fuzzer.cpp -o fuzzer.exe
fuzzer.exe
llvm-profdata merge -sparse fuzzer.profraw -o fuzzer.profdata
llvm-cov report ./fuzzer.exe -instr-profile=fuzzer.profdata
© www.soinside.com 2019 - 2024. All rights reserved.