From: Justin Bogner Date: Wed, 13 May 2015 22:03:04 +0000 (+0000) Subject: InstrProf: Treat functions with a coverage map but no profile as unreached X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=42ab8c0a90c2c0017d786d6aa180e5114ac04749;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237298 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ProfileData/CoverageMapping.cpp b/lib/ProfileData/CoverageMapping.cpp index db70ef219aa..bbac5c26b1e 100644 --- a/lib/ProfileData/CoverageMapping.cpp +++ b/lib/ProfileData/CoverageMapping.cpp @@ -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"); diff --git a/unittests/ProfileData/CoverageMappingTest.cpp b/unittests/ProfileData/CoverageMappingTest.cpp index c82ed66e53e..a0995fbbc02 100644 --- a/unittests/ProfileData/CoverageMappingTest.cpp +++ b/unittests/ProfileData/CoverageMappingTest.cpp @@ -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 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();