From 82a645174ac3ce1ba1336e0187f297007a8ef403 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. llvm-svn: 237298 --- llvm/lib/ProfileData/CoverageMapping.cpp | 5 +++-- .../unittests/ProfileData/CoverageMappingTest.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ProfileData/CoverageMapping.cpp b/llvm/lib/ProfileData/CoverageMapping.cpp index db70ef219aa5..bbac5c26b1eb 100644 --- a/llvm/lib/ProfileData/CoverageMapping.cpp +++ b/llvm/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/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp index c82ed66e53e2..a0995fbbc028 100644 --- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp +++ b/llvm/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();