diff options
| author | Kostya Serebryany <kcc@google.com> | 2013-01-28 07:34:22 +0000 | 
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2013-01-28 07:34:22 +0000 | 
| commit | 6c17547ef1f06b5c083ed2823e3149fe1624df27 (patch) | |
| tree | b9f0f5c0ea5bdcfbc151d6b000843724730bfa30 | |
| parent | 2cbcf1a32015e943acc08cc01689f99b972da555 (diff) | |
| download | bcm5719-llvm-6c17547ef1f06b5c083ed2823e3149fe1624df27.tar.gz bcm5719-llvm-6c17547ef1f06b5c083ed2823e3149fe1624df27.zip  | |
[asan] two more internal flags for asan-rt: print_stats (0) and print_legend (1) 
llvm-svn: 173671
| -rw-r--r-- | compiler-rt/lib/asan/asan_flags.h | 4 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_report.cc | 34 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_rtl.cc | 4 | 
3 files changed, 28 insertions, 14 deletions
diff --git a/compiler-rt/lib/asan/asan_flags.h b/compiler-rt/lib/asan/asan_flags.h index d7b21ea4a45..6c235bfbab9 100644 --- a/compiler-rt/lib/asan/asan_flags.h +++ b/compiler-rt/lib/asan/asan_flags.h @@ -79,6 +79,10 @@ struct Flags {    bool unmap_shadow_on_exit;    // If set, calls abort() instead of _exit() after printing an error report.    bool abort_on_error; +  // Print various statistics after printing an error message or if atexit=1. +  bool print_stats; +  // Print the legend for the shadow bytes. +  bool print_legend;    // If set, prints ASan exit stats even after program terminates successfully.    bool atexit;    // By default, disable core dumper on 64-bit - it makes little sense diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc index cf57f625ebe..c381f4f010f 100644 --- a/compiler-rt/lib/asan/asan_report.cc +++ b/compiler-rt/lib/asan/asan_report.cc @@ -120,19 +120,7 @@ static void PrintShadowBytes(const char *before, u8 *bytes,    Printf("\n");  } -static void PrintShadowMemoryForAddress(uptr addr) { -  if (!AddrIsInMem(addr)) -    return; -  uptr shadow_addr = MemToShadow(addr); -  const uptr n_bytes_per_row = 16; -  uptr aligned_shadow = shadow_addr & ~(n_bytes_per_row - 1); -  Printf("Shadow bytes around the buggy address:\n"); -  for (int i = -5; i <= 5; i++) { -    const char *prefix = (i == 0) ? "=>" : "  "; -    PrintShadowBytes(prefix, -                     (u8*)(aligned_shadow + i * n_bytes_per_row), -                     (u8*)shadow_addr, n_bytes_per_row); -  } +static void PrintLegend() {    Printf("Shadow byte legend (one shadow byte represents %d "           "application bytes):\n", (int)SHADOW_GRANULARITY);    PrintShadowByte("  Addressable:           ", 0); @@ -155,6 +143,23 @@ static void PrintShadowMemoryForAddress(uptr addr) {    PrintShadowByte("  ASan internal:         ", kAsanInternalHeapMagic);  } +static void PrintShadowMemoryForAddress(uptr addr) { +  if (!AddrIsInMem(addr)) +    return; +  uptr shadow_addr = MemToShadow(addr); +  const uptr n_bytes_per_row = 16; +  uptr aligned_shadow = shadow_addr & ~(n_bytes_per_row - 1); +  Printf("Shadow bytes around the buggy address:\n"); +  for (int i = -5; i <= 5; i++) { +    const char *prefix = (i == 0) ? "=>" : "  "; +    PrintShadowBytes(prefix, +                     (u8*)(aligned_shadow + i * n_bytes_per_row), +                     (u8*)shadow_addr, n_bytes_per_row); +  } +  if (flags()->print_legend) +    PrintLegend(); +} +  static void PrintZoneForPointer(uptr ptr, uptr zone_ptr,                                  const char *zone_name) {    if (zone_ptr) { @@ -446,7 +451,8 @@ class ScopedInErrorReport {        DescribeThread(curr_thread->summary());      }      // Print memory stats. -    __asan_print_accumulated_stats(); +    if (flags()->print_stats) +      __asan_print_accumulated_stats();      if (error_report_callback) {        error_report_callback(error_message_buffer);      } diff --git a/compiler-rt/lib/asan/asan_rtl.cc b/compiler-rt/lib/asan/asan_rtl.cc index 8ea5449ff9d..d16f1e37735 100644 --- a/compiler-rt/lib/asan/asan_rtl.cc +++ b/compiler-rt/lib/asan/asan_rtl.cc @@ -97,6 +97,8 @@ static void ParseFlagsFromString(Flags *f, const char *str) {    ParseFlag(str, &f->check_malloc_usable_size, "check_malloc_usable_size");    ParseFlag(str, &f->unmap_shadow_on_exit, "unmap_shadow_on_exit");    ParseFlag(str, &f->abort_on_error, "abort_on_error"); +  ParseFlag(str, &f->print_stats, "print_stats"); +  ParseFlag(str, &f->print_legend, "print_legend");    ParseFlag(str, &f->atexit, "atexit");    ParseFlag(str, &f->disable_core, "disable_core");    ParseFlag(str, &f->strip_path_prefix, "strip_path_prefix"); @@ -135,6 +137,8 @@ void InitializeFlags(Flags *f, const char *env) {    f->check_malloc_usable_size = true;    f->unmap_shadow_on_exit = false;    f->abort_on_error = false; +  f->print_stats = false; +  f->print_legend = true;    f->atexit = false;    f->disable_core = (SANITIZER_WORDSIZE == 64);    f->strip_path_prefix = "";  | 

