[PATCH] D157913: [Coverage] Allow Clang coverage to be used with debug info correlation.

Ellis Hoag via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 1 11:07:17 PDT 2023


ellis added a comment.

In D157913#4626007 <https://reviews.llvm.org/D157913#4626007>, @zequanwu wrote:

>> It seems that the `__llvm_prf_names` is retained in this mode. What is the overhead of this section generally? Can we instead use debug info to lookup function names?
>
> With debug info correlation enabled, `__llvm_prf_names` section will only contain functions names that are not emitted to the final binary, not even in debug info. So, this section is still much smaller compared to when not enabling debug info correlation. This is used to indicate that those functions are covered but not executed.
>
> Example from the test case above:
>
>   $ cat a.cpp
>   struct A {
>     void unused_func() {}
>   };
>   void used_func() {}
>   int main() {
>     used_func();
>     return 0;
>   }
>   $ clang -fprofile-instr-generate -fcoverage-mapping -mllvm -enable-name-compression=false -mllvm -debug-info-correlate -g a.cpp -o a.out
>   $ llvm-objdump --section=__llvm_prf_names --full-contents a.out
>   
>   a.out:  file format elf64-x86-64
>   Contents of section __llvm_prf_names:
>    7b65 14005f5a 4e314131 31756e75 7365645f  .._ZN1A11unused_
>    7b75 66756e63 4576                        funcEv

Thanks for the explanation!



================
Comment at: clang/test/CodeGen/coverage-debug-info-correlate.c:1
+// RUN: %clang_cc1 -debug-info-kind=standalone -mllvm -debug-info-correlate -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -o - %s | FileCheck %s
+
----------------
I think this test can be generalized to check that `__llvm_profile_raw_version` is emitted with or without debug info correlation.


================
Comment at: compiler-rt/test/profile/Darwin/coverage-debug-info-correlate.cpp:9
+// RUN: %clang_profgen -o %t -g -mllvm --debug-info-correlate -fcoverage-mapping %S/../Inputs/instrprof-debug-info-correlate-main.cpp %S/../Inputs/instrprof-debug-info-correlate-foo.cpp
+// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t
+// RUN: llvm-profdata merge -o %t.profdata --debug-info=%t.dSYM %t.profraw
----------------
NIT


================
Comment at: compiler-rt/test/profile/Darwin/coverage-debug-info-correlate.cpp:29
+
+// RUN: llvm-cov report --instr-profile=%t.profdata %t | FileCheck %s -check-prefix=NONAME
+
----------------
Is it worth testing that `%t.normal.profdata` emits the same coverage?


================
Comment at: llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp:1019-1029
+  if (auto E = NamesSection.takeError()) {
+    if (ProfileNames.isEmpty())
+      return std::move(E);
+    consumeError(std::move(E));
+  } else {
+    std::vector<SectionRef> NamesSectionRefs = *NamesSection;
+    if (NamesSectionRefs.size() != 1)
----------------
I don't quite understand why this was changed. Is there is a test case that covers this?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D157913/new/

https://reviews.llvm.org/D157913



More information about the llvm-commits mailing list