gcc: Enable bits for sanitizer support on FreeBSD x86_64
authorAndreas Tobler <andreast@gcc.gnu.org>
Fri, 1 May 2020 07:04:01 +0000 (09:04 +0200)
committerAndreas Tobler <andreast@gcc.gnu.org>
Fri, 1 May 2020 15:18:47 +0000 (17:18 +0200)
This patch add the necessary bits to suport libasan on FreeBSD x86_64.

gcc
* config/i386/i386.h: Define a new macro: SUBTARGET_SHADOW_OFFSET.
* config/i386/i386.c (ix86_asan_shadow_offset): Use this macro.
* config/i386/darwin.h: Override the SUBTARGET_SHADOW_OFFSET macro.
* config/i386/freebsd.h: Likewise.
* config/freebsd.h (LIBASAN_EARLY_SPEC): Define.
LIBTSAN_EARLY_SPEC): Likewise. (LIBLSAN_EARLY_SPEC): Likewise.

libsanitizer:

* configure.tgt: Add x86_64- and i?86-*-freebsd* targets.

gcc/ChangeLog
gcc/config/freebsd.h
gcc/config/i386/darwin.h
gcc/config/i386/freebsd.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
libsanitizer/ChangeLog
libsanitizer/configure.tgt

index 4c2ef0d4a1a32835adf53146276ee2fc9ab7fdbd..5a0a82128a8be6802449ee6b842fe94ad1f90e08 100644 (file)
@@ -1,3 +1,12 @@
+2020-05-01  Andreas Tobler  <andreast@gcc.gnu.org>
+
+       * config/i386/i386.h: Define a new macro: SUBTARGET_SHADOW_OFFSET.
+       * config/i386/i386.c (ix86_asan_shadow_offset): Use this macro.
+       * config/i386/darwin.h: Override the SUBTARGET_SHADOW_OFFSET macro.
+       * config/i386/freebsd.h: Likewise.
+       * config/freebsd.h (LIBASAN_EARLY_SPEC): Define.
+       LIBTSAN_EARLY_SPEC): Likewise. (LIBLSAN_EARLY_SPEC): Likewise.
+
 2020-04-30  Alexandre Oliva <oliva@adacore.com>
 
        * doc/sourcebuild.texi (Effective-Target Keywords): Document
index d9d6be7a8c8524e4e7f728e5b6387c8022e8d530..4b5140bae0220408aea679fbb608c751af29c247 100644 (file)
@@ -62,6 +62,27 @@ along with GCC; see the file COPYING3.  If not see
 #define USE_LD_AS_NEEDED 1
 #endif
 
+/* Link -lasan early on the command line.  For -static-libasan, don't link
+   it for -shared link, the executable should be compiled with -static-libasan
+   in that case, and for executable link with --{,no-}whole-archive around
+   it to force everything into the executable.  And similarly for -ltsan
+   and -llsan.  */
+#if defined(HAVE_LD_STATIC_DYNAMIC)
+#undef LIBASAN_EARLY_SPEC
+#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
+  "%{static-libasan:%{!shared:" \
+  LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
+  LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan -lpthread}"
+#undef LIBTSAN_EARLY_SPEC
+#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
+  LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
+  LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan -lpthread}"
+#undef LIBLSAN_EARLY_SPEC
+#define LIBLSAN_EARLY_SPEC "%{static-liblsan:%{!shared:" \
+  LD_STATIC_OPTION " --whole-archive -llsan --no-whole-archive " \
+  LD_DYNAMIC_OPTION "}}%{!static-liblsan:-llsan -lpthread}"
+#endif
+
 /************************[  Target stuff  ]***********************************/
 
 /* All FreeBSD Architectures support the ELF object file format.  */
index 5faa1f40089c0c08d6fa3747e359d7874babc334..cff9a8c6b01e6105773df8b7afbee580b2e9cdea 100644 (file)
@@ -347,6 +347,12 @@ along with GCC; see the file COPYING3.  If not see
 #define SUBTARGET_INIT_BUILTINS                                                \
   do {                                                                 \
     ix86_builtins[(int) IX86_BUILTIN_CFSTRING]                         \
+
+/* Define the shadow offset for asan.  */
+#undef SUBTARGET_SHADOW_OFFSET
+#define SUBTARGET_SHADOW_OFFSET        \
+  (TARGET_LP64 ? HOST_WIDE_INT_1 << 44 : HOST_WIDE_INT_1 << 29)
+
       = darwin_init_cfstring_builtins ((unsigned) (IX86_BUILTIN_CFSTRING)); \
     darwin_rename_builtins ();                                         \
   } while(0)
index 8fb0f0aaf5c3fa6f61e1ab4b03d7013d811bd672..9d66602142e06b6893569ff259f7181d9cca714d 100644 (file)
@@ -129,3 +129,7 @@ along with GCC; see the file COPYING3.  If not see
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
+/* Define the shadow offsets for asan.  */
+#undef SUBTARGET_SHADOW_OFFSET
+#define SUBTARGET_SHADOW_OFFSET        \
+  (TARGET_LP64 ? HOST_WIDE_INT_1 << 46 : HOST_WIDE_INT_1 << 30)
index 59101d8028a0a5304ddef90fe75d615edc05199d..c4a538ed0c8e901fd0b44b74f0c425821d24bdad 100644 (file)
@@ -1397,9 +1397,7 @@ ix86_legitimate_combined_insn (rtx_insn *insn)
 static unsigned HOST_WIDE_INT
 ix86_asan_shadow_offset (void)
 {
-  return TARGET_LP64 ? (TARGET_MACHO ? (HOST_WIDE_INT_1 << 44)
-                                    : HOST_WIDE_INT_C (0x7fff8000))
-                    : (HOST_WIDE_INT_1 << 29);
+  return SUBTARGET_SHADOW_OFFSET;
 }
 \f
 /* Argument support functions.  */
index b8dddfc1594b5cfe0d9d448f2cd42a324d45b706..08245f643225690a0cbc84f6bd45b663dc26e2c7 100644 (file)
@@ -1321,6 +1321,13 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define SUBTARGET_FRAME_POINTER_REQUIRED 0
 #endif
 
+/* Define the shadow offset for asan. Other OS's can override in the
+   respective tm.h files.  */
+#ifndef SUBTARGET_SHADOW_OFFSET
+#define SUBTARGET_SHADOW_OFFSET            \
+  (TARGET_LP64 ? HOST_WIDE_INT_C (0x7fff8000) : HOST_WIDE_INT_1 << 29)
+#endif
+
 /* Make sure we can access arbitrary call frames.  */
 #define SETUP_FRAME_ADDRESSES()  ix86_setup_frame_addresses ()
 
index 476cb416c366fa08b8c0c8f66394f7c40309f500..134018503c324fe1fc219988cbc65b05a3f97f99 100644 (file)
@@ -1,3 +1,6 @@
+2020-05-01  Andreas Tobler  <andreast@gcc.gnu.org>
+
+       * configure.tgt: Add x86_64- and i?86-*-freebsd* targets.
 
 2020-05-01  Andreas Tobler  <andreast@gcc.gnu.org>
 
index 5d46990eba4d33c83b10569803a37c3ffebf1607..52503f1a880ba08b515b8a429ac44a262873f74b 100644 (file)
@@ -22,6 +22,8 @@
 TSAN_TARGET_DEPENDENT_OBJECTS=
 SANITIZER_COMMON_TARGET_DEPENDENT_OBJECTS=
 case "${target}" in
+  x86_64-*-freebsd* | i?86-*-freebsd*)
+       ;;
   x86_64-*-linux* | i?86-*-linux*)
        if test x$ac_cv_sizeof_void_p = x8; then
                TSAN_SUPPORTED=yes