From 42ab8c0a90c2c0017d786d6aa180e5114ac04749 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 13 May 2015 22:03:04 +0000 Subject: [PATCH] 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 --- lib/ProfileData/CoverageMapping.cpp | 5 +++-- unittests/ProfileData/CoverageMappingTest.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/ProfileData/CoverageMapping.cpp b/lib/ProfileData/CoverageMapping.cpp index db70ef219aa5..bbac5c26b1eb 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 c82ed66e53e2..a0995fbbc028 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();