: gcc: Enable bits for sanitizer support on FreeBSD x86_64
diff mbox series

Message ID e67209b9-1e6c-af90-e914-7d11a2a132ee@fgznet.ch
State New
Headers show
Series
  • : gcc: Enable bits for sanitizer support on FreeBSD x86_64
Related show

Commit Message

Andreas Tobler Jan. 22, 2020, 9:27 p.m. UTC
Hi all,

this patch adds the necessary bits to enable asan support on FreeBSD x86_64.
Results will be produced over night.

Ok for trunk once it is open again?
TIA,
Andreas

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.
   * asan/asan_interceptors.h: Define ASAN_INTERCEPT_SWAPCONTEXT for
   FreeBSD.
From 93978ce66c4eeff0bde2f44f8c0809fc66165e5b Mon Sep 17 00:00:00 2001
From: Andreas Tobler <andreast@gcc.gnu.org>
Date: Tue, 21 Jan 2020 22:17:09 +0100

Comments

Kamil Rytarowski Jan. 22, 2020, 9:39 p.m. UTC | #1
On 22.01.2020 22:27, Andreas Tobler wrote:
> Hi all,
> 
> this patch adds the necessary bits to enable asan support on FreeBSD
> x86_64.
> Results will be produced over night.
> 
> Ok for trunk once it is open again?
> TIA,
> Andreas
> 
> 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.
>   * asan/asan_interceptors.h: Define ASAN_INTERCEPT_SWAPCONTEXT for
>   FreeBSD.
> 

Please push the libsanitizer change through LLVM compiler-rt. There was
a contract to submit all patches there and merge in GCC.

Patch
diff mbox series

diff --git a/gcc/config/freebsd.h b/gcc/config/freebsd.h
index d9d6be7a8c8..4b5140bae02 100644
--- a/gcc/config/freebsd.h
+++ b/gcc/config/freebsd.h
@@ -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.  */
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index 1b94cb88c98..5b7b1e889a9 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -337,6 +337,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)
diff --git a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h
index 8fb0f0aaf5c..9d66602142e 100644
--- a/gcc/config/i386/freebsd.h
+++ b/gcc/config/i386/freebsd.h
@@ -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)
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ffe60baa72a..71baca4e0c9 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -1396,9 +1396,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;
 }
 
 /* Argument support functions.  */
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 943e9a5c783..18b27bb535b 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -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 ()
 
diff --git a/libsanitizer/ChangeLog b/libsanitizer/ChangeLog
index 4d8ec02f96e..c48460a4d36 100644
--- a/libsanitizer/ChangeLog
+++ b/libsanitizer/ChangeLog
@@ -1,3 +1,9 @@ 
+2020-01-22  Andreas Tobler  <andreast@gcc.gnu.org>
+
+	* configure.tgt: Add x86_64- and i?86-*-freebsd* targets.
+	* asan/asan_interceptors.h: Define ASAN_INTERCEPT_SWAPCONTEXT for
+	FreeBSD.
+
 2020-01-22  Andreas Tobler  <andreast@gcc.gnu.org>
 
 	* sanitizer_common/Makefile.am: Add
diff --git a/libsanitizer/asan/asan_interceptors.h b/libsanitizer/asan/asan_interceptors.h
index b7a85fedbdf..91bf05ebab3 100644
--- a/libsanitizer/asan/asan_interceptors.h
+++ b/libsanitizer/asan/asan_interceptors.h
@@ -59,7 +59,8 @@  void InitializePlatformInterceptors();
 # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0
 #endif
 
-#if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_SOLARIS
+#if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_SOLARIS || \
+    SANITIZER_FREEBSD
 # define ASAN_INTERCEPT_SWAPCONTEXT 1
 #else
 # define ASAN_INTERCEPT_SWAPCONTEXT 0
diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
index f7f3a6bd3ff..ffc351ce813 100644
--- a/libsanitizer/configure.tgt
+++ b/libsanitizer/configure.tgt
@@ -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