[llvm] 0204fd2 - [CoverageMapping] Remove dots from paths inside the profile

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 20:53:12 PDT 2022


Author: Petr Hosek
Date: 2022-06-28T20:53:01-07:00
New Revision: 0204fd25b0ca9a7bc7db11df238d8ec9f195e67c

URL: https://github.com/llvm/llvm-project/commit/0204fd25b0ca9a7bc7db11df238d8ec9f195e67c
DIFF: https://github.com/llvm/llvm-project/commit/0204fd25b0ca9a7bc7db11df238d8ec9f195e67c.diff

LOG: [CoverageMapping] Remove dots from paths inside the profile

We already remove dots from collected paths and path mappings. This
makes it difficult to match paths inside the profile which contain
dots. For example, we would never match /path/to/../file.c because
the collected path is always be normalized to /path/file.c. This
change enables dot removal for paths inside the profile to address
the issue.

Differential Revision: https://reviews.llvm.org/D123164

Added: 
    llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h
    llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c
    llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping
    llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext
    llvm/test/tools/llvm-cov/relative-dir.test

Modified: 
    llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
    llvm/test/tools/llvm-cov/coverage-prefix-map.test
    llvm/unittests/ProfileData/CoverageMappingTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
index 0bb1c575df4b1..1a187795a8a0d 100644
--- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
+++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
@@ -175,7 +175,8 @@ Error RawCoverageFilenamesReader::readUncompressed(CovMapVersion Version,
         else
           P.assign(CWD);
         llvm::sys::path::append(P, Filename);
-        Filenames.push_back(static_cast<std::string>(P));
+        sys::path::remove_dots(P, /*remove_dot_dot=*/true);
+        Filenames.push_back(static_cast<std::string>(P.str()));
       }
     }
   }

diff  --git a/llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h b/llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h
new file mode 100644
index 0000000000000..a39fce095f2f3
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h
@@ -0,0 +1 @@
+int f() { return 0; }

diff  --git a/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c
new file mode 100644
index 0000000000000..26e97a5cd2902
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c
@@ -0,0 +1,5 @@
+#include "header.h"
+
+int main() {
+  return f();
+}

diff  --git a/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping
new file mode 100644
index 0000000000000..665aa963ebd36
Binary files /dev/null and b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping 
diff er

diff  --git a/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext
new file mode 100644
index 0000000000000..ab94aa2f17298
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext
@@ -0,0 +1,16 @@
+f
+# Func Hash:
+24
+# Num Counters:
+1
+# Counter Values:
+1
+
+main
+# Func Hash:
+24
+# Num Counters:
+1
+# Counter Values:
+1
+

diff  --git a/llvm/test/tools/llvm-cov/coverage-prefix-map.test b/llvm/test/tools/llvm-cov/coverage-prefix-map.test
index eaebae3f0db77..5e8fae4fb4a3a 100644
--- a/llvm/test/tools/llvm-cov/coverage-prefix-map.test
+++ b/llvm/test/tools/llvm-cov/coverage-prefix-map.test
@@ -13,7 +13,7 @@
 # REPORT: {{^}}bar.h{{.*}}
 # REPORT: {{^}}TOTAL{{.*}}100.00%
 
-# LCOV: SF:.{{/|\\+}}bar.h
+# LCOV: SF:bar.h
 # LCOV-NOT: SF
 
 Instructions for regenerating the test:

diff  --git a/llvm/test/tools/llvm-cov/relative-dir.test b/llvm/test/tools/llvm-cov/relative-dir.test
new file mode 100644
index 0000000000000..e0e2427fb3ea3
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/relative-dir.test
@@ -0,0 +1,10 @@
+# RUN: llvm-profdata merge %S/Inputs/relative_dir/main.proftext \
+# RUN:   -o %t.profdata
+# RUN: llvm-cov report %S/Inputs/relative_dir/main.covmapping \
+# RUN:   -instr-profile %t.profdata \
+# RUN:   -compilation-dir=%S/Inputs/relative_dir/out/default \
+# RUN:   %S/Inputs/relative_dir/header.h \
+# RUN:   | FileCheck -DDIR=%S %s
+
+# CHECK: {{^}}[[DIR]]{{/|\\}}Inputs{{/|\\}}relative_dir{{/|\\}}header.h{{.*}}
+# CHECK: {{^}}TOTAL{{.*}}100.00%

diff  --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp
index cc4c953e65351..758398daeeebc 100644
--- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp
+++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp
@@ -943,7 +943,7 @@ TEST(CoverageMappingTest, filename_roundtrip) {
     for (unsigned I = 1; I < Paths.size(); ++I) {
       SmallString<256> P(Paths[0]);
       llvm::sys::path::append(P, Paths[I]);
-      ASSERT_TRUE(ReadFilenames[I] == P);
+      ASSERT_EQ(ReadFilenames[I], P);
     }
   }
 }
@@ -969,7 +969,7 @@ TEST(CoverageMappingTest, filename_compilation_dir) {
     for (unsigned I = 1; I < Paths.size(); ++I) {
       SmallString<256> P(CompilationDir);
       llvm::sys::path::append(P, Paths[I]);
-      ASSERT_TRUE(ReadFilenames[I] == P);
+      ASSERT_EQ(ReadFilenames[I], P);
     }
   }
 }


        


More information about the llvm-commits mailing list