Index: lib/ProfileData/Coverage/CoverageMapping.cpp =================================================================== --- lib/ProfileData/Coverage/CoverageMapping.cpp +++ lib/ProfileData/Coverage/CoverageMapping.cpp @@ -207,10 +207,6 @@ else OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]); - // Don't load records for functions we've already seen. - if (!FunctionNames.insert(OrigFuncName).second) - return Error::success(); - CounterMappingContext Ctx(Record.Expressions); std::vector Counts; Index: test/tools/llvm-cov/multiple-objects.test =================================================================== --- test/tools/llvm-cov/multiple-objects.test +++ test/tools/llvm-cov/multiple-objects.test @@ -6,6 +6,11 @@ REPORT-NEXT: --- REPORT-NEXT: header.h{{ +}}25{{ +}}14{{ +}}44.00% +# Make sure that both use_1.cc and use_2.cc have coverage reported. +# Before https://reviews.llvm.org/D46478, only one of them used to be reported. +REPORT-NEXT: use_1.cc{{ +}}1{{ +}}0{{ +}}100.00% +REPORT-NEXT: use_2.cc{{ +}}2{{ +}}0{{ +}}100.00% + Instructions for regenerating the test: clang -std=c++11 -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping use_1.cc -o use_1 Index: unittests/ProfileData/CoverageMappingTest.cpp =================================================================== --- unittests/ProfileData/CoverageMappingTest.cpp +++ unittests/ProfileData/CoverageMappingTest.cpp @@ -865,11 +865,17 @@ startFunction("func", 0x1234); addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9); + startFunction("func", 0x1234); + addCMR(Counter::getCounter(0), "file2", 1, 1, 9, 9); + + startFunction("func", 0x1234); + addCMR(Counter::getCounter(0), "file3", 1, 1, 9, 9); + EXPECT_THAT_ERROR(loadCoverageMapping(), Succeeded()); auto Funcs = LoadedCoverage->getCoveredFunctions(); unsigned NumFuncs = std::distance(Funcs.begin(), Funcs.end()); - ASSERT_EQ(1U, NumFuncs); + ASSERT_EQ(3U, NumFuncs); } // FIXME: Use ::testing::Combine() when llvm updates its copy of googletest.