From patchwork Wed Jan 22 21:27:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Tobler X-Patchwork-Id: 1227435 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-518076-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=fgznet.ch Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha1 header.s=default header.b=gGHshA3c; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 482z5N5HYSz9s1x for ; Thu, 23 Jan 2020 08:27:36 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=nHy6G/wETHQm+LzW3prlt5ZNJJN04ClLS1LEF4ef8af1+mZXJ+ aHZg6ysmWt4w+TeGXVxkKqGnY6yvY8M9BfkI3vsrYfz8yy6OakArlVGKMgre4oE1 gvZp7CGfMI2V28YfrKxnCnrXm3oUrCwPQ6NCKaROafZmG1HSl9Pm0OSU4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=8kV7VC+iz+EKUU2V+AmK6xYyoYc=; b=gGHshA3chKZnqPB+U94+ 1fLSp78mpjELTrFWU6rGfdsWDDxBOJYva2fwUQFe1WAUlViPp2PeTivq0r82QpqV 6l+3u1FMPcKgqaNGAVPEcoNyeaaZaXGHh7u7IToSWTGOKu8BWJzwwgqJaWdbKEkq D4SZQvkTNJC8scChBPOa6Z8= Received: (qmail 18994 invoked by alias); 22 Jan 2020 21:27:28 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 18985 invoked by uid 89); 22 Jan 2020 21:27:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-14.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=tia X-HELO: smtp.fgznet.ch Received: from smtp.fgznet.ch (HELO smtp.fgznet.ch) (157.161.14.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 22 Jan 2020 21:27:27 +0000 Received: from [192.168.225.14] (dhclient-91-190-10-49.flashcable.ch [91.190.10.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by fgznet.ch (Postfix) with ESMTPSA id EB498C11EF for ; Wed, 22 Jan 2020 22:27:24 +0100 (CET) To: GCC Patches From: Andreas Tobler Subject: [PATCH]: gcc: Enable bits for sanitizer support on FreeBSD x86_64 Message-ID: Date: Wed, 22 Jan 2020 22:27:21 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 X-IsSubscribed: yes 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 Date: Tue, 21 Jan 2020 22:17:09 +0100 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 + + * 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 * 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