I must point out that sanitizer_win.cc wasn't updated to use IncreaseTotalMmap/DecreaseTotalMmap.  Why was that?<br><br><div class="gmail_quote">Mon Apr 14 2014 at 7:10:18 PM, Kostya Serebryany <<a href="mailto:kcc@google.com">kcc@google.com</a>>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kcc<br>
Date: Mon Apr 14 09:51:01 2014<br>
New Revision: 206178<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=206178&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project?rev=206178&view=rev</a><br>
Log:<br>
[asan] added internal flag mmap_limit_mb<br>
<br>
Added:<br>
    compiler-rt/trunk/test/asan/<u></u>TestCases/mmap_limit_mb.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/<u></u>asan_rtl.cc<br>
    compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.cc<br>
    compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.h<br>
    compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.cc<br>
    compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.h<br>
    compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>posix.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/<u></u>asan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>asan/asan_rtl.cc?rev=206178&<u></u>r1=206177&r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/asan/<u></u>asan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/<u></u>asan_rtl.cc Mon Apr 14 09:51:01 2014<br>
@@ -328,6 +328,7 @@ static void ReserveShadowMemoryRange(upt<br>
   CHECK_EQ((beg % GetPageSizeCached()), 0);<br>
   CHECK_EQ(((end + 1) % GetPageSizeCached()), 0);<br>
   uptr size = end - beg + 1;<br>
+  DecreaseTotalMmap(size);  // Don't count the shadow against mmap_limit_mb.<br>
   void *res = MmapFixedNoReserve(beg, size);<br>
   if (res != (void*)beg) {<br>
     Report("<u></u>ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. "<br>
<br>
Modified: compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.cc?rev=206178&r1=<u></u>206177&r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.cc (original)<br>
+++ compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.cc Mon Apr 14 09:51:01 2014<br>
@@ -244,6 +244,24 @@ char *StripModuleName(const char *module<br>
   return internal_strdup(short_module_<u></u>name);<br>
 }<br>
<br>
+static atomic_uintptr_t g_total_mmaped;<br>
+<br>
+void IncreaseTotalMmap(uptr size) {<br>
+  if (!common_flags()->mmap_limit_<u></u>mb) return;<br>
+  uptr total_mmaped =<br>
+      atomic_fetch_add(&g_total_<u></u>mmaped, size, memory_order_relaxed) + size;<br>
+  if ((total_mmaped >> 20) > common_flags()->mmap_limit_mb) {<br>
+    // Since for now mmap_limit_mb is not a user-facing flag, just CHECK.<br>
+    common_flags()->mmap_limit_mb = 0;  // Allow mmap in CHECK.<br>
+    CHECK_LT(total_mmaped >> 20, common_flags()->mmap_limit_mb)<u></u>;<br>
+  }<br>
+}<br>
+<br>
+void DecreaseTotalMmap(uptr size) {<br>
+  if (!common_flags()->mmap_limit_<u></u>mb) return;<br>
+  atomic_fetch_sub(&g_total_<u></u>mmaped, size, memory_order_relaxed);<br>
+}<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 using namespace __sanitizer;  // NOLINT<br>
<br>
Modified: compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.h?rev=206178&r1=206177&<u></u>r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.h (original)<br>
+++ compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>common.h Mon Apr 14 09:51:01 2014<br>
@@ -60,6 +60,8 @@ void *MmapAlignedOrDie(uptr size, uptr a<br>
 // Used to check if we can map shadow memory to a fixed location.<br>
 bool MemoryRangeIsAvailable(uptr range_start, uptr range_end);<br>
 void FlushUnneededShadowMemory(uptr addr, uptr size);<br>
+void IncreaseTotalMmap(uptr size);<br>
+void DecreaseTotalMmap(uptr size);<br>
<br>
 // InternalScopedBuffer can be used instead of large stack arrays to<br>
 // keep frame size low.<br>
<br>
Modified: compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.cc?rev=206178&r1=206177&<u></u>r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.cc (original)<br>
+++ compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.cc Mon Apr 14 09:51:01 2014<br>
@@ -119,6 +119,9 @@ void ParseCommonFlagsFromString(<u></u>CommonFl<br>
   ParseFlag(str, &f->intercept_tls_get_addr, "intercept_tls_get_addr",<br>
             "Intercept __tls_get_addr.");<br>
   ParseFlag(str, &f->help, "help", "Print the flag descriptions.");<br>
+  ParseFlag(str, &f->mmap_limit_mb, "mmap_limit_mb",<br>
+            "Limit the amount of mmap-ed memory (excluding shadow) in Mb; "<br>
+            "not a user-facing flag, used mosly for testing the tools");<br>
<br>
   // Do a sanity check for certain flags.<br>
   if (f->malloc_context_size < 1)<br>
<br>
Modified: compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.h?rev=206178&r1=206177&<u></u>r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.h (original)<br>
+++ compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>flags.h Mon Apr 14 09:51:01 2014<br>
@@ -52,6 +52,7 @@ struct CommonFlags {<br>
   bool legacy_pthread_cond;<br>
   bool intercept_tls_get_addr;<br>
   bool help;<br>
+  uptr mmap_limit_mb;<br>
 };<br>
<br>
 inline CommonFlags *common_flags() {<br>
<br>
Modified: compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>posix.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=206178&r1=206177&r2=206178&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>posix.cc?rev=206178&r1=206177&<u></u>r2=206178&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>posix.cc (original)<br>
+++ compiler-rt/trunk/lib/<u></u>sanitizer_common/sanitizer_<u></u>posix.cc Mon Apr 14 09:51:01 2014<br>
@@ -91,6 +91,7 @@ void *MmapOrDie(uptr size, const char *m<br>
     DumpProcessMap();<br>
     CHECK("unable to mmap" && 0);<br>
   }<br>
+  IncreaseTotalMmap(size);<br>
   return (void *)res;<br>
 }<br>
<br>
@@ -102,6 +103,7 @@ void UnmapOrDie(void *addr, uptr size) {<br>
            SanitizerToolName, size, size, addr);<br>
     CHECK("unable to unmap" && 0);<br>
   }<br>
+  DecreaseTotalMmap(size);<br>
 }<br>
<br>
 void *MmapNoReserveOrDie(uptr size, const char *mem_type) {<br>
@@ -118,6 +120,7 @@ void *MmapNoReserveOrDie(uptr size, cons<br>
            SanitizerToolName, size, size, mem_type, reserrno);<br>
     CHECK("unable to mmap" && 0);<br>
   }<br>
+  IncreaseTotalMmap(size);<br>
   return (void *)p;<br>
 }<br>
<br>
@@ -133,6 +136,7 @@ void *MmapFixedNoReserve(uptr fixed_addr<br>
     Report("ERROR: %s failed to "<br>
            "allocate 0x%zx (%zd) bytes at address %zu (errno: %d)\n",<br>
            SanitizerToolName, size, size, fixed_addr, reserrno);<br>
+  IncreaseTotalMmap(size);<br>
   return (void *)p;<br>
 }<br>
<br>
@@ -150,6 +154,7 @@ void *MmapFixedOrDie(uptr fixed_addr, up<br>
            SanitizerToolName, size, size, fixed_addr, reserrno);<br>
     CHECK("unable to mmap" && 0);<br>
   }<br>
+  IncreaseTotalMmap(size);<br>
   return (void *)p;<br>
 }<br>
<br>
<br>
Added: compiler-rt/trunk/test/asan/<u></u>TestCases/mmap_limit_mb.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/mmap_limit_mb.cc?rev=206178&view=auto" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/<u></u>test/asan/TestCases/mmap_<u></u>limit_mb.cc?rev=206178&view=<u></u>auto</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/test/asan/<u></u>TestCases/mmap_limit_mb.cc (added)<br>
+++ compiler-rt/trunk/test/asan/<u></u>TestCases/mmap_limit_mb.cc Mon Apr 14 09:51:01 2014<br>
@@ -0,0 +1,30 @@<br>
+// Test the mmap_limit_mb flag.<br>
+//<br>
+// RUN: %clangxx_asan -std=c++11 -O2 %s -o %t<br>
+// RUN: %t 100 16<br>
+// RUN: %t 100 1000000<br>
+// RUN: ASAN_OPTIONS=mmap_limit_mb=500 %t 100 16<br>
+// RUN: ASAN_OPTIONS=mmap_limit_mb=500 %t 100 1000000<br>
+// RUN: ASAN_OPTIONS=mmap_limit_mb=500 not %t 500 16 2>&1 | FileCheck %s<br>
+// RUN: ASAN_OPTIONS=mmap_limit_mb=500 not %t 500 1000000 2>&1 | FileCheck %s<br>
+<br>
+#include <assert.h><br>
+#include <stdlib.h><br>
+#include <stdio.h><br>
+<br>
+#include <algorithm><br>
+#include <vector><br>
+<br>
+int main(int argc, char **argv) {<br>
+  assert(argc == 3);<br>
+  long total_mb = atoi(argv[1]);<br>
+  long allocation_size = atoi(argv[2]);<br>
+  std::vector<char *> v;<br>
+  for (long total = total_mb << 20; total > 0; total -= allocation_size)<br>
+    v.push_back(new char[allocation_size]);<br>
+  std::for_each(v.begin(), v.end(),<br>
+                [](std::vector<char *>::reference ref) { delete[] ref; });<br>
+  printf("PASS\n");<br>
+  // CHECK: AddressSanitizer CHECK failed{{.*}}total_mmaped{{.*}}<u></u>mmap_limit_mb<br>
+  return 0;<br>
+}<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank" class="cremed">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div>