aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Tobler <andreast@gcc.gnu.org>2020-05-01 09:04:01 +0200
committerAndreas Tobler <andreast@gcc.gnu.org>2020-05-01 17:18:47 +0200
commitd730fd95eebaecad8e26f9e089c7df4630e94f1c (patch)
tree8cf46989a075ad91f0be9d2eb137882a5c3a9d0a /gcc
parentbf1dde9790d304188b10228c24a448fa454ed7b0 (diff)
downloadgcc-d730fd95eebaecad8e26f9e089c7df4630e94f1c.zip
gcc-d730fd95eebaecad8e26f9e089c7df4630e94f1c.tar.gz
gcc-d730fd95eebaecad8e26f9e089c7df4630e94f1c.tar.bz2
gcc: Enable bits for sanitizer support on FreeBSD x86_64
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/freebsd.h21
-rw-r--r--gcc/config/i386/darwin.h6
-rw-r--r--gcc/config/i386/freebsd.h4
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/config/i386/i386.h7
6 files changed, 48 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c2ef0d..5a0a821 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/freebsd.h b/gcc/config/freebsd.h
index d9d6be7..4b5140b 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 5faa1f4..cff9a8c 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -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)
diff --git a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h
index 8fb0f0a..9d66602 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 59101d8..c4a538e 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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;
}
/* Argument support functions. */
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index b8dddfc..08245f6 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 ()