<div dir="ltr"><span style="font-size:12.8px">FYI, adding defined(__arm__) in sanitizer_stoptheworld_<wbr>linux_libcdep.cc breaks android arm with some toolchains.</span><br><div><span style="font-size:12.8px"><br></span></div><div><div><span style="font-size:12.8px">.../llvm/projects/compiler-rt/<wbr>lib/sanitizer_common/<wbr>sanitizer_stoptheworld_linux_<wbr>libcdep.cc:36:11: fatal </span><span style="font-size:12.8px">error: </span></div><div><span style="font-size:12.8px">      'linux/user.h' file not found</span></div><div><span style="font-size:12.8px"># include <linux/user.h>  // for pt_regs</span></div><div><span style="font-size:12.8px">          ^</span></div><div><span style="font-size:12.8px">1 error generated.</span></div><div style="font-size:12.8px"><br></div></div><div style="font-size:12.8px">Context: </div><div style="font-size:12.8px"><div style="font-size:12.8px">#if SANITIZER_ANDROID <!--
-->&& defined(__arm__)</div><div style="font-size:12.8px"># include <linux/user.h>  // for pt_regs</div><div style="font-size:12.8px">#else</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">To be fair the code was there without __arm__ ever being checked prior to this for the file.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><asm/ptrace.h> seems to have pt_regs and works for me, but I am not sure if that would break anything else.</div><div style="font-size:12.8px"><br></div></div><div style="font-size:12.8px"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 11, 2017 at 7:58 AM, Maxim Ostapenko via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><!--
--><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: chefmax<br>
Date: Tue Apr 11 09:58:26 2017<br>
New Revision: 299948<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=299948&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=299948&view=rev</a><br>
Log:<br>
Reapply "Enable LSan for arm Linux"<br>
<br>
This patch reapplies r299923 with typo fixed in BLX macros.<br>
<br>
Modified:<br>
    compiler-rt/trunk/cmake/<wbr>config-ix.cmake<br>
    compiler-rt/trunk/lib/asan/<wbr>tests/asan_test.cc<br>
    compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.cc<br>
    compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.h<br>
    compiler-rt/trunk/lib/lsan/<wbr>lsan_common.h<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.cc<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.h<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux_libcdep.cc<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>platform.h<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>stoptheworld_linux_libcdep.cc<br>
    compiler-rt/trunk/test/asan/<wbr>TestCases/Linux/clang_gcc_abi.<wbr>cc<br>
    compiler-rt/trunk/test/asan/<wbr>lit.cfg<br>
    compiler-rt/trunk/test/lsan/<wbr>TestCases/large_allocation_<wbr>leak.cc<br>
    compiler-rt/trunk/test/lsan/<wbr>TestCases/swapcontext.cc<br>
    compiler-rt/trunk/test/lsan/<wbr>TestCases/use_registers.cc<br>
    compiler-rt/trunk/test/lsan/<wbr>TestCases/use_tls_dynamic.cc<br>
    compiler-rt/trunk/test/lsan/<wbr>lit.common.cfg<br>
    compiler-rt/trunk/test/<wbr>sanitizer_common/print_<wbr>address.h<br>
<br>
Modified: compiler-rt/trunk/cmake/<wbr>config-ix.cmake<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-ix.cmake?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>cmake/config-ix.cmake?rev=<wbr>299948&r1=299947&r2=299948&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/cmake/<wbr>config-ix.cmake (original)<br>
+++ compiler-rt/trunk/cmake/<wbr>config-ix.cmake Tue Apr 11 09:58:26 2017<br>
@@ -164,7 +164,12 @@ set(ALL_SANITIZER_COMMON_<wbr>SUPPORTED_ARCH<br>
 set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}<br>
     ${MIPS32} ${MIPS64} ${PPC64} ${S390X})<br>
 set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})<br>
-set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64})<br>
+<br>
+if(APPLE)<br>
+  set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64})<br>
+else()<br>
+  set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64} ${ARM32})<br>
+endif()<br>
 set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64})<br>
 set(ALL_PROFILE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC64}<br>
     ${MIPS32} ${MIPS64} ${S390X})<br>
<br>
Modified: compiler-rt/trunk/lib/asan/<wbr>tests/asan_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_test.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>asan/tests/asan_test.cc?rev=<wbr>299948&r1=299947&r2=299948&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/asan/<wbr>tests/asan_test.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/<wbr>tests/asan_test.cc Tue Apr 11 09:58:26 2017<br>
@@ -685,6 +685,7 @@ void *ThreadStackReuseFunc2(void *unused<br>
   return 0;<br>
 }<br>
<br>
+#if !defined(__thumb__)<br>
 TEST(AddressSanitizer, ThreadStackReuseTest) {<br>
   pthread_t t;<br>
   PTHREAD_CREATE(&t, 0, ThreadStackReuseFunc1, 0);<br>
@@ -692,6 +693,7 @@ TEST(AddressSanitizer, ThreadStackReuseT<br>
   PTHREAD_CREATE(&t, 0, ThreadStackReuseFunc2, 0);<br>
   PTHREAD_JOIN(t, 0);<br>
 }<br>
+#endif<br>
<br>
 #if defined(__SSE2__)<br>
 #include <emmintrin.h><br>
@@ -1091,6 +1093,11 @@ TEST(AddressSanitizer, ThreadedStressSta<br>
   }<br>
 }<br>
<br>
+// pthread_exit tries to perform unwinding stuff that leads to dlopen'ing<br>
+// libgcc_s.so. dlopen in its turn calls malloc to store "libgcc_s.so" string<br>
+// that confuses LSan on Thumb because it fails to understand that this<br>
+// allocation happens in dynamic linker and should be ignored.<br>
+#if !defined(__thumb__)<br>
 static void *PthreadExit(void *a) {<br>
   pthread_exit(0);<br>
   return 0;<br>
@@ -1103,6 +1110,7 @@ TEST(AddressSanitizer, PthreadExitTest)<br>
     PTHREAD_JOIN(t, 0);<br>
   }<br>
 }<br>
+#endif<br>
<br>
 // FIXME: Why does clang-cl define __EXCEPTIONS?<br>
 #if defined(__EXCEPTIONS) && !defined(_WIN32)<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>lsan/lsan_allocator.cc?rev=<wbr>299948&r1=299947&r2=299948&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.cc (original)<br>
+++ compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.cc Tue Apr 11 09:58:26 2017<br>
@@ -24,7 +24,7 @@<br>
 extern "C" void *memset(void *ptr, int value, uptr num);<br>
<br>
 namespace __lsan {<br>
-#if defined(__i386__)<br>
+#if defined(__i386__) || defined(__arm__)<br>
 static const uptr kMaxAllowedMallocSize = 1UL << 30;<br>
 #elif defined(__mips64) || defined(__aarch64__)<br>
 static const uptr kMaxAllowedMallocSize = 4UL << 30;<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.h?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>lsan/lsan_allocator.h?rev=<wbr>299948&r1=299947&r2=299948&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.h (original)<br>
+++ compiler-rt/trunk/lib/lsan/<wbr>lsan_allocator.h Tue Apr 11 09:58:26 2017<br>
@@ -48,7 +48,8 @@ struct ChunkMetadata {<br>
   u32 stack_trace_id;<br>
 };<br>
<br>
-#if defined(__mips64) || defined(__aarch64__) || defined(__i386__)<br>
+#if defined(__mips64) || defined(__aarch64__) || defined(__i386__) || \<br>
+    defined(__arm__)<br>
 static const uptr kRegionSizeLog = 20;<br>
 static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog;<br>
 typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap;<br>
<br>
Modified: compiler-rt/trunk/lib/lsan/<wbr>lsan_common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common.h?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>lsan/lsan_common.h?rev=299948&<wbr>r1=299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/lsan/<wbr>lsan_common.h (original)<br>
+++ compiler-rt/trunk/lib/lsan/<wbr>lsan_common.h Tue Apr 11 09:58:26 2017<br>
@@ -37,6 +37,9 @@<br>
 #elif defined(__i386__) && \<br>
     (SANITIZER_LINUX && !SANITIZER_ANDROID || SANITIZER_MAC)<br>
 #define CAN_SANITIZE_LEAKS 1<br>
+#elif defined(__arm__) && \<br>
+    SANITIZER_LINUX && !SANITIZER_ANDROID<br>
+#define CAN_SANITIZE_LEAKS 1<br>
 #else<br>
 #define CAN_SANITIZE_LEAKS 0<br>
 #endif<br>
@@ -144,13 +147,36 @@ struct ScopedInterceptorDisabler {<br>
   ~ScopedInterceptorDisabler() { EnableInThisThread(); }<br>
 };<br>
<br>
+// According to Itanium C++ ABI array cookie is a one word containing<br>
+// size of allocated array.<br>
+static inline bool IsItaniumABIArrayCookie(uptr chunk_beg, uptr chunk_size,<br>
+                                           uptr addr) {<br>
+  return chunk_size == sizeof(uptr) && chunk_beg + chunk_size == addr &&<br>
+         *reinterpret_cast<uptr *>(chunk_beg) == 0;<br>
+}<br>
+<br>
+// According to ARM C++ ABI array cookie consists of two words:<br>
+// struct array_cookie {<br>
+//   std::size_t element_size; // element_size != 0<br>
+//   std::size_t element_count;<br>
+// };<br>
+static inline bool IsARMABIArrayCookie(uptr chunk_beg, uptr chunk_size,<br>
+                                       uptr addr) {<br>
+  return chunk_size == 2 * sizeof(uptr) && chunk_beg + chunk_size == addr &&<br>
+         *reinterpret_cast<uptr *>(chunk_beg + sizeof(uptr)) == 0;<br>
+}<br>
+<br>
 // Special case for "new T[0]" where T is a type with DTOR.<br>
-// new T[0] will allocate one word for the array size (0) and store a pointer<br>
-// to the end of allocated chunk.<br>
+// new T[0] will allocate a cookie (one or two words) for the array size (0)<br>
+// and store a pointer to the end of allocated chunk. The actual cookie layout<br>
+// varies between platforms according to their C++ ABI implementation.<br>
 inline bool IsSpecialCaseOfOperatorNew0(<wbr>uptr chunk_beg, uptr chunk_size,<br>
                                         uptr addr) {<br>
-  return chunk_size == sizeof(uptr) && chunk_beg + chunk_size == addr &&<br>
-         *reinterpret_cast<uptr *>(chunk_beg) == 0;<br>
+#if defined(__arm__)<br>
+  return IsARMABIArrayCookie(chunk_beg, chunk_size, addr);<br>
+#else<br>
+  return IsItaniumABIArrayCookie(chunk_<wbr>beg, chunk_size, addr);<br>
+#endif<br>
 }<br>
<br>
 // The following must be implemented in the parent tool.<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.cc?rev=299948&r1=299947&<wbr>r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.cc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.cc Tue Apr 11 09:58:26 2017<br>
@@ -1283,6 +1283,72 @@ uptr internal_clone(int (*fn)(void *), v<br>
                        : "memory");<br>
   return res;<br>
 }<br>
+#elif defined(__arm__) && SANITIZER_LINUX<br>
+uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,<br>
+                    int *parent_tidptr, void *newtls, int *child_tidptr) {<br>
+  unsigned int res;<br>
+  if (!fn || !child_stack)<br>
+    return -EINVAL;<br>
+  child_stack = (char *)child_stack - 2 * sizeof(unsigned int);<br>
+  ((unsigned int *)child_stack)[0] = (uptr)fn;<br>
+  ((unsigned int *)child_stack)[1] = (uptr)arg;<br>
+  register int r0 __asm__("r0") = flags;<br>
+  register void *r1 __asm__("r1") = child_stack;<br>
+  register int *r2 __asm__("r2") = parent_tidptr;<br>
+  register void *r3 __asm__("r3") = newtls;<br>
+  register int *r4 __asm__("r4") = child_tidptr;<br>
+  register int r7 __asm__("r7") = __NR_clone;<br>
+<br>
+#if __ARM_ARCH > 4 || defined (__ARM_ARCH_4T__)<br>
+# define ARCH_HAS_BX<br>
+#endif<br>
+#if __ARM_ARCH > 4<br>
+# define ARCH_HAS_BLX<br>
+#endif<br>
+<br>
+#ifdef ARCH_HAS_BX<br>
+# ifdef ARCH_HAS_BLX<br>
+#  define BLX(R) "blx "  #R "\n"<br>
+# else<br>
+#  define BLX(R) "mov lr, pc; bx " #R "\n"<br>
+# endif<br>
+#else<br>
+# define BLX(R)  "mov lr, pc; mov pc," #R "\n"<br>
+#endif<br>
+<br>
+  __asm__ __volatile__(<br>
+                       /* %r0 = syscall(%r7 = SYSCALL(clone),<br>
+                        *               %r0 = flags,<br>
+                        *               %r1 = child_stack,<br>
+                        *               %r2 = parent_tidptr,<br>
+                        *               %r3  = new_tls,<br>
+                        *               %r4 = child_tidptr)<br>
+                        */<br>
+<br>
+                       /* Do the system call */<br>
+                       "swi 0x0\n"<br>
+<br>
+                       /* if (%r0 != 0)<br>
+                        *   return %r0;<br>
+                        */<br>
+                       "cmp r0, #0\n"<br>
+                       "bne 1f\n"<br>
+<br>
+                       /* In the child, now. Call "fn(arg)". */<br>
+                       "ldr r0, [sp, #4]\n"<br>
+                       "ldr ip, [sp], #8\n"<br>
+                       BLX(ip)<br>
+                       /* Call _exit(%r0). */<br>
+                       "mov r7, %7\n"<br>
+                       "swi 0x0\n"<br>
+                       "1:\n"<br>
+                       "mov %0, r0\n"<br>
+                       : "=r"(res)<br>
+                       : "r"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r7),<br>
+                         "i"(__NR_exit)<br>
+                       : "memory");<br>
+  return res;<br>
+}<br>
 #endif  // defined(__x86_64__) && SANITIZER_LINUX<br>
<br>
 #if SANITIZER_ANDROID<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.h?rev=299948&r1=299947&<wbr>r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.h (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux.h Tue Apr 11 09:58:26 2017<br>
@@ -48,7 +48,8 @@ int internal_sigaction_syscall(int signu<br>
 #endif<br>
 void internal_sigdelset(__<wbr>sanitizer_sigset_t *set, int signum);<br>
 #if defined(__x86_64__) || defined(__mips__) || defined(__aarch64__) \<br>
-  || defined(__powerpc64__) || defined(__s390__) || defined(__i386__)<br>
+  || defined(__powerpc64__) || defined(__s390__) || defined(__i386__) \<br>
+  || defined(__arm__)<br>
 uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,<br>
                     int *parent_tidptr, void *newtls, int *child_tidptr);<br>
 #endif<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux_libcdep.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux_libcdep.cc?rev=299948&<wbr>r1=299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux_libcdep.cc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>linux_libcdep.cc Tue Apr 11 09:58:26 2017<br>
@@ -183,8 +183,8 @@ void InitTlsSize() { }<br>
 #endif  // !SANITIZER_FREEBSD && !SANITIZER_ANDROID && !SANITIZER_GO<br>
<br>
 #if (defined(__x86_64__) || defined(__i386__) || defined(__mips__) \<br>
-    || defined(__aarch64__) || defined(__powerpc64__) || defined(__s390__)) \<br>
-    && SANITIZER_LINUX && !SANITIZER_ANDROID<br>
+    || defined(__aarch64__) || defined(__powerpc64__) || defined(__s390__) \<br>
+    || defined(__arm__)) && SANITIZER_LINUX && !SANITIZER_ANDROID<br>
 // sizeof(struct pthread) from glibc.<br>
 static atomic_uintptr_t kThreadDescriptorSize;<br>
<br>
@@ -192,14 +192,14 @@ uptr ThreadDescriptorSize() {<br>
   uptr val = atomic_load(&<wbr>kThreadDescriptorSize, memory_order_relaxed);<br>
   if (val)<br>
     return val;<br>
-#if defined(__x86_64__) || defined(__i386__)<br>
+#if defined(__x86_64__) || defined(__i386__) || defined(__arm__)<br>
 #ifdef _CS_GNU_LIBC_VERSION<br>
   char buf[64];<br>
   uptr len = confstr(_CS_GNU_LIBC_VERSION, buf, sizeof(buf));<br>
   if (len < sizeof(buf) && internal_strncmp(buf, "glibc 2.", 8) == 0) {<br>
     char *end;<br>
     int minor = internal_simple_strtoll(buf + 8, &end, 10);<br>
-    if (end != buf + 8 && (*end == '\0' || *end == '.')) {<br>
+    if (end != buf + 8 && (*end == '\0' || *end == '.' || *end == '-')) {<br>
       int patch = 0;<br>
       if (*end == '.')<br>
         // strtoll will return 0 if no valid conversion could be performed<br>
@@ -208,6 +208,9 @@ uptr ThreadDescriptorSize() {<br>
       /* sizeof(struct pthread) values from various glibc versions.  */<br>
       if (SANITIZER_X32)<br>
         val = 1728;  // Assume only one particular version for x32.<br>
+      // For ARM sizeof(struct pthread) changed in Glibc 2.23.<br>
+      else if (SANITIZER_ARM)<br>
+        val = minor <= 22 ? 1120 : 1216;<br>
       else if (minor <= 3)<br>
         val = FIRST_32_SECOND_64(1104, 1696);<br>
       else if (minor == 4)<br>
@@ -293,7 +296,7 @@ uptr ThreadSelf() {<br>
                 rdhwr %0,$29;\<br>
                 .set pop" : "=r" (thread_pointer));<br>
   descr_addr = thread_pointer - kTlsTcbOffset - TlsPreTcbSize();<br>
-# elif defined(__aarch64__)<br>
+# elif defined(__aarch64__) || defined(__arm__)<br>
   descr_addr = reinterpret_cast<uptr>(__<wbr>builtin_thread_pointer()) -<br>
                                       ThreadDescriptorSize();<br>
 # elif defined(__s390__)<br>
@@ -342,7 +345,8 @@ static void GetTls(uptr *addr, uptr *siz<br>
   *size = GetTlsSize();<br>
   *addr -= *size;<br>
   *addr += ThreadDescriptorSize();<br>
-# elif defined(__mips__) || defined(__aarch64__) || defined(__powerpc64__)<br>
+# elif defined(__mips__) || defined(__aarch64__) || defined(__powerpc64__) \<br>
+    || defined(__arm__)<br>
   *addr = ThreadSelf();<br>
   *size = GetTlsSize();<br>
 # else<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>platform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>platform.h?rev=299948&r1=<wbr>299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>platform.h (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>platform.h Tue Apr 11 09:58:26 2017<br>
@@ -162,6 +162,12 @@<br>
 # define SANITIZER_PPC64V2 0<br>
 #endif<br>
<br>
+#if defined(__arm__)<br>
+# define SANITIZER_ARM 1<br>
+#else<br>
+# define SANITIZER_ARM 0<br>
+#endif<br>
+<br>
 // By default we allow to use SizeClassAllocator64 on 64-bit platform.<br>
 // But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64<br>
 // does not work well and we need to fallback to SizeClassAllocator32.<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>stoptheworld_linux_libcdep.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>stoptheworld_linux_libcdep.cc?<wbr>rev=299948&r1=299947&r2=<wbr>299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>stoptheworld_linux_libcdep.cc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>stoptheworld_linux_libcdep.cc Tue Apr 11 09:58:26 2017<br>
@@ -16,7 +16,8 @@<br>
<br>
 #if SANITIZER_LINUX && (defined(__x86_64__) || defined(__mips__) || \<br>
                         defined(__aarch64__) || defined(__powerpc64__) || \<br>
-                        defined(__s390__) || defined(__i386__))<br>
+                        defined(__s390__) || defined(__i386__) || \<br>
+                        defined(__arm__))<br>
<br>
 #include "sanitizer_stoptheworld.h"<br>
<br>
@@ -532,4 +533,4 @@ uptr SuspendedThreadsList::<wbr>RegisterCount<br>
<br>
 #endif  // SANITIZER_LINUX && (defined(__x86_64__) || defined(__mips__)<br>
         // || defined(__aarch64__) || defined(__powerpc64__)<br>
-        // || defined(__s390__) || defined(__i386__)<br>
+        // || defined(__s390__) || defined(__i386__) || defined(__arm__)<br>
<br>
Modified: compiler-rt/trunk/test/asan/<wbr>TestCases/Linux/clang_gcc_abi.<wbr>cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/clang_gcc_abi.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/TestCases/Linux/<wbr>clang_gcc_abi.cc?rev=299948&<wbr>r1=299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>TestCases/Linux/clang_gcc_abi.<wbr>cc (original)<br>
+++ compiler-rt/trunk/test/asan/<wbr>TestCases/Linux/clang_gcc_abi.<wbr>cc Tue Apr 11 09:58:26 2017<br>
@@ -3,7 +3,7 @@<br>
 // RUN: %clangxx_asan -O2 -x c %s -o %t && not %run %t 2>&1 | FileCheck %s<br>
 // RUN: %clangxx_asan -O3 -x c %s -o %t && not %run %t 2>&1 | FileCheck %s<br>
<br>
-// REQUIRES: arm-target-arch<br>
+// REQUIRES: arm-target-arch, fast-unwinder-works<br>
 // XFAIL: armv7l-unknown-linux-gnueabihf<br>
<br>
 #include <stdlib.h><br>
<br>
Modified: compiler-rt/trunk/test/asan/<wbr>lit.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/lit.cfg?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/lit.cfg?rev=299948&<wbr>r1=299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>lit.cfg (original)<br>
+++ compiler-rt/trunk/test/asan/<wbr>lit.cfg Tue Apr 11 09:58:26 2017<br>
@@ -2,6 +2,7 @@<br>
<br>
 import os<br>
 import platform<br>
+import re<br>
<br>
 import lit.formats<br>
<br>
@@ -211,6 +212,10 @@ config.substitutions.append( ("%xdynamic<br>
 if config.target_arch != 'arm' and config.target_arch != 'armhf' and config.target_arch != 'aarch64':<br>
   config.available_features.add(<wbr>'stable-runtime')<br>
<br>
+# Fast unwinder doesn't work with Thumb<br>
+if not re.match('-mthumb', config.target_cflags):<br>
+  config.available_features.add(<wbr>'fast-unwinder-works')<br>
+<br>
 # Turn on leak detection on 64-bit Linux.<br>
 if config.host_os == 'Linux' and (config.target_arch == 'x86_64' or config.target_arch == 'i386'):<br>
   config.available_features.add(<wbr>'leak-detection')<br>
<br>
Modified: compiler-rt/trunk/test/lsan/<wbr>TestCases/large_allocation_<wbr>leak.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/large_allocation_leak.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/lsan/TestCases/large_<wbr>allocation_leak.cc?rev=299948&<wbr>r1=299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/lsan/<wbr>TestCases/large_allocation_<wbr>leak.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/<wbr>TestCases/large_allocation_<wbr>leak.cc Tue Apr 11 09:58:26 2017<br>
@@ -5,7 +5,7 @@<br>
<br>
 // For 32 bit LSan it's pretty likely that large chunks are "reachable" from some<br>
 // internal data structures (e.g. Glibc global data).<br>
-// UNSUPPORTED: x86<br>
+// UNSUPPORTED: x86, arm<br>
<br>
 #include <stdio.h><br>
 #include <stdlib.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/<wbr>TestCases/swapcontext.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/swapcontext.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/lsan/TestCases/<wbr>swapcontext.cc?rev=299948&r1=<wbr>299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/lsan/<wbr>TestCases/swapcontext.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/<wbr>TestCases/swapcontext.cc Tue Apr 11 09:58:26 2017<br>
@@ -2,8 +2,10 @@<br>
 // memory. Make sure we don't report these leaks.<br>
<br>
 // RUN: %clangxx_lsan %s -o %t<br>
-// RUN: %run %t 2>&1<br>
-// RUN: not %run %t foo 2>&1 | FileCheck %s<br>
+// RUN: LSAN_BASE="detect_leaks=1"<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 2>&1<br>
+// RUN: LSAN_OPTIONS=$LSAN_BASE not %run %t foo 2>&1 | FileCheck %s<br>
+// UNSUPPORTED: arm<br>
<br>
 #include <stdio.h><br>
 #if defined(__APPLE__)<br>
@@ -23,7 +25,7 @@ void Child() {<br>
 }<br>
<br>
 int main(int argc, char *argv[]) {<br>
-  char stack_memory[kStackSize + 1];<br>
+  char stack_memory[kStackSize + 1] __attribute__((aligned(16)));<br>
   char *heap_memory = new char[kStackSize + 1];<br>
   char *child_stack = (argc > 1) ? stack_memory : heap_memory;<br>
<br>
<br>
Modified: compiler-rt/trunk/test/lsan/<wbr>TestCases/use_registers.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/use_registers.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/lsan/TestCases/use_<wbr>registers.cc?rev=299948&r1=<wbr>299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/lsan/<wbr>TestCases/use_registers.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/<wbr>TestCases/use_registers.cc Tue Apr 11 09:58:26 2017<br>
@@ -33,6 +33,11 @@ void *registers_thread_func(void *arg) {<br>
       :<br>
       : "r" (p)<br>
       );<br>
+#elif defined(__arm__)<br>
+  asm ( "mov r5, %0"<br>
+      :<br>
+      : "r" (p)<br>
+      );<br>
 #else<br>
 #error "Test is not supported on this architecture."<br>
 #endif<br>
<br>
Modified: compiler-rt/trunk/test/lsan/<wbr>TestCases/use_tls_dynamic.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/TestCases/use_tls_dynamic.cc?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/lsan/TestCases/use_tls_<wbr>dynamic.cc?rev=299948&r1=<wbr>299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/lsan/<wbr>TestCases/use_tls_dynamic.cc (original)<br>
+++ compiler-rt/trunk/test/lsan/<wbr>TestCases/use_tls_dynamic.cc Tue Apr 11 09:58:26 2017<br>
@@ -5,7 +5,7 @@<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE:"use_<wbr>tls=0" not %run %t 2>&1 | FileCheck %s<br>
 // RUN: LSAN_OPTIONS=$LSAN_BASE:"use_<wbr>tls=1" %run %t 2>&1<br>
 // RUN: LSAN_OPTIONS="" %run %t 2>&1<br>
-// UNSUPPORTED: i386-linux,i686-linux<br>
+// UNSUPPORTED: i386-linux,i686-linux,arm<br>
<br>
 #ifndef BUILD_DSO<br>
 #include <assert.h><br>
<br>
Modified: compiler-rt/trunk/test/lsan/<wbr>lit.common.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lsan/lit.common.cfg?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/lsan/lit.common.cfg?rev=<wbr>299948&r1=299947&r2=299948&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/lsan/<wbr>lit.common.cfg (original)<br>
+++ compiler-rt/trunk/test/lsan/<wbr>lit.common.cfg Tue Apr 11 09:58:26 2017<br>
@@ -3,6 +3,7 @@<br>
 # Common configuration for running leak detection tests under LSan/ASan.<br>
<br>
 import os<br>
+import re<br>
<br>
 import lit.util<br>
<br>
@@ -51,8 +52,12 @@ config.substitutions.append( ("%clangxx<br>
 config.substitutions.append( ("%clang_lsan ", build_invocation(clang_lsan_<wbr>cflags)) )<br>
 config.substitutions.append( ("%clangxx_lsan ", build_invocation(clang_lsan_<wbr>cxxflags)) )<br>
<br>
-# LeakSanitizer tests are currently supported on x86-64 Linux and mips64 Linux only.<br>
-if config.host_os not in ['Linux'] or config.host_arch not in ['x86_64', 'mips64']:<br>
+# LeakSanitizer tests are currently supported on x86-64 Linux, arm Linux and mips64 Linux only.<br>
+if config.host_os not in ['Linux'] or config.host_arch not in ['x86_64', 'mips64', 'arm', 'armhf', armv7l]:<br>
+  config.unsupported = True<br>
+<br>
+# Don't support Thumb due to broken fast unwinder<br>
+if re.match('-mthumb', config.target_cflags):<br>
   config.unsupported = True<br>
<br>
 config.suffixes = ['.c', '.cc', '.cpp']<br>
<br>
Modified: compiler-rt/trunk/test/<wbr>sanitizer_common/print_<wbr>address.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/print_address.h?rev=299948&r1=299947&r2=299948&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/sanitizer_common/print_<wbr>address.h?rev=299948&r1=<wbr>299947&r2=299948&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/<wbr>sanitizer_common/print_<wbr>address.h (original)<br>
+++ compiler-rt/trunk/test/<wbr>sanitizer_common/print_<wbr>address.h Tue Apr 11 09:58:26 2017<br>
@@ -11,7 +11,7 @@ void print_address(const char *str, int<br>
     // On FreeBSD, the %p conversion specifier works as 0x%x and thus does not<br>
     // match to the format used in the diagnotic message.<br>
     fprintf(stderr, "0x%012lx ", (unsigned long) p);<br>
-#elif defined(__i386__)<br>
+#elif defined(__i386__) || defined(__arm__)<br>
     fprintf(stderr, "0x%8lx ", (unsigned long) p);<br>
 #elif defined(__mips64)<br>
     fprintf(stderr, "0x%010lx ", (unsigned long) p);<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>