aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Hosek <phosek@google.com>2022-03-21 18:30:35 -0700
committerPetr Hosek <phosek@google.com>2022-06-27 23:09:37 -0700
commitd1b098fc825176242afee12b8f9dc14adf5eec51 (patch)
treeddf48af65ac5122c614f1ba006a45ecf7a4e0513
parentfa596c6921159af50e69cc3be189d951521a9eb9 (diff)
downloadllvm-d1b098fc825176242afee12b8f9dc14adf5eec51.zip
llvm-d1b098fc825176242afee12b8f9dc14adf5eec51.tar.gz
llvm-d1b098fc825176242afee12b8f9dc14adf5eec51.tar.bz2
[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/D122750
-rw-r--r--llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp3
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/relative_dir/header.h1
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/relative_dir/main.c5
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmappingbin0 -> 157 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/relative_dir/main.proftext16
-rw-r--r--llvm/test/tools/llvm-cov/coverage-prefix-map.test2
-rw-r--r--llvm/test/tools/llvm-cov/relative-dir.test10
-rw-r--r--llvm/unittests/ProfileData/CoverageMappingTest.cpp4
8 files changed, 37 insertions, 4 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp
index 0bb1c57..1a18779 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 0000000..a39fce09
--- /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 0000000..26e97a5
--- /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 0000000..665aa96
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/relative_dir/main.covmapping
Binary files 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
index 0000000..ab94aa2f
--- /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 eaebae3..5e8fae4 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 0000000..1fc902b
--- /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/Inputs/relative_dir --check-prefix=REPORT %s
+
+# REPORT: {{^}}[[DIR]]{{/|\\}}header.h{{.*}}
+# REPORT: {{^}}TOTAL{{.*}}100.00%
diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp
index cc4c953..758398d 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);
}
}
}