[CoverageMapping] Remove dots from paths inside the profile
authorPetr Hosek <phosek@google.com>
Tue, 22 Mar 2022 01:30:35 +0000 (18:30 -0700)
committerPetr Hosek <phosek@google.com>
Wed, 29 Jun 2022 03:53:01 +0000 (20:53 -0700)
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

llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h [new file with mode: 0644]
llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c [new file with mode: 0644]
llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping [new file with mode: 0644]
llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext [new file with mode: 0644]
llvm/test/tools/llvm-cov/coverage-prefix-map.test
llvm/test/tools/llvm-cov/relative-dir.test [new file with mode: 0644]
llvm/unittests/ProfileData/CoverageMappingTest.cpp

index 0bb1c57..1a18779 100644 (file)
@@ -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 (file)
index 0000000..a39fce0
--- /dev/null
@@ -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 (file)
index 0000000..26e97a5
--- /dev/null
@@ -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 (file)
index 0000000..665aa96
Binary files /dev/null and b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping differ
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 (file)
index 0000000..ab94aa2
--- /dev/null
@@ -0,0 +1,16 @@
+f
+# Func Hash:
+24
+# Num Counters:
+1
+# Counter Values:
+1
+
+main
+# Func Hash:
+24
+# Num Counters:
+1
+# Counter Values:
+1
+
index eaebae3..5e8fae4 100644 (file)
@@ -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 (file)
index 0000000..e0e2427
--- /dev/null
@@ -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%
index cc4c953..758398d 100644 (file)
@@ -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);
     }
   }
 }