InstrProf: Treat functions with a coverage map but no profile as unreached

If we have a coverage mapping but no profile data for a function,
calling it mismatched is misleading. This can just as easily be
unreachable code that was stripped from the binary. Instead, treat
these the same as functions where we have an explicit "zero" coverage
map by setting the count to zero for each mapped region.

llvm-svn: 237298
This commit is contained in:
Justin Bogner 2015-05-13 22:03:04 +00:00
parent 307b3c4c30
commit 82a645174a
2 changed files with 18 additions and 2 deletions

View File

@ -209,8 +209,9 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader,
continue;
} else if (EC != instrprof_error::unknown_function)
return EC;
} else
Ctx.setCounts(Counts);
Counts.assign(Record.MappingRegions.size(), 0);
}
Ctx.setCounts(Counts);
assert(!Record.MappingRegions.empty() && "Function has no regions");

View File

@ -222,6 +222,21 @@ TEST_F(CoverageMappingTest, uncovered_function) {
ASSERT_EQ(CoverageSegment(3, 4, false), Segments[1]);
}
TEST_F(CoverageMappingTest, uncovered_function_with_mapping) {
readProfCounts();
addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9);
addCMR(Counter::getCounter(1), "file1", 1, 1, 4, 7);
loadCoverageMapping("func", 0x1234);
CoverageData Data = LoadedCoverage->getCoverageForFile("file1");
std::vector<CoverageSegment> Segments(Data.begin(), Data.end());
ASSERT_EQ(3U, Segments.size());
ASSERT_EQ(CoverageSegment(1, 1, 0, true), Segments[0]);
ASSERT_EQ(CoverageSegment(4, 7, 0, false), Segments[1]);
ASSERT_EQ(CoverageSegment(9, 9, false), Segments[2]);
}
TEST_F(CoverageMappingTest, combine_regions) {
ProfileWriter.addFunctionCounts("func", 0x1234, {10, 20, 30});
readProfCounts();