[llvm] 24563b8 - [llvm-cov] Normalize paths by removing dots
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 15 15:36:17 PDT 2023
Author: Oleksii Odynochenko
Date: 2023-06-15T15:35:13-07:00
New Revision: 24563b8d26aaae70e2cdc52ed6dd36b0a9588adf
URL: https://github.com/llvm/llvm-project/commit/24563b8d26aaae70e2cdc52ed6dd36b0a9588adf
DIFF: https://github.com/llvm/llvm-project/commit/24563b8d26aaae70e2cdc52ed6dd36b0a9588adf.diff
LOG: [llvm-cov] Normalize paths by removing dots
We were producing inconsistent results when a file appeared multiple
times in gcno/gcda files if the instances had differing relative paths.
This patch unifies filenames, so coverage results are merged.
Patch by Oleksii Odynochenko. Thanks!
Differential Revision: https://reviews.llvm.org/D152453
Added:
Modified:
llvm/include/llvm/ProfileData/GCOV.h
llvm/lib/ProfileData/GCOV.cpp
llvm/test/tools/llvm-cov/gcov/Inputs/test_no_gcda.h.gcov
llvm/test/tools/llvm-cov/gcov/Inputs/test_no_options.h.gcov
llvm/test/tools/llvm-cov/gcov/basic.test
llvm/test/tools/llvm-cov/gcov/gcov-fake-4.2.c
llvm/test/tools/llvm-cov/gcov/intermediate-format.test
Removed:
################################################################################
diff --git a/llvm/include/llvm/ProfileData/GCOV.h b/llvm/include/llvm/ProfileData/GCOV.h
index fe56f84f28b69..183407d4c1838 100644
--- a/llvm/include/llvm/ProfileData/GCOV.h
+++ b/llvm/include/llvm/ProfileData/GCOV.h
@@ -214,6 +214,9 @@ class GCOVFile {
SmallVectorImpl<std::unique_ptr<GCOVFunction>>::const_iterator>;
iterator begin() const { return iterator(functions.begin()); }
iterator end() const { return iterator(functions.end()); }
+
+private:
+ unsigned addNormalizedPathToMap(StringRef filename);
};
struct GCOVArc {
diff --git a/llvm/lib/ProfileData/GCOV.cpp b/llvm/lib/ProfileData/GCOV.cpp
index e922f8cff9e60..1e70431a1fae1 100644
--- a/llvm/lib/ProfileData/GCOV.cpp
+++ b/llvm/lib/ProfileData/GCOV.cpp
@@ -140,10 +140,7 @@ bool GCOVFile::readGCNO(GCOVBuffer &buf) {
if (version >= GCOV::V900)
fn->endColumn = buf.getWord();
}
- auto r = filenameToIdx.try_emplace(filename, filenameToIdx.size());
- if (r.second)
- filenames.emplace_back(filename);
- fn->srcIdx = r.first->second;
+ fn->srcIdx = addNormalizedPathToMap(filename);
identToFunction[fn->ident] = fn;
} else if (tag == GCOV_TAG_BLOCKS && fn) {
if (version < GCOV::V800) {
@@ -326,6 +323,19 @@ void GCOVFile::print(raw_ostream &OS) const {
LLVM_DUMP_METHOD void GCOVFile::dump() const { print(dbgs()); }
#endif
+unsigned GCOVFile::addNormalizedPathToMap(StringRef filename) {
+ // unify filename, as the same path can have
diff erent form
+ SmallString<256> P(filename);
+ sys::path::remove_dots(P, true);
+ filename = P.str();
+
+ auto r = filenameToIdx.try_emplace(filename, filenameToIdx.size());
+ if (r.second)
+ filenames.emplace_back(filename);
+
+ return r.first->second;
+}
+
bool GCOVArc::onTree() const { return flags & GCOV_ARC_ON_TREE; }
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_gcda.h.gcov b/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_gcda.h.gcov
index 0e080532853f9..246a9512707b3 100644
--- a/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_gcda.h.gcov
+++ b/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_gcda.h.gcov
@@ -1,4 +1,4 @@
- -: 0:Source:./test.h
+ -: 0:Source:test.h
-: 0:Graph:test.gcno
-: 0:Data:-
-: 0:Runs:0
diff --git a/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_options.h.gcov b/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_options.h.gcov
index 98b60454d4368..127e46d0467e8 100644
--- a/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_options.h.gcov
+++ b/llvm/test/tools/llvm-cov/gcov/Inputs/test_no_options.h.gcov
@@ -1,4 +1,4 @@
- -: 0:Source:./test.h
+ -: 0:Source:test.h
-: 0:Graph:test.gcno
-: 0:Data:test.gcda
-: 0:Runs:1
diff --git a/llvm/test/tools/llvm-cov/gcov/basic.test b/llvm/test/tools/llvm-cov/gcov/basic.test
index 4a3b81ce2b7e3..5313fe2d7a69a 100644
--- a/llvm/test/tools/llvm-cov/gcov/basic.test
+++ b/llvm/test/tools/llvm-cov/gcov/basic.test
@@ -43,14 +43,14 @@ RUN: llvm-cov gcov -n -t test.c | count 0
RUN: llvm-cov gcov test_paths.cpp 2>/dev/null | FileCheck %s --check-prefix=MISSING
RUN: ls a.c.gcov
-MISSING: File 'src/./n/../a.c'
+MISSING: File 'src/a.c'
MISSING: Creating 'a.c.gcov'
# Preserve paths. This mangles the output filenames.
RUN: llvm-cov gcov -p test_paths.cpp 2>/dev/null | FileCheck %s --check-prefix=PRESERVE
-RUN: ls src#n#^#a.c.gcov
-PRESERVE: File 'src/./n/../a.c'
-PRESERVE: Creating 'src#n#^#a.c.gcov'
+RUN: ls src#a.c.gcov
+PRESERVE: File 'src/a.c'
+PRESERVE: Creating 'src#a.c.gcov'
# Long file names.
RUN: llvm-cov gcov -l test_paths.cpp
@@ -58,11 +58,11 @@ RUN: ls test_paths.cpp##a.c.gcov
# Long file names and preserve paths.
RUN: mkdir -p src && llvm-cov gcov -lp -gcno test_paths.gcno -gcda test_paths.gcda src/../test_paths.cpp
-RUN: ls src#^#test_paths.cpp##src#n#^#a.c.gcov
+RUN: ls src#^#test_paths.cpp##src#a.c.gcov
# Hash pathnames.
RUN: llvm-cov gcov -x -gcno test_paths.gcno -gcda test_paths.gcda src/../test_paths.cpp
-RUN: ls a.c##4784150e272908907eaa7380ca3eced8.gcov
+RUN: ls a.c##0c546a4dd99c1774b7b06e4fad16158c.gcov
# Function summaries. This changes stdout, but not the gcov files.
RUN: llvm-cov gcov test.c -f | FileCheck %s --check-prefixes=OUT,OUTFILE,OUT-F
@@ -136,7 +136,7 @@ RUN: FileCheck %s --check-prefixes=H,H-A,H-B --match-full-lines --strict-whitesp
OUT-B-NEXT:No calls
OUTFILE-NEXT:Creating 'test.cpp.gcov'
OUT-EMPTY:
- OUT-NEXT:File './test.h'
+ OUT-NEXT:File 'test.h'
OUT-NEXT:Lines executed:100.00% of 1
OUT-B-NEXT:No branches
OUT-B-NEXT:No calls
@@ -160,7 +160,7 @@ NO-GCDA: File 'test.cpp'
NO-GCDA-NEXT: Lines executed:0.00% of 43
NO-GCDA-NEXT: Creating 'test.cpp.gcov'
NO-GCDA-EMPTY:
-NO-GCDA-NEXT: File './test.h'
+NO-GCDA-NEXT: File 'test.h'
NO-GCDA-NEXT: Lines executed:0.00% of 1
NO-GCDA-NEXT: Creating 'test.h.gcov'
@@ -361,7 +361,7 @@ C-NEXT: 1: 72: return a + 8 + grid[2][3] + len;
C-NEXT: -: 73: return more_useless();
C-NEXT: -: 74:}
- H: -: 0:Source:./test.h
+ H: -: 0:Source:test.h
H-NEXT: -: 0:Graph:test.gcno
H-NEXT: -: 0:Data:test.gcda
H-NEXT: -: 0:Runs:1
diff --git a/llvm/test/tools/llvm-cov/gcov/gcov-fake-4.2.c b/llvm/test/tools/llvm-cov/gcov/gcov-fake-4.2.c
index 470a14ff7e41c..d2f99d74bfc0f 100644
--- a/llvm/test/tools/llvm-cov/gcov/gcov-fake-4.2.c
+++ b/llvm/test/tools/llvm-cov/gcov/gcov-fake-4.2.c
@@ -10,7 +10,7 @@
// CHECK-NEXT: Lines executed:84.21% of 38
// CHECK-NEXT: Creating 'test.cpp.gcov'
// CHECK-EMPTY:
-// CHECK-NEXT: File './test.h'
+// CHECK-NEXT: File 'test.h'
// CHECK-NEXT: Lines executed:100.00% of 1
// CHECK-NEXT: Creating 'test.h.gcov'
// CHECK-EMPTY:
@@ -32,7 +32,7 @@
// C-NEXT: -: 9:
// C-NEXT:8589934592: 10:
-// H: -: 0:Source:./test.h
+// H: -: 0:Source:test.h
// H-NEXT: -: 0:Graph:{{.*}}gcov-fake-4.2.gcno
// H-NEXT: -: 0:Data:{{.*}}gcov-fake-4.2.gcda
// H-NEXT: -: 0:Runs:2
diff --git a/llvm/test/tools/llvm-cov/gcov/intermediate-format.test b/llvm/test/tools/llvm-cov/gcov/intermediate-format.test
index 56bad2357262a..583e670c2d3fa 100644
--- a/llvm/test/tools/llvm-cov/gcov/intermediate-format.test
+++ b/llvm/test/tools/llvm-cov/gcov/intermediate-format.test
@@ -31,7 +31,7 @@ RUN: cmp test.cpp.gcov saved.cpp.gcov
OUT-B-NEXT:Taken at least once:86.67% of 15
OUT-B-NEXT:No calls
OUT-EMPTY:
- OUT-NEXT:File './test.h'
+ OUT-NEXT:File 'test.h'
OUT-NEXT:Lines executed:100.00% of 1
OUT-B-NEXT:No branches
OUT-B-NEXT:No calls
@@ -50,6 +50,6 @@ RUN: cmp test.cpp.gcov saved.cpp.gcov
I:lcount:33,3
I-B-NEXT:branch:33,taken
I-B-NEXT:branch:33,taken
- I:file:./test.h
+ I:file:test.h
I-NEXT:function:2,1,_ZN1AC2Ev
I-NEXT:lcount:2,1
More information about the llvm-commits
mailing list