diff options
author | James Y Knight <jyknight@google.com> | 2019-08-28 20:35:50 +0000 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2019-08-28 20:35:50 +0000 |
commit | f025968bccde3c10b1245a9619b01c13b7e2caf9 (patch) | |
tree | 332c5c08e49e8c9bfbe1a2270349257cae5e17cb | |
parent | 0b62951e1d9b746515365569f3ba5643bd48d523 (diff) | |
download | bcm5719-llvm-f025968bccde3c10b1245a9619b01c13b7e2caf9.tar.gz bcm5719-llvm-f025968bccde3c10b1245a9619b01c13b7e2caf9.zip |
Ignore object files that lack coverage information.
Before this change, if multiple binary files were presented, all of them must have been instrumented or the load would fail with coverage_map_error::no_data_found.
Patch by Dean Sturtevant.
Differential Revision: https://reviews.llvm.org/D66763
llvm-svn: 370257
-rw-r--r-- | llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h | 1 | ||||
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 23 | ||||
-rwxr-xr-x | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented | bin | 0 -> 66216 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.cc | 5 | ||||
-rw-r--r-- | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata | bin | 0 -> 640 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.raw | bin | 0 -> 192 bytes | |||
-rwxr-xr-x | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented | bin | 0 -> 16224 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented.cc | 1 | ||||
-rw-r--r-- | llvm/test/tools/llvm-cov/multiple-objects-not-all-instrumented.test | 12 |
9 files changed, 40 insertions, 2 deletions
diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index 11758ac4cf2..7284a67ba4a 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -527,6 +527,7 @@ public: /// Load the coverage mapping from the given object files and profile. If /// \p Arches is non-empty, it must specify an architecture for each object. + /// Ignores non-instrumented object files unless all are not instrumented. static Expected<std::unique_ptr<CoverageMapping>> load(ArrayRef<StringRef> ObjectFilenames, StringRef ProfileFilename, ArrayRef<StringRef> Arches = None); diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index afd6618e7cb..803605cd79f 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -270,6 +270,16 @@ Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load( return std::move(Coverage); } +// If E is a no_data_found error, returns success. Otherwise returns E. +static Error handleMaybeNoDataFoundError(Error E) { + return handleErrors( + std::move(E), [](const CoverageMapError &CME) { + if (CME.get() == coveragemap_error::no_data_found) + return static_cast<Error>(Error::success()); + return make_error<CoverageMapError>(CME.get()); + }); +} + Expected<std::unique_ptr<CoverageMapping>> CoverageMapping::load(ArrayRef<StringRef> ObjectFilenames, StringRef ProfileFilename, ArrayRef<StringRef> Arches) { @@ -289,12 +299,21 @@ CoverageMapping::load(ArrayRef<StringRef> ObjectFilenames, CovMappingBufOrErr.get()->getMemBufferRef(); auto CoverageReadersOrErr = BinaryCoverageReader::create(CovMappingBufRef, Arch, Buffers); - if (Error E = CoverageReadersOrErr.takeError()) - return std::move(E); + if (Error E = CoverageReadersOrErr.takeError()) { + E = handleMaybeNoDataFoundError(std::move(E)); + if (E) + return std::move(E); + // E == success (originally a no_data_found error). + continue; + } for (auto &Reader : CoverageReadersOrErr.get()) Readers.push_back(std::move(Reader)); Buffers.push_back(std::move(CovMappingBufOrErr.get())); } + // If no readers were created, either no objects were provided or none of them + // had coverage data. Return an error in the latter case. + if (Readers.empty() && !ObjectFilenames.empty()) + return make_error<CoverageMapError>(coveragemap_error::no_data_found); return load(Readers, *ProfileReader); } diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented Binary files differnew file mode 100755 index 00000000000..1a8f9b2b209 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.cc b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.cc new file mode 100644 index 00000000000..5c61d716ca1 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.cc @@ -0,0 +1,5 @@ +void f1() {} + +int main(int argc, char** argv) { + f1(); +} diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata Binary files differnew file mode 100644 index 00000000000..3b8a60dd720 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.raw b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.raw Binary files differnew file mode 100644 index 00000000000..650ea7ed3a4 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.raw diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented Binary files differnew file mode 100755 index 00000000000..2f9f3f2737a --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented.cc b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented.cc new file mode 100644 index 00000000000..4b10444b174 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented.cc @@ -0,0 +1 @@ +int main(int argc, char** argv) {} diff --git a/llvm/test/tools/llvm-cov/multiple-objects-not-all-instrumented.test b/llvm/test/tools/llvm-cov/multiple-objects-not-all-instrumented.test new file mode 100644 index 00000000000..c3a0e846bc6 --- /dev/null +++ b/llvm/test/tools/llvm-cov/multiple-objects-not-all-instrumented.test @@ -0,0 +1,12 @@ +RUN: llvm-cov export --format=lcov --instr-profile=%S/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata \ +RUN: -object %S/Inputs/multiple_objects_not_all_instrumented/not_instrumented \ +RUN: -object %S/Inputs/multiple_objects_not_all_instrumented/instrumented | FileCheck -check-prefix=FN %s + +FN:1,_Z2f1v + +Instructions for regenerating the test: + +clang -std=c++11 not_instrumented.cc -o not_instrumented +clang -std=c++11 -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping instrumented.cc -o instrumented +LLVM_PROFILE_FILE="instrumented.raw" ./instrumented +llvm-profdata merge instrumented.raw -o instrumented.profdata |