summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Y Knight <jyknight@google.com>2019-08-28 20:35:50 +0000
committerJames Y Knight <jyknight@google.com>2019-08-28 20:35:50 +0000
commitf025968bccde3c10b1245a9619b01c13b7e2caf9 (patch)
tree332c5c08e49e8c9bfbe1a2270349257cae5e17cb
parent0b62951e1d9b746515365569f3ba5643bd48d523 (diff)
downloadbcm5719-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.h1
-rw-r--r--llvm/lib/ProfileData/Coverage/CoverageMapping.cpp23
-rwxr-xr-xllvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumentedbin0 -> 66216 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.cc5
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdatabin0 -> 640 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.rawbin0 -> 192 bytes
-rwxr-xr-xllvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumentedbin0 -> 16224 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented.cc1
-rw-r--r--llvm/test/tools/llvm-cov/multiple-objects-not-all-instrumented.test12
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
new file mode 100755
index 00000000000..1a8f9b2b209
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented
Binary files differ
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
new file mode 100644
index 00000000000..3b8a60dd720
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.profdata
Binary files differ
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
new file mode 100644
index 00000000000..650ea7ed3a4
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/instrumented.raw
Binary files differ
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
new file mode 100755
index 00000000000..2f9f3f2737a
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects_not_all_instrumented/not_instrumented
Binary files differ
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
OpenPOWER on IntegriCloud