[ASan] move some functions that describe addresses to asan_report.cc

git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@161571 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc
index ad51e01..4e14d80 100644
--- a/lib/asan/asan_rtl.cc
+++ b/lib/asan/asan_rtl.cc
@@ -17,6 +17,7 @@
 #include "asan_internal.h"
 #include "asan_lock.h"
 #include "asan_mapping.h"
+#include "asan_report.h"
 #include "asan_stack.h"
 #include "asan_stats.h"
 #include "asan_thread.h"
@@ -207,98 +208,6 @@
   return res;
 }
 
-// ---------------------- DescribeAddress -------------------- {{{1
-static bool DescribeStackAddress(uptr addr, uptr access_size) {
-  AsanThread *t = asanThreadRegistry().FindThreadByStackAddress(addr);
-  if (!t) return false;
-  const sptr kBufSize = 4095;
-  char buf[kBufSize];
-  uptr offset = 0;
-  const char *frame_descr = t->GetFrameNameByAddr(addr, &offset);
-  // This string is created by the compiler and has the following form:
-  // "FunctioName n alloc_1 alloc_2 ... alloc_n"
-  // where alloc_i looks like "offset size len ObjectName ".
-  CHECK(frame_descr);
-  // Report the function name and the offset.
-  const char *name_end = internal_strchr(frame_descr, ' ');
-  CHECK(name_end);
-  buf[0] = 0;
-  internal_strncat(buf, frame_descr,
-                   Min(kBufSize,
-                       static_cast<sptr>(name_end - frame_descr)));
-  AsanPrintf("Address %p is located at offset %zu "
-             "in frame <%s> of T%d's stack:\n",
-             (void*)addr, offset, buf, t->tid());
-  // Report the number of stack objects.
-  char *p;
-  uptr n_objects = internal_simple_strtoll(name_end, &p, 10);
-  CHECK(n_objects > 0);
-  AsanPrintf("  This frame has %zu object(s):\n", n_objects);
-  // Report all objects in this frame.
-  for (uptr i = 0; i < n_objects; i++) {
-    uptr beg, size;
-    sptr len;
-    beg  = internal_simple_strtoll(p, &p, 10);
-    size = internal_simple_strtoll(p, &p, 10);
-    len  = internal_simple_strtoll(p, &p, 10);
-    if (beg <= 0 || size <= 0 || len < 0 || *p != ' ') {
-      AsanPrintf("AddressSanitizer can't parse the stack frame "
-                 "descriptor: |%s|\n", frame_descr);
-      break;
-    }
-    p++;
-    buf[0] = 0;
-    internal_strncat(buf, p, Min(kBufSize, len));
-    p += len;
-    AsanPrintf("    [%zu, %zu) '%s'\n", beg, beg + size, buf);
-  }
-  AsanPrintf("HINT: this may be a false positive if your program uses "
-             "some custom stack unwind mechanism\n"
-             "      (longjmp and C++ exceptions *are* supported)\n");
-  t->summary()->Announce();
-  return true;
-}
-
-static bool DescribeAddrIfShadow(uptr addr) {
-  if (AddrIsInMem(addr))
-    return false;
-  static const char kAddrInShadowReport[] =
-      "Address %p is located in the %s.\n";
-  if (AddrIsInShadowGap(addr)) {
-    AsanPrintf(kAddrInShadowReport, addr, "shadow gap area");
-    return true;
-  }
-  if (AddrIsInHighShadow(addr)) {
-    AsanPrintf(kAddrInShadowReport, addr, "high shadow area");
-    return true;
-  }
-  if (AddrIsInLowShadow(addr)) {
-    AsanPrintf(kAddrInShadowReport, addr, "low shadow area");
-    return true;
-  }
-
-  CHECK(0);  // Unreachable.
-  return false;
-}
-
-static NOINLINE void DescribeAddress(uptr addr, uptr access_size) {
-  // Check if this is shadow or shadow gap.
-  if (DescribeAddrIfShadow(addr))
-    return;
-
-  CHECK(AddrIsInMem(addr));
-
-  // Check if this is a global.
-  if (DescribeAddrIfGlobal(addr))
-    return;
-
-  if (DescribeStackAddress(addr, access_size))
-    return;
-
-  // finally, check if this is a heap.
-  DescribeHeapAddress(addr, access_size);
-}
-
 // -------------------------- Run-time entry ------------------- {{{1
 // exported functions
 #define ASAN_REPORT_ERROR(type, is_write, size)                     \