Index: compiler-rt/trunk/lib/hwasan/hwasan_linux.cc =================================================================== --- compiler-rt/trunk/lib/hwasan/hwasan_linux.cc +++ compiler-rt/trunk/lib/hwasan/hwasan_linux.cc @@ -218,6 +218,8 @@ } static void HwasanAtExit(void) { + if (common_flags()->print_module_map) + DumpProcessMap(); if (flags()->print_stats && (flags()->atexit || hwasan_report_count > 0)) ReportStats(); if (hwasan_report_count > 0) { @@ -376,8 +378,6 @@ GetStackTrace(stack, kStackTraceMax, pc, frame, uc, common_flags()->fast_unwind_on_fatal); - ++hwasan_report_count; - bool fatal = flags()->halt_on_error || !ai.recover; ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal); } Index: compiler-rt/trunk/lib/hwasan/hwasan_report.cc =================================================================== --- compiler-rt/trunk/lib/hwasan/hwasan_report.cc +++ compiler-rt/trunk/lib/hwasan/hwasan_report.cc @@ -34,15 +34,21 @@ ScopedReport(bool fatal = false) : error_message_(1), fatal(fatal) { BlockingMutexLock lock(&error_message_lock_); error_message_ptr_ = fatal ? &error_message_ : nullptr; + ++hwasan_report_count; } ~ScopedReport() { - BlockingMutexLock lock(&error_message_lock_); - if (fatal) { - SetAbortMessage(error_message_.data()); - Die(); + { + BlockingMutexLock lock(&error_message_lock_); + if (fatal) + SetAbortMessage(error_message_.data()); + error_message_ptr_ = nullptr; } - error_message_ptr_ = nullptr; + if (common_flags()->print_module_map >= 2 || + (fatal && common_flags()->print_module_map)) + DumpProcessMap(); + if (fatal) + Die(); } static void MaybeAppendToErrorMessage(const char *msg) { Index: compiler-rt/trunk/test/hwasan/TestCases/print-module-map.c =================================================================== --- compiler-rt/trunk/test/hwasan/TestCases/print-module-map.c +++ compiler-rt/trunk/test/hwasan/TestCases/print-module-map.c @@ -0,0 +1,32 @@ +// RUN: %clang_hwasan %s -o %t && %env_hwasan_opts=print_module_map=1 %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -o %t && %env_hwasan_opts=print_module_map=1 not %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -fsanitize-recover=hwaddress -o %t && %env_hwasan_opts=print_module_map=1,halt_on_error=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=EXIT,NOMORE +// RUN: %clang_hwasan %s -DBUG -fsanitize-recover=hwaddress -o %t && %env_hwasan_opts=print_module_map=2,halt_on_error=0 not %run %t 2>&1 | FileCheck %s --check-prefixes=BUG1,BUG2,EXIT,NOMORE + +#include +#include +#include + +int main() { + __hwasan_enable_allocator_tagging(); +#ifdef BUG + char * volatile x = (char*)malloc(40); + free(x); + free(x); + free(x); +#endif + __hwasan_disable_allocator_tagging(); + // BUG1: Process memory map follows: + // BUG1: print-module-map + // BUG1: End of process memory map. + + // BUG2: Process memory map follows: + // BUG2: print-module-map + // BUG2: End of process memory map. + + // EXIT: Process memory map follows: + // EXIT: print-module-map + // EXIT: End of process memory map. + + // NOMORE-NOT: Process memory map follows: +}