diff --git a/test/tools/sancov/AArch64/print_coverage_pcs.test b/test/tools/sancov/AArch64/print_coverage_pcs.test index b71eabb8a35..d5fff4db132 100644 --- a/test/tools/sancov/AArch64/print_coverage_pcs.test +++ b/test/tools/sancov/AArch64/print_coverage_pcs.test @@ -1,4 +1,4 @@ REQUIRES: aarch64-registered-target RUN: not sancov -print-coverage-pcs %p/../Inputs/test-linux_android_aarch64 2>&1 | FileCheck %s --check-prefix=AARCH64 -AARCH64: Error: __sanitizer_cov* functions not found +AARCH64: ERROR: __sanitizer_cov* functions not found diff --git a/test/tools/sancov/validation.test b/test/tools/sancov/validation.test new file mode 100644 index 00000000000..437870cf597 --- /dev/null +++ b/test/tools/sancov/validation.test @@ -0,0 +1,6 @@ +REQUIRES: x86_64-linux +RUN: not sancov -covered-functions %p/Inputs/test-linux_x86_64 2>&1 | FileCheck --check-prefix=NOCFILE %s + +NOCFILE: WARNING: No coverage file for {{.*}}test-linux_x86_64 +NOCFILE: ERROR: No valid coverage files given. + diff --git a/tools/sancov/sancov.cc b/tools/sancov/sancov.cc index cb097436bfe..7f103ebb904 100644 --- a/tools/sancov/sancov.cc +++ b/tools/sancov/sancov.cc @@ -180,7 +180,7 @@ struct CoverageStats { // --------- ERROR HANDLING --------- static void fail(const llvm::Twine &E) { - errs() << "Error: " << E << "\n"; + errs() << "ERROR: " << E << "\n"; exit(1); } @@ -192,7 +192,7 @@ static void failIf(bool B, const llvm::Twine &E) { static void failIfError(std::error_code Error) { if (!Error) return; - errs() << "Error: " << Error.message() << "(" << Error.value() << ")\n"; + errs() << "ERROR: " << Error.message() << "(" << Error.value() << ")\n"; exit(1); } @@ -202,7 +202,7 @@ template static void failIfError(const ErrorOr &E) { static void failIfError(Error Err) { if (Err) { - logAllUnhandledErrors(std::move(Err), errs(), "Error: "); + logAllUnhandledErrors(std::move(Err), errs(), "ERROR: "); exit(1); } } @@ -1086,6 +1086,9 @@ static void readAndPrintRawCoverage(const std::vector &FileNames, static std::unique_ptr merge(const std::vector> &Coverages) { + if (Coverages.empty()) + return nullptr; + auto Result = make_unique(); for (size_t I = 0; I < Coverages.size(); ++I) { @@ -1168,11 +1171,17 @@ readSymbolizeAndMergeCmdArguments(std::vector FileNames) { CoverageByObjFile[Iter->second].push_back(FileName); }; + for (const auto &Pair : ObjFiles) { + auto FileName = Pair.second; + if (CoverageByObjFile.find(FileName) == CoverageByObjFile.end()) + errs() << "WARNING: No coverage file for " << FileName << "\n"; + } + // Read raw coverage and symbolize it. for (const auto &Pair : CoverageByObjFile) { if (findSanitizerCovFunctions(Pair.first).empty()) { errs() - << "Ignoring " << Pair.first + << "WARNING: Ignoring " << Pair.first << " and its coverage because __sanitizer_cov* functions were not " "found.\n"; continue;