summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sanitizer_common/sanitizer_coverage_libcdep.cc45
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() {