From 069bf8eb9250169a703f9afbb392626578f14bfa Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sun, 21 Jan 2024 18:09:30 +0900 Subject: [PATCH 1/3] CoverageMappingWriter: Emit `Decision` before `Expansion` --- .../ProfileData/Coverage/CoverageMappingWriter.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp index 1c7d8a8909c488e..e8597676003a02c 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp @@ -167,7 +167,18 @@ void CoverageMappingWriter::write(raw_ostream &OS) { return LHS.FileID < RHS.FileID; if (LHS.startLoc() != RHS.startLoc()) return LHS.startLoc() < RHS.startLoc(); - return LHS.Kind < RHS.Kind; + + // Put `Decision` before `Expansion`. + auto getKindKey = [](CounterMappingRegion::RegionKind Kind) { + return (Kind == CounterMappingRegion::MCDCDecisionRegion + ? 2 * CounterMappingRegion::ExpansionRegion - 1 + : 2 * Kind); + }; + + auto LHSKindKey = getKindKey(LHS.Kind); + auto RHSKindKey = getKindKey(RHS.Kind); + + return LHSKindKey < RHSKindKey; }); // Write out the fileid -> filename mapping. From f996d7825275153697395549df39ed2930802fbf Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 25 Jan 2024 23:40:30 +0900 Subject: [PATCH 2/3] Add the test to ProfileData/CoverageMappingTest.cpp --- .../ProfileData/CoverageMappingTest.cpp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp index 1cf497cbdc2e61f..6ccd5f016ec8854 100644 --- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp +++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp @@ -874,6 +874,42 @@ TEST_P(CoverageMappingTest, non_code_region_bitmask) { ASSERT_EQ(1U, Names.size()); } +// Test the order of MCDCDecision before Expansion +TEST_P(CoverageMappingTest, decision_before_expansion) { + startFunction("foo", 0x1234); + addCMR(Counter::getCounter(0), "foo", 3, 23, 5, 2); + + // This(4:11) was put after Expansion(4:11) before the fix + addMCDCDecisionCMR(0, 2, "foo", 4, 11, 4, 20); + + addExpansionCMR("foo", "A", 4, 11, 4, 12); + addExpansionCMR("foo", "B", 4, 19, 4, 20); + addCMR(Counter::getCounter(0), "A", 1, 14, 1, 17); + addCMR(Counter::getCounter(0), "A", 1, 14, 1, 17); + addMCDCBranchCMR(Counter::getCounter(0), Counter::getCounter(1), 1, 2, 0, "A", + 1, 14, 1, 17); + addCMR(Counter::getCounter(1), "B", 1, 14, 1, 17); + addMCDCBranchCMR(Counter::getCounter(1), Counter::getCounter(2), 2, 0, 0, "B", + 1, 14, 1, 17); + + // InputFunctionCoverageData::Regions is rewritten after the write. + auto InputRegions = InputFunctions.back().Regions; + + writeAndReadCoverageRegions(); + + const auto &OutputRegions = OutputFunctions.back().Regions; + + size_t N = ArrayRef(InputRegions).size(); + ASSERT_EQ(N, OutputRegions.size()); + for (size_t I = 0; I < N; ++I) { + ASSERT_EQ(InputRegions[I].Kind, OutputRegions[I].Kind); + ASSERT_EQ(InputRegions[I].FileID, OutputRegions[I].FileID); + ASSERT_EQ(InputRegions[I].ExpandedFileID, OutputRegions[I].ExpandedFileID); + ASSERT_EQ(InputRegions[I].startLoc(), OutputRegions[I].startLoc()); + ASSERT_EQ(InputRegions[I].endLoc(), OutputRegions[I].endLoc()); + } +} + TEST_P(CoverageMappingTest, strip_filename_prefix) { ProfileWriter.addRecord({"file1:func", 0x1234, {0}}, Err); From 723c5f571081be6e809a3cf48b2d6f07967e7526 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sun, 28 Jan 2024 11:28:14 +0900 Subject: [PATCH 3/3] Simplify --- llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp index e8597676003a02c..27727f216b05132 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp @@ -175,10 +175,7 @@ void CoverageMappingWriter::write(raw_ostream &OS) { : 2 * Kind); }; - auto LHSKindKey = getKindKey(LHS.Kind); - auto RHSKindKey = getKindKey(RHS.Kind); - - return LHSKindKey < RHSKindKey; + return getKindKey(LHS.Kind) < getKindKey(RHS.Kind); }); // Write out the fileid -> filename mapping.