diff --git a/llvm/lib/ProfileData/GCOV.cpp b/llvm/lib/ProfileData/GCOV.cpp --- a/llvm/lib/ProfileData/GCOV.cpp +++ b/llvm/lib/ProfileData/GCOV.cpp @@ -13,6 +13,7 @@ #include "llvm/ProfileData/GCOV.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/Config/llvm-config.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Support/Debug.h" @@ -662,6 +663,8 @@ if (f.startLine >= si.startLineToFunctions.size()) si.startLineToFunctions.resize(f.startLine + 1); si.startLineToFunctions[f.startLine].push_back(&f); + SmallSet lines; + SmallSet linesExec; for (const GCOVBlock &b : f.blocksRange()) { if (b.lines.empty()) continue; @@ -670,9 +673,9 @@ si.lines.resize(maxLineNum + 1); for (uint32_t lineNum : b.lines) { LineInfo &line = si.lines[lineNum]; - if (!line.exists) + if (lines.insert(lineNum).second) ++summary.lines; - if (line.count == 0 && b.count) + if (b.count && linesExec.insert(lineNum).second) ++summary.linesExec; line.exists = true; line.count += b.count; diff --git a/llvm/test/tools/llvm-cov/gcov/Inputs/tmpl.cpp b/llvm/test/tools/llvm-cov/gcov/Inputs/tmpl.cpp new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-cov/gcov/Inputs/tmpl.cpp @@ -0,0 +1,4 @@ +template +int test() { return N; } + +int main() { return test<1>() + test<2>(); } diff --git a/llvm/test/tools/llvm-cov/gcov/Inputs/tmpl.gcda b/llvm/test/tools/llvm-cov/gcov/Inputs/tmpl.gcda new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@ +T-NEXT: 2: 2:int test() { return N; } +T-NEXT: -: 3: +T-NEXT: 1: 4:int main() { return test<1>() + test<2>(); }