From: Alexey Samsonov Date: Fri, 25 Jul 2014 22:05:02 +0000 (+0000) Subject: [Sanitizer] Introduce SANITIZER_CAN_USE_PREINIT_ARRAY definition and use it across... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2178054216fb78fd4469404e3fa4d9b1f2ab43f6;p=platform%2Fupstream%2Fllvm.git [Sanitizer] Introduce SANITIZER_CAN_USE_PREINIT_ARRAY definition and use it across sanitizers. Get rid of ASAN_USE_PREINIT_ARRAY and LSAN_USE_PREINIT_ARRAY - just always use .preinit_array if it's available. This mode seems stable enough, and we've been relying on default values of these macro for a long time. llvm-svn: 213980 --- diff --git a/compiler-rt/lib/asan/asan_internal.h b/compiler-rt/lib/asan/asan_internal.h index 0782789..38eb6a3 100644 --- a/compiler-rt/lib/asan/asan_internal.h +++ b/compiler-rt/lib/asan/asan_internal.h @@ -45,10 +45,6 @@ # endif #endif -#ifndef ASAN_USE_PREINIT_ARRAY -# define ASAN_USE_PREINIT_ARRAY (SANITIZER_LINUX && !SANITIZER_ANDROID) -#endif - #ifndef ASAN_DYNAMIC # ifdef PIC # define ASAN_DYNAMIC 1 diff --git a/compiler-rt/lib/asan/asan_preinit.cc b/compiler-rt/lib/asan/asan_preinit.cc index 586f551..0dd0a09 100644 --- a/compiler-rt/lib/asan/asan_preinit.cc +++ b/compiler-rt/lib/asan/asan_preinit.cc @@ -10,14 +10,10 @@ // This file is a part of AddressSanitizer, an address sanity checker. // // Call __asan_init at the very early stage of process startup. -// On Linux we use .preinit_array section (unless PIC macro is defined). //===----------------------------------------------------------------------===// #include "asan_internal.h" -#if ASAN_USE_PREINIT_ARRAY && !defined(PIC) - // On Linux, we force __asan_init to be called before anyone else - // by placing it into .preinit_array section. - // FIXME: do we have anything like this on Mac? +#if SANITIZER_CAN_USE_PREINIT_ARRAY // The symbol is called __local_asan_preinit, because it's not intended to be // exported. __attribute__((section(".preinit_array"), used)) diff --git a/compiler-rt/lib/dfsan/dfsan.cc b/compiler-rt/lib/dfsan/dfsan.cc index 076ec58..2a66831 100644 --- a/compiler-rt/lib/dfsan/dfsan.cc +++ b/compiler-rt/lib/dfsan/dfsan.cc @@ -269,7 +269,7 @@ static void dfsan_init(int argc, char **argv, char **envp) { InitializeInterceptors(); } -#ifndef DFSAN_NOLIBC +#ifndef DFSAN_NOLIBC && SANITIZER_CAN_USE_PREINIT_ARRAY __attribute__((section(".preinit_array"), used)) static void (*dfsan_init_ptr)(int, char **, char **) = dfsan_init; #endif diff --git a/compiler-rt/lib/lsan/lsan_preinit.cc b/compiler-rt/lib/lsan/lsan_preinit.cc index e663951..5a19095 100644 --- a/compiler-rt/lib/lsan/lsan_preinit.cc +++ b/compiler-rt/lib/lsan/lsan_preinit.cc @@ -14,11 +14,7 @@ #include "lsan.h" -#ifndef LSAN_USE_PREINIT_ARRAY -#define LSAN_USE_PREINIT_ARRAY 1 -#endif - -#if LSAN_USE_PREINIT_ARRAY && !defined(PIC) +#if SANITIZER_CAN_USE_PREINIT_ARRAY // We force __lsan_init to be called before anyone else by placing it into // .preinit_array section. __attribute__((section(".preinit_array"), used)) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h b/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h index c8985b49..d77ca8f 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h @@ -34,6 +34,15 @@ # define SANITIZER_SUPPORTS_WEAK_HOOKS 0 #endif +// We can use .preinit_array section on Linux to call sanitizer initialization +// functions very early in the process startup (unless PIC macro is defined). +// FIXME: do we have anything like this on Mac? +#if SANITIZER_LINUX && !SANITIZER_ANDROID && !defined(PIC) +# define SANITIZER_CAN_USE_PREINIT_ARRAY 1 +#else +# define SANITIZER_CAN_USE_PREINIT_ARRAY 0 +#endif + // GCC does not understand __has_feature #if !defined(__has_feature) # define __has_feature(x) 0