summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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