aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorMax Moroz <mmoroz@chromium.org>2018-05-08 19:26:51 +0000
committerMax Moroz <mmoroz@chromium.org>2018-05-08 19:26:51 +0000
commit0c5b6020153341f7ec27e178b348f117c957eca8 (patch)
tree4dcbdc7f0d87d5618a6d6223dd5aec59ed8aafb6 /llvm
parent65a7eb71f9a605b66b4f705a2a305d2e22e07903 (diff)
downloadllvm-0c5b6020153341f7ec27e178b348f117c957eca8.zip
llvm-0c5b6020153341f7ec27e178b348f117c957eca8.tar.gz
llvm-0c5b6020153341f7ec27e178b348f117c957eca8.tar.bz2
[Coverage] Take filenames into account when loading function records.
Summary: Don't skip functions with the same name but from different files. That change makes it possible to generate code coverage reports from different binaries compiled from different sources even if there are functions with non-unique names. Without that change, code coverage for such functions is missing except of the first function processed. Reviewers: vsk, morehouse Reviewed By: vsk Subscribers: llvm-commits, kcc Differential Revision: https://reviews.llvm.org/D46478 llvm-svn: 331801
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h3
-rw-r--r--llvm/lib/ProfileData/Coverage/CoverageMapping.cpp6
-rw-r--r--llvm/test/tools/llvm-cov/multiple-objects.test5
-rw-r--r--llvm/unittests/ProfileData/CoverageMappingTest.cpp19
4 files changed, 29 insertions, 4 deletions
diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
index 5a4098c..1ca56dc 100644
--- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
+++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
@@ -17,6 +17,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/StringRef.h"
@@ -506,7 +507,7 @@ public:
/// This is the main interface to get coverage information, using a profile to
/// fill out execution counts.
class CoverageMapping {
- StringSet<> FunctionNames;
+ DenseMap<size_t, DenseSet<size_t>> RecordProvenance;
std::vector<FunctionRecord> Functions;
std::vector<std::pair<std::string, uint64_t>> FuncHashMismatches;
std::vector<std::pair<std::string, uint64_t>> FuncCounterMismatches;
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
index 921372b..ac0793d 100644
--- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
+++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp
@@ -207,8 +207,10 @@ Error CoverageMapping::loadFunctionRecord(
else
OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]);
- // Don't load records for functions we've already seen.
- if (!FunctionNames.insert(OrigFuncName).second)
+ // Don't load records for (filenames, function) pairs we've already seen.
+ auto FilenamesHash = hash_combine_range(Record.Filenames.begin(),
+ Record.Filenames.end());
+ if (!RecordProvenance[FilenamesHash].insert(hash_value(OrigFuncName)).second)
return Error::success();
CounterMappingContext Ctx(Record.Expressions);
diff --git a/llvm/test/tools/llvm-cov/multiple-objects.test b/llvm/test/tools/llvm-cov/multiple-objects.test
index f23a16d..80bf391 100644
--- a/llvm/test/tools/llvm-cov/multiple-objects.test
+++ b/llvm/test/tools/llvm-cov/multiple-objects.test
@@ -6,6 +6,11 @@ REPORT: Filename{{ +}}Regions{{ +}}Missed Regions{{ +}}Cover
REPORT-NEXT: ---
REPORT-NEXT: header.h{{ +}}25{{ +}}14{{ +}}44.00%
+# Make sure that both use_1.cc and use_2.cc have coverage reported.
+# Before https://reviews.llvm.org/D46478, only one of them used to be reported.
+REPORT-NEXT: use_1.cc{{ +}}1{{ +}}0{{ +}}100.00%
+REPORT-NEXT: use_2.cc{{ +}}2{{ +}}0{{ +}}100.00%
+
Instructions for regenerating the test:
clang -std=c++11 -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping use_1.cc -o use_1
diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp
index 4d0f852..987f676 100644
--- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp
+++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp
@@ -859,17 +859,34 @@ TEST_P(CoverageMappingTest, load_coverage_for_expanded_file) {
TEST_P(CoverageMappingTest, skip_duplicate_function_record) {
ProfileWriter.addRecord({"func", 0x1234, {1}}, Err);
+ // This record should be loaded.
startFunction("func", 0x1234);
addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
+ // This record should be loaded.
startFunction("func", 0x1234);
addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
+ addCMR(Counter::getCounter(0), "file2", 1, 1, 9, 9);
+
+ // This record should be skipped.
+ startFunction("func", 0x1234);
+ addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
+
+ // This record should be loaded.
+ startFunction("func", 0x1234);
+ addCMR(Counter::getCounter(0), "file2", 1, 1, 9, 9);
+ addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
+
+ // This record should be skipped.
+ startFunction("func", 0x1234);
+ addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
+ addCMR(Counter::getCounter(0), "file2", 1, 1, 9, 9);
EXPECT_THAT_ERROR(loadCoverageMapping(), Succeeded());
auto Funcs = LoadedCoverage->getCoveredFunctions();
unsigned NumFuncs = std::distance(Funcs.begin(), Funcs.end());
- ASSERT_EQ(1U, NumFuncs);
+ ASSERT_EQ(3U, NumFuncs);
}
// FIXME: Use ::testing::Combine() when llvm updates its copy of googletest.