diff options
author | Vedant Kumar <vsk@apple.com> | 2018-08-07 22:25:36 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2018-08-07 22:25:36 +0000 |
commit | 381e9d2386facea7f2acc0f8c16a6d0731267f80 (patch) | |
tree | 6b1fff50bddd057dddcf415fba6694d35f8f870b /llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | |
parent | e302fc597afd6d7586c5c5b15cf52f6a34de8a83 (diff) | |
download | llvm-381e9d2386facea7f2acc0f8c16a6d0731267f80.zip llvm-381e9d2386facea7f2acc0f8c16a6d0731267f80.tar.gz llvm-381e9d2386facea7f2acc0f8c16a6d0731267f80.tar.bz2 |
[Coverage] Ignore 'unused' functions with non-zero execution counts
Frontends emit 'unused' coverage mapping records for functions which are
provably unused in a TU. These unused records contain a single counter
with CounterKind::Zero. However, a function may be unused in one TU and
used in another. When this happens, prefer the records with a full set
of counters instead of arbitrarily picking the first loaded record.
There is no impact on the single-TU case. In the multiple-TU case, this
resolves issues causing a function to appear unused when it's not.
Testing: check-{llvm,clang,compiler-rt}
rdar://42981322
llvm-svn: 339194
Diffstat (limited to 'llvm/lib/ProfileData/Coverage/CoverageMapping.cpp')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index cc74a42..5d9ea52b 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -207,12 +207,6 @@ Error CoverageMapping::loadFunctionRecord( else OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]); - // Don't load records for (filenames, function) pairs we've already seen. - auto FilenamesHash = hash_combine_range(Record.Filenames.begin(), - Record.Filenames.end()); - if (!RecordProvenance[FilenamesHash].insert(hash_value(OrigFuncName)).second) - return Error::success(); - CounterMappingContext Ctx(Record.Expressions); std::vector<uint64_t> Counts; @@ -230,6 +224,15 @@ Error CoverageMapping::loadFunctionRecord( assert(!Record.MappingRegions.empty() && "Function has no regions"); + // This coverage record is a zero region for a function that's unused in + // some TU, but used in a different TU. Ignore it. The coverage maps from the + // the other TU will either be loaded (providing full region counts) or they + // won't (in which case we don't unintuitively report functions as uncovered + // when they have non-zero counts in the profile). + if (Record.MappingRegions.size() == 1 && + Record.MappingRegions[0].Count.isZero() && Counts[0] > 0) + return Error::success(); + FunctionRecord Function(OrigFuncName, Record.Filenames); for (const auto &Region : Record.MappingRegions) { Expected<int64_t> ExecutionCount = Ctx.evaluate(Region.Count); @@ -240,6 +243,12 @@ Error CoverageMapping::loadFunctionRecord( Function.pushRegion(Region, *ExecutionCount); } + // Don't create records for (filenames, function) pairs we've already seen. + auto FilenamesHash = hash_combine_range(Record.Filenames.begin(), + Record.Filenames.end()); + if (!RecordProvenance[FilenamesHash].insert(hash_value(OrigFuncName)).second) + return Error::success(); + Functions.push_back(std::move(Function)); return Error::success(); } |