diff options
Diffstat (limited to 'lib/sanitizer_common/sanitizer_coverage_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_coverage_libcdep.cc | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/lib/sanitizer_common/sanitizer_coverage_libcdep.cc b/lib/sanitizer_common/sanitizer_coverage_libcdep.cc index 64c2229f6..fc269c389 100644 --- a/lib/sanitizer_common/sanitizer_coverage_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_coverage_libcdep.cc @@ -783,10 +783,35 @@ void CoverageData::GetRangeOffsets(const NamedPcRange& r, Symbolizer* sym, (*offsets)[i] = UnbundlePc((*offsets)[i]); } -static void GenerateHtmlReport(const InternalMmapVector<char *> &sancov_argv) { - if (!common_flags()->html_cov_report || sancov_argv[0] == nullptr) { +static void GenerateHtmlReport(const InternalMmapVector<char *> &cov_files) { + if (!common_flags()->html_cov_report) { return; } + char *sancov_path = FindPathToBinary(common_flags()->sancov_path); + if (sancov_path == nullptr) { + return; + } + + InternalMmapVector<char *> sancov_argv(cov_files.size() * 2 + 3); + sancov_argv.push_back(sancov_path); + sancov_argv.push_back(internal_strdup("-html-report")); + auto argv_deleter = at_scope_exit([&] { + for (uptr i = 0; i < sancov_argv.size(); ++i) { + InternalFree(sancov_argv[i]); + } + }); + + for (const auto &cov_file : cov_files) { + sancov_argv.push_back(internal_strdup(cov_file)); + } + + InternalScopedBuffer<LoadedModule> LoadedModules(kMaxNumberOfModules); + uptr n_modules = GetListOfModules(LoadedModules.data(), kMaxNumberOfModules, + /* filter */ nullptr); + for (uptr i = 0; i < n_modules; ++i) { + sancov_argv.push_back(internal_strdup(LoadedModules[i].full_name())); + } + InternalScopedString report_path(kMaxPathLength); fd_t report_fd = CovOpenFile(&report_path, false /* packed */, GetProcessName(), "html"); @@ -806,12 +831,10 @@ void CoverageData::DumpOffsets() { InternalMmapVector<uptr> offsets(0); InternalScopedString path(kMaxPathLength); - InternalMmapVector<char *> sancov_argv(module_name_vec.size() * 2 + 3); - sancov_argv.push_back(FindPathToBinary(common_flags()->sancov_path)); - sancov_argv.push_back(internal_strdup("-html-report")); - auto argv_deleter = at_scope_exit([&] { - for (uptr i = 0; i < sancov_argv.size(); ++i) { - InternalFree(sancov_argv[i]); + InternalMmapVector<char *> cov_files(module_name_vec.size()); + auto cov_files_deleter = at_scope_exit([&] { + for (uptr i = 0; i < cov_files.size(); ++i) { + InternalFree(cov_files[i]); } }); @@ -839,16 +862,14 @@ void CoverageData::DumpOffsets() { if (fd == kInvalidFd) continue; WriteToFile(fd, offsets.data(), offsets.size() * sizeof(offsets[0])); CloseFile(fd); - sancov_argv.push_back(internal_strdup(r.copied_module_name)); - sancov_argv.push_back(internal_strdup(path.data())); + cov_files.push_back(internal_strdup(path.data())); VReport(1, " CovDump: %s: %zd PCs written\n", path.data(), num_offsets); } } if (cov_fd != kInvalidFd) CloseFile(cov_fd); - sancov_argv.push_back(nullptr); - GenerateHtmlReport(sancov_argv); + GenerateHtmlReport(cov_files); } void CoverageData::DumpAll() { |