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();