[PATCH] D24768: [compiler-rt] Fix Asan build on Android

Etienne Bergeron via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 20 08:37:21 PDT 2016


etienneb created this revision.
etienneb added a reviewer: rnk.
etienneb added subscribers: chrisha, llvm-commits.
Herald added subscribers: dberris, kubabrecka, danalbert, tberghammer.

The dynamic shadow code is not detected correctly on Android.
The android shadow seems to start at address zero.

The bug is introduced here:
  https://reviews.llvm.org/D23363

Started here: https://build.chromium.org/p/chromium.fyi/builders/ClangToTAndroidASan/builds/4029
Likely due to an asan runtime change, filed https://llvm.org/bugs/show_bug.cgi?id=30462


From asan_mapping.h:
=====================================
#if SANITIZER_WORDSIZE == 32
#  if SANITIZER_ANDROID
#    define SHADOW_OFFSET (0)   <<---- HERE
#  elif defined(__mips__)

Shadow address on android is 0.

From asan_rtl.c:
=====================================
  if (shadow_start == 0) {
    [...]
    shadow_start = FindAvailableMemoryRange(space_size, alignment, granularity);
  }

We assumed that 0 is dynamic address.

On windows, the address was determined with:
#  elif SANITIZER_WINDOWS64
#   define SHADOW_OFFSET __asan_shadow_memory_dynamic_address
#  else

and __asan_shadow_memory_dynamic_address is initially zero.

https://reviews.llvm.org/D24768

Files:
  lib/asan/asan_mapping.h
  lib/asan/asan_rtl.cc

Index: lib/asan/asan_rtl.cc
===================================================================
--- lib/asan/asan_rtl.cc
+++ lib/asan/asan_rtl.cc
@@ -463,16 +463,17 @@
 
   __asan_shadow_memory_dynamic_address = 0;
   uptr shadow_start = kLowShadowBeg;
-  if (shadow_start == 0) {
-    uptr granularity = GetMmapGranularity();
-    uptr alignment = 8 * granularity;
-    uptr left_padding = granularity;
-    uptr space_size = kHighShadowEnd + left_padding;
-
-    shadow_start = FindAvailableMemoryRange(space_size, alignment, granularity);
-    CHECK_NE((uptr)0, shadow_start);
-    CHECK(IsAligned(shadow_start, alignment));
-  }
+#if ASAN_DYNAMIC_SHADOW_ADDRESS
+  CHECK_EQ(0, shadow_start);
+  uptr granularity = GetMmapGranularity();
+  uptr alignment = 8 * granularity;
+  uptr left_padding = granularity;
+  uptr space_size = kHighShadowEnd + left_padding;
+
+  shadow_start = FindAvailableMemoryRange(space_size, alignment, granularity);
+  CHECK_NE((uptr)0, shadow_start);
+  CHECK(IsAligned(shadow_start, alignment));
+#endif
   __asan_shadow_memory_dynamic_address = shadow_start;
 
   if (kLowShadowBeg)
Index: lib/asan/asan_mapping.h
===================================================================
--- lib/asan/asan_mapping.h
+++ lib/asan/asan_mapping.h
@@ -183,6 +183,7 @@
 #   define SHADOW_OFFSET kMIPS64_ShadowOffset64
 #  elif SANITIZER_WINDOWS64
 #   define SHADOW_OFFSET __asan_shadow_memory_dynamic_address
+#   define ASAN_DYNAMIC_SHADOW_ADDRESS 1
 #  else
 #   define SHADOW_OFFSET kDefaultShort64bitShadowOffset
 #  endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24768.71942.patch
Type: text/x-patch
Size: 1551 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160920/fa039ed8/attachment.bin>


More information about the llvm-commits mailing list