[compiler-rt] Enable ASAN for powerpc64le-linux

Kostya Serebryany kcc at google.com
Tue Oct 14 11:32:45 PDT 2014


The patch looks good, thanks!

On Tue, Oct 14, 2014 at 8:06 AM, Peter Bergner <bergner at vnet.ibm.com> wrote:

> The following patch gets ASAN somewhat working on powerpc64le-linux.
> It currently assumes the LE kernel uses 46-bit addressing, which is
> true, but it doesn't solve the case for BE where it may be 44 or
> 46 bits.  That can be fixed with a follow on patch.
>
Let's do it on demand.

Please use http://llvm.org/docs/Phabricator.html for any changes that are
even slightly less trivial than this one
(preferably for all changes).


>
> There are some test suite fails even with this patch that I haven't had
> time to solve yet, but this is better than the state it is in now.
> The limited debugging of those test suite fails seems to show that the
> address map for 46-bit addressing has changed and so we'll need to
> modify the shadow memory location slightly.  Again, that can be fixed
> with a follow on patch.
>
> Is this ok to commit?
>
> Peter
>
>
> Index: lib/asan/asan_mapping.h
> ===================================================================
> --- lib/asan/asan_mapping.h     (revision 219685)
> +++ lib/asan/asan_mapping.h     (working copy)
> @@ -87,7 +87,11 @@
>  static const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000;  // < 2G.
>  static const u64 kAArch64_ShadowOffset64 = 1ULL << 36;
>  static const u64 kMIPS32_ShadowOffset32 = 0x0aaa8000;
> +#if defined(__powerpc64__) && defined (__BIG_ENDIAN__)
>  static const u64 kPPC64_ShadowOffset64 = 1ULL << 41;
> +#elif defined(__powerpc64__) && defined (__LITTLE_ENDIAN__)
> +static const u64 kPPC64_ShadowOffset64 = 1ULL << 43;
> +#endif
>  static const u64 kFreeBSD_ShadowOffset32 = 1ULL << 30;  // 0x40000000
>  static const u64 kFreeBSD_ShadowOffset64 = 1ULL << 46;  // 0x400000000000
>
> Index: lib/asan/asan_report.cc
> ===================================================================
> --- lib/asan/asan_report.cc     (revision 219685)
> +++ lib/asan/asan_report.cc     (working copy)
> @@ -437,8 +437,8 @@
>    // especially given that the alloca may be from entirely different place
>    // (e.g. use-after-scope, or different thread's stack).
>    StackTrace alloca_stack;
> -#ifdef __powerpc64__
> -  // On PowerPC64, the address of a function actually points to a
> +#if defined(__powerpc64__) and defined(__BIG_ENDIAN__)
> +  // On PowerPC64 ELFv1, the address of a function actually points to a
>    // three-doubleword data structure with the first field containing
>    // the address of the function's code.
>    access.frame_pc = *reinterpret_cast<uptr *>(access.frame_pc);
> Index: lib/sanitizer_common/sanitizer_posix.cc
> ===================================================================
> --- lib/sanitizer_common/sanitizer_posix.cc     (revision 219685)
> +++ lib/sanitizer_common/sanitizer_posix.cc     (working copy)
> @@ -78,7 +78,7 @@
>
>  uptr GetMaxVirtualAddress() {
>  #if SANITIZER_WORDSIZE == 64
> -# if defined(__powerpc64__)
> +# if defined(__powerpc64__) && defined(__BIG_ENDIAN__)
>    // On PowerPC64 we have two different address space layouts: 44- and
> 46-bit.
>    // We somehow need to figure out which one we are using now and choose
>    // one of 0x00000fffffffffffUL and 0x00003fffffffffffUL.
> @@ -85,6 +85,8 @@
>    // Note that with 'ulimit -s unlimited' the stack is moved away from
> the top
>    // of the address space, so simply checking the stack address is not
> enough.
>    return (1ULL << 44) - 1;  // 0x00000fffffffffffUL
> +# elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
> +  return (1ULL << 46) - 1;  // 0x00003fffffffffffUL
>  # elif defined(__aarch64__)
>    return (1ULL << 39) - 1;
>  # else
> Index: lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> ===================================================================
> --- lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc  (revision
> 219685)
> +++ lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc  (working
> copy)
> @@ -341,8 +341,10 @@
>      const char* const kSymbolizerArch = "--default-arch=x86_64";
>  #elif defined(__i386__)
>      const char* const kSymbolizerArch = "--default-arch=i386";
> -#elif defined(__powerpc64__)
> +#elif defined(__powerpc64__) && defined(__BIG_ENDIAN__)
>      const char* const kSymbolizerArch = "--default-arch=powerpc64";
> +#elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
> +    const char* const kSymbolizerArch = "--default-arch=powerpc64le";
>  #else
>      const char* const kSymbolizerArch = "--default-arch=unknown";
>  #endif
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141014/219b3c90/attachment.html>


More information about the llvm-commits mailing list