<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 16, 2014 at 11:13 AM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kcc<br>
Date: Tue Dec 16 13:13:01 2014<br>
New Revision: 224353<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=224353&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=224353&view=rev</a><br>
Log:<br>
[asan] new flag: hard_rss_limit_mb<br>
<br>
Added:<br>
    compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_interceptors.cc<br>
    compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_interceptors.cc Tue Dec 16 13:13:01 2014<br>
@@ -236,6 +236,11 @@ INTERCEPTOR(int, pthread_create, void *t<br>
   }<br>
   return result;<br>
 }<br>
+<br>
+INTERCEPTOR(int, pthread_join, void *t, void **arg) {<br>
+  return real_pthread_join(t, arg);<br>
+}<br>
+DEFINE_REAL_PTHREAD_FUNCTIONS;<br>
 #endif  // ASAN_INTERCEPT_PTHREAD_CREATE<br>
<br>
 #if ASAN_INTERCEPT_SIGNAL_AND_SIGACTION<br>
@@ -902,6 +907,7 @@ void InitializeAsanInterceptors() {<br>
   // Intercept threading-related functions<br>
 #if ASAN_INTERCEPT_PTHREAD_CREATE<br>
   ASAN_INTERCEPT_FUNC(pthread_create);<br>
+  ASAN_INTERCEPT_FUNC(pthread_join);<br>
 #endif<br>
<br>
   // Intercept atexit function.<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Tue Dec 16 13:13:01 2014<br>
@@ -658,6 +658,8 @@ static void AsanInitInternal() {<br>
   InitializeAllocator(common_flags()->allocator_may_return_null,<br>
                       flags()->quarantine_size);<br>
<br>
+  MaybeStartBackgroudThread();<br>
+<br>
   // On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited<br>
   // should be set to 1 prior to initializing the threads.<br>
   asan_inited = 1;<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Tue Dec 16 13:13:01 2014<br>
@@ -557,6 +557,10 @@ INLINE void GetExtraActivationFlags(char<br>
 INLINE void SanitizerInitializeUnwinder() {}<br>
 #endif<br>
<br>
+void *internal_start_thread(void(*func)(void*), void *arg);<br>
+void internal_join_thread(void *th);<br>
+void MaybeStartBackgroudThread();<br>
+<br>
 // Make the compiler think that something is going on there.<br>
 // Use this inside a loop that looks like memset/memcpy/etc to prevent the<br>
 // compiler from recognising it and turning it into an actual call to<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc Tue Dec 16 13:13:01 2014<br>
@@ -13,6 +13,7 @@<br>
<br>
 #include "sanitizer_common.h"<br>
 #include "sanitizer_flags.h"<br>
+#include "sanitizer_stackdepot.h"<br>
 #include "sanitizer_stacktrace.h"<br>
 #include "sanitizer_symbolizer.h"<br>
<br>
@@ -59,6 +60,48 @@ void ReportErrorSummary(const char *erro<br>
 #endif<br>
 }<br>
<br>
+void BackgroundThread(void *arg) {<br>
+  uptr hard_rss_limit_mb = common_flags()->hard_rss_limit_mb;<br>
+  uptr prev_reported_rss = 0;<br>
+  uptr prev_reported_stack_depot_size = 0;<br>
+  while (true) {<br>
+    SleepForMillis(100);<br>
+    uptr current_rss_mb = GetRSS() >> 20;<br>
+    if (common_flags()->verbosity) {<br>
+      // If RSS has grown 10% since last time, print some information.<br>
+      if (prev_reported_rss * 11 / 10 < current_rss_mb) {<br>
+        Printf("%s: RSS: %zdMb\n", SanitizerToolName, current_rss_mb);<br>
+        prev_reported_rss = current_rss_mb;<br>
+      }<br>
+      // If stack depot has grown 10% since last time, print it too.<br>
+      StackDepotStats *stack_depot_stats = StackDepotGetStats();<br>
+      if (prev_reported_stack_depot_size * 11 / 10 <<br>
+          stack_depot_stats->allocated) {<br>
+        Printf("%s: StackDepot: %zd ids; %zdM allocated\n",<br>
+               SanitizerToolName,<br>
+               stack_depot_stats->n_uniq_ids,<br>
+               stack_depot_stats->allocated >> 20);<br>
+        prev_reported_stack_depot_size = stack_depot_stats->allocated;<br>
+      }<br>
+    }<br>
+    // Check RSS against the limit.<br>
+    if (hard_rss_limit_mb && hard_rss_limit_mb < current_rss_mb) {<br>
+      Report("%s: hard rss limit exhausted (%zdMb vs %zdMb)\n",<br>
+             SanitizerToolName, hard_rss_limit_mb, current_rss_mb);<br>
+      DumpProcessMap();<br>
+      Die();<br>
+    }<br>
+  }<br>
+}<br>
+<br>
+void MaybeStartBackgroudThread() {<br>
+  if (!SANITIZER_LINUX) return;  // Need to implement/test on other platforms.<br>
+  // Currently, only start the background thread if hard_rss_limit_mb is given.<br>
+  if (!common_flags()->hard_rss_limit_mb) return;<br>
+  if (!real_pthread_create) return;  // Can't spawn the thread anyway.<br>
+  internal_start_thread(BackgroundThread, nullptr);<br>
+}<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 void NOINLINE<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc Tue Dec 16 13:13:01 2014<br>
@@ -140,6 +140,11 @@ void ParseCommonFlagsFromString(CommonFl<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>
+  ParseFlag(str, &f->hard_rss_limit_mb, "hard_rss_limit_mb",<br>
+            "RSS limit in Mb."<br>
+            " If non-zero, a background thread is spawned at startup"<br>
+            " which periodically reads RSS and aborts the process if the"<br>
+            " limit is reached");<br></blockquote><div><br></div><div>^^</div><div>You also need to provide the default value of this flag in SetCommonFlagsDefaults() function.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   ParseFlag(str, &f->coverage, "coverage",<br>
       "If set, coverage information will be dumped at program shutdown (if the "<br>
       "coverage instrumentation was enabled at compile time).");<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.h Tue Dec 16 13:13:01 2014<br>
@@ -54,6 +54,7 @@ struct CommonFlags {<br>
   bool intercept_tls_get_addr;<br>
   bool help;<br>
   uptr mmap_limit_mb;<br>
+  uptr hard_rss_limit_mb;<br>
   bool coverage;<br>
   bool coverage_direct;<br>
   const char *coverage_dir;<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_libc.h Tue Dec 16 13:13:01 2014<br>
@@ -98,6 +98,25 @@ int internal_fork();<br>
 // Threading<br>
 uptr internal_sched_yield();<br>
<br>
+// These functions call appropriate pthread_ functions directly, bypassing<br>
+// the interceptor. They are weak and may not be present in some tools.<br>
+SANITIZER_WEAK_ATTRIBUTE<br>
+int real_pthread_create(void *th, void *attr, void *(*callback)(void *),<br>
+                        void *param);<br>
+SANITIZER_WEAK_ATTRIBUTE<br>
+int real_pthread_join(void *th, void **ret);<br>
+<br>
+#define DEFINE_REAL_PTHREAD_FUNCTIONS                                          \<br>
+  namespace __sanitizer {                                                      \<br>
+  int real_pthread_create(void *th, void *attr, void *(*callback)(void *),     \<br>
+                          void *param) {                                       \<br>
+    return REAL(pthread_create)(th, attr, callback, param);                    \<br>
+  }                                                                            \<br>
+  int real_pthread_join(void *th, void **ret) {                                \<br>
+    return REAL(pthread_join(th, ret));                                        \<br>
+  }                                                                            \<br>
+  }  // namespace __sanitizer<br>
+<br>
 // Error handling<br>
 bool internal_iserror(uptr retval, int *rverrno = 0);<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Tue Dec 16 13:13:01 2014<br>
@@ -938,6 +938,21 @@ bool IsDeadlySignal(int signum) {<br>
   return (signum == SIGSEGV) && common_flags()->handle_segv;<br>
 }<br>
<br>
+void *internal_start_thread(void(*func)(void *arg), void *arg) {<br>
+  // Start the thread with signals blocked, otherwise it can steal user signals.<br>
+  __sanitizer_sigset_t set, old;<br>
+  internal_sigfillset(&set);<br>
+  internal_sigprocmask(SIG_SETMASK, &set, &old);<br>
+  void *th;<br>
+  real_pthread_create(&th, 0, (void*(*)(void *arg))func, arg);<br>
+  internal_sigprocmask(SIG_SETMASK, &old, 0);<br>
+  return th;<br>
+}<br>
+<br>
+void internal_join_thread(void *th) {<br>
+  real_pthread_join(th, 0);<br>
+}<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // SANITIZER_FREEBSD || SANITIZER_LINUX<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Tue Dec 16 13:13:01 2014<br>
@@ -325,6 +325,9 @@ uptr GetRSS() {<br>
   return 0;<br>
 }<br>
<br>
+void *internal_start_thread(void (*func)(void *arg), void *arg) { return 0; }<br>
+void internal_join_thread(void *th) { return 0; }<br>
+<br>
 }  // namespace __sanitizer<br>
<br>
 #endif  // SANITIZER_MAC<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Tue Dec 16 13:13:01 2014<br>
@@ -379,6 +379,9 @@ uptr GetRSS() {<br>
   return 0;<br>
 }<br>
<br>
+void *internal_start_thread(void (*func)(void *arg), void *arg) { return 0; }<br>
+void internal_join_thread(void *th) { return 0; }<br>
+<br>
 // ---------------------- BlockingMutex ---------------- {{{1<br>
 const uptr LOCK_UNINITIALIZED = 0;<br>
 const uptr LOCK_READY = (uptr)-1;<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Tue Dec 16 13:13:01 2014<br>
@@ -948,6 +948,8 @@ TSAN_INTERCEPTOR(int, pthread_join, void<br>
   return res;<br>
 }<br>
<br>
+DEFINE_REAL_PTHREAD_FUNCTIONS;<br>
+<br>
 TSAN_INTERCEPTOR(int, pthread_detach, void *th) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_detach, th);<br>
   int tid = ThreadTid(thr, pc, (uptr)th);<br>
@@ -2565,19 +2567,4 @@ void InitializeInterceptors() {<br>
   FdInit();<br>
 }<br>
<br>
-void *internal_start_thread(void(*func)(void *arg), void *arg) {<br>
-  // Start the thread with signals blocked, otherwise it can steal user signals.<br>
-  __sanitizer_sigset_t set, old;<br>
-  internal_sigfillset(&set);<br>
-  internal_sigprocmask(SIG_SETMASK, &set, &old);<br>
-  void *th;<br>
-  REAL(pthread_create)(&th, 0, (void*(*)(void *arg))func, arg);<br>
-  internal_sigprocmask(SIG_SETMASK, &old, 0);<br>
-  return th;<br>
-}<br>
-<br>
-void internal_join_thread(void *th) {<br>
-  REAL(pthread_join)(th, 0);<br>
-}<br>
-<br>
 }  // namespace __tsan<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h?rev=224353&r1=224352&r2=224353&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h?rev=224353&r1=224352&r2=224353&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform.h Tue Dec 16 13:13:01 2014<br>
@@ -252,9 +252,6 @@ void InitializePlatform();<br>
 void FlushShadowMemory();<br>
 void WriteMemoryProfile(char *buf, uptr buf_size, uptr nthread, uptr nlive);<br>
<br>
-void *internal_start_thread(void(*func)(void*), void *arg);<br>
-void internal_join_thread(void *th);<br>
-<br>
 // Says whether the addr relates to a global var.<br>
 // Guesses with high probability, may yield both false positives and negatives.<br>
 bool IsGlobalVar(uptr addr);<br>
<br>
Added: compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc?rev=224353&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc?rev=224353&view=auto</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc (added)<br>
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/Linux/hard_rss_limit_mb_test.cc Tue Dec 16 13:13:01 2014<br>
@@ -0,0 +1,35 @@<br>
+// Check hard_rss_limit_mb. Not all sanitizers implement it yet.<br>
+// RUN: %clangxx -O2 %s -o %t<br>
+//<br>
+// Run with limit should fail:<br>
+// RUN: %tool_options=hard_rss_limit_mb=100 not %run %t 2>&1 | FileCheck %s<br>
+//<br>
+// Run w/o limit or with a large enough limit should pass:<br>
+// RUN: %tool_options=hard_rss_limit_mb=1000 %run %t<br>
+// RUN: %run %t<br>
+//<br>
+// FIXME: make it work for other sanitizers.<br>
+// XFAIL: lsan<br>
+// XFAIL: tsan<br>
+// XFAIL: msan<br>
+<br>
+#include <string.h><br>
+#include <stdio.h><br>
+#include <unistd.h><br>
+<br>
+const int kNumAllocs = 200 * 1000;<br>
+const int kAllocSize = 1000;<br>
+volatile char *sink[kNumAllocs];<br>
+<br>
+int main(int argc, char **argv) {<br>
+  for (int i = 0; i < kNumAllocs; i++) {<br>
+    if ((i % 1000) == 0) {<br>
+      fprintf(stderr, "[%d]\n", i);<br>
+    }<br>
+    char *x = new char[kAllocSize];<br>
+    memset(x, 0, kAllocSize);<br>
+    sink[i] = x;<br>
+  }<br>
+  sleep(1);  // Make sure the background thread has time to kill the process.<br>
+// CHECK: hard rss limit exhausted<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</div></div>