mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[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
This commit is contained in:
parent
c5c13d1f6b
commit
7c66521de5
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user