From patchwork Mon Nov 12 11:12:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 198363 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id CF6642C0086 for ; Mon, 12 Nov 2012 22:12:21 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1353323542; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: From:To:Cc:Subject:References:Date:In-Reply-To:Message-ID: User-Agent:MIME-Version:Content-Type:Mailing-List:Precedence: List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=6TJxA2Wh/aQsPP+IxXqSn03kAQs=; b=xtU+to/i4rOEY7h iaeIh+5PkbFLcEBJQg19jhkEutXZVnCSObQNVjVMmXLzpV8xN7GqNqVdyyjTRfj0 w/AJql4spKW2omenI3IULwonA1UdenFwxg+gHWKowItcEeXr9JN9JTFUr97VD3YJ FKCf7iwBj8iojI6aWVC+vhUWRLw4= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:From:To:Cc:Subject:References:X-URL:Date:In-Reply-To:Message-ID:User-Agent:MIME-Version:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=AzCaypul7Y2I6ldDICpGymgZgZ4oqnTeMdIT/Sh8gFKRwmNKvexNQQuBQlyngv S0kRDW0wk2T7mmsWGEYFY78k4S7A6k2cUfJJ2Hiki7neLjSNAysZDSmg8ujMd1K7 YyM2fOfwNlybyn1SRgCKmbIkG5sKPTYppQf+cTN5cNvZc=; Received: (qmail 25311 invoked by alias); 12 Nov 2012 11:12:16 -0000 Received: (qmail 25303 invoked by uid 22791); 12 Nov 2012 11:12:15 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,TW_SV X-Spam-Check-By: sourceware.org Received: from seketeli.net (HELO ms.seketeli.net) (91.121.166.71) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 12 Nov 2012 11:12:08 +0000 Received: from localhost (torimasen.com [82.237.12.13]) by ms.seketeli.net (Postfix) with ESMTP id C508BEA042; Mon, 12 Nov 2012 12:36:39 +0100 (CET) Received: by localhost (Postfix, from userid 1000) id CF9A92C0104; Mon, 12 Nov 2012 12:12:06 +0100 (CET) From: Dodji Seketeli To: Diego Novillo Cc: gcc-patches@gcc.gnu.org, jakub@redhat.com, wmi@google.com, davidxl@google.com Subject: Re: [PATCH 02/10] Initial asan cleanups References: <1351799566-31447-1-git-send-email-dodji@redhat.com> <87pq3v8vmi.fsf@redhat.com> <87ehkb8vgd.fsf_-_@redhat.com> <50994303.8020600@google.com> X-URL: http://www.redhat.com Date: Mon, 12 Nov 2012 12:12:06 +0100 In-Reply-To: <50994303.8020600@google.com> (Diego Novillo's message of "Tue, 06 Nov 2012 09:04:03 -0800") Message-ID: <87zk2n3wjd.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes 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 > On 2012-11-02 15:57 , Dodji Seketeli wrote: > > > /* AddressSanitizer, a fast memory error detector. > > - Copyright (C) 2011 Free Software Foundation, Inc. > > + Copyright (C) 2011, 2012 Free Software Foundation, Inc. > > I *think* we should only mention 2012, but I don't know if code in > branches counts for the copyright years. I have updated this to 2012 only. > > + /* Address Sanitizer needs porting to each target architecture. */ > > + if (flag_asan && targetm.asan_shadow_offset == NULL) > > + { > > + warning (0, "-fasan not supported for this target"); > > Hm, ASAN's flag is now -fsanitizer=[asan,tsan,memory] or some such. Oh, right. Sorry, this flew below my radar. In any case, -fasan is wrong. It should be at least -faddress-sanitizer as the rest of the current patch set. So I am updating the tree accordingly. > We will need to make that change. But it can wait until after the > initial port is in trunk. I took the opportunity to just update the message to -faddress-sanitizer for now. If that is not OK, please let me know. > This patch is OK. Thanks. Below is what I have in my tree. * toplev.c (process_options): Warn and turn off -faddress-sanitizer if not supported by target. * asan.c: Include target.h. (asan_scale, asan_offset_log_32, asan_offset_log_64, asan_offset_log): Removed. (build_check_stmt): Use ASAN_SHADOW_SHIFT and targetm.asan_shadow_offset (). (asan_instrument): Don't initialize asan_offset_log. * asan.h (ASAN_SHADOW_SHIFT): Define. * target.def (TARGET_ASAN_SHADOW_OFFSET): New hook. * doc/tm.texi.in (TARGET_ASAN_SHADOW_OFFSET): Add it. * doc/tm.texi: Regenerated. * Makefile.in (asan.o): Depend on $(TARGET_H). * config/i386/i386.c (ix86_asan_shadow_offset): New function. (TARGET_ASAN_SHADOW_OFFSET): Define. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/asan@192372 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog.asan | 18 ++++++++++++++++++ gcc/Makefile.in | 2 +- gcc/asan.c | 25 ++++++------------------- gcc/asan.h | 6 +++++- gcc/config/i386/i386.c | 11 +++++++++++ gcc/doc/tm.texi | 6 ++++++ gcc/doc/tm.texi.in | 2 ++ gcc/target.def | 11 +++++++++++ gcc/toplev.c | 7 +++++++ 9 files changed, 67 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog.asan b/gcc/ChangeLog.asan index 704aa61..d13a584 100644 --- a/gcc/ChangeLog.asan +++ b/gcc/ChangeLog.asan @@ -1,3 +1,21 @@ +2012-10-11 Jakub Jelinek + + * toplev.c (process_options): Warn and turn off + -faddress-sanitizer if not supported by target. + * asan.c: Include target.h. + (asan_scale, asan_offset_log_32, asan_offset_log_64, + asan_offset_log): Removed. + (build_check_stmt): Use ASAN_SHADOW_SHIFT and + targetm.asan_shadow_offset (). + (asan_instrument): Don't initialize asan_offset_log. + * asan.h (ASAN_SHADOW_SHIFT): Define. + * target.def (TARGET_ASAN_SHADOW_OFFSET): New hook. + * doc/tm.texi.in (TARGET_ASAN_SHADOW_OFFSET): Add it. + * doc/tm.texi: Regenerated. + * Makefile.in (asan.o): Depend on $(TARGET_H). + * config/i386/i386.c (ix86_asan_shadow_offset): New function. + (TARGET_ASAN_SHADOW_OFFSET): Define. + 2012-10-10 Wei Mi Diego Novillo Dodji Seketeli diff --git a/gcc/Makefile.in b/gcc/Makefile.in index dde9b50..469c72f 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2211,7 +2211,7 @@ stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ asan.o : asan.c asan.h $(CONFIG_H) pointer-set.h \ $(SYSTEM_H) $(TREE_H) $(GIMPLE_H) \ output.h $(DIAGNOSTIC_H) coretypes.h $(TREE_DUMP_H) $(FLAGS_H) \ - tree-pretty-print.h + tree-pretty-print.h $(TARGET_H) tree-ssa-tail-merge.o: tree-ssa-tail-merge.c \ $(SYSTEM_H) $(CONFIG_H) coretypes.h $(TM_H) $(BITMAP_H) \ $(FLAGS_H) $(TM_P_H) $(BASIC_BLOCK_H) \ diff --git a/gcc/asan.c b/gcc/asan.c index 4b07c96..9655b11 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1,5 +1,5 @@ /* AddressSanitizer, a fast memory error detector. - Copyright (C) 2011 Free Software Foundation, Inc. + Copyright (C) 2012 Free Software Foundation, Inc. Contributed by Kostya Serebryany This file is part of GCC. @@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple.h" #include "asan.h" #include "gimple-pretty-print.h" +#include "target.h" /* AddressSanitizer finds out-of-bounds and use-after-free bugs @@ -78,15 +79,6 @@ along with GCC; see the file COPYING3. If not see to create redzones for stack and global object and poison them. */ -/* The shadow address is computed as (X>>asan_scale) + (1<> asan_scale) + (1 << asan_offset_log). */ + /* Build + (base_addr >> ASAN_SHADOW_SHIFT) | targetm.asan_shadow_offset (). */ t = build2 (RSHIFT_EXPR, uintptr_type, base_addr, - build_int_cst (uintptr_type, asan_scale)); + build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT)); t = build2 (PLUS_EXPR, uintptr_type, t, - build2 (LSHIFT_EXPR, uintptr_type, - build_int_cst (uintptr_type, 1), - build_int_cst (uintptr_type, asan_offset_log) - )); + build_int_cst (uintptr_type, targetm.asan_shadow_offset ())); t = build1 (INDIRECT_REF, shadow_type, build1 (VIEW_CONVERT_EXPR, shadow_ptr_type, t)); t = force_gimple_operand (t, &stmts, false, NULL_TREE); @@ -367,9 +357,6 @@ static unsigned int asan_instrument (void) { struct gimplify_ctx gctx; - tree uintptr_type = lang_hooks.types.type_for_mode (ptr_mode, true); - int is_64 = tree_low_cst (TYPE_SIZE (uintptr_type), 0) == 64; - asan_offset_log = is_64 ? asan_offset_log_64 : asan_offset_log_32; push_gimplify_context (&gctx); transform_statements (); pop_gimplify_context (NULL); diff --git a/gcc/asan.h b/gcc/asan.h index 590cf35..699820b 100644 --- a/gcc/asan.h +++ b/gcc/asan.h @@ -1,5 +1,5 @@ /* AddressSanitizer, a fast memory error detector. - Copyright (C) 2011 Free Software Foundation, Inc. + Copyright (C) 2011, 2012 Free Software Foundation, Inc. Contributed by Kostya Serebryany This file is part of GCC. @@ -23,4 +23,8 @@ along with GCC; see the file COPYING3. If not see extern void asan_finish_file(void); +/* Shadow memory is found at + (address >> ASAN_SHADOW_SHIFT) | targetm.asan_shadow_offset (). */ +#define ASAN_SHADOW_SHIFT 3 + #endif /* TREE_ASAN */ diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 3a6f494..01c7a11 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5186,6 +5186,14 @@ ix86_legitimate_combined_insn (rtx insn) return true; } +/* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */ + +static unsigned HOST_WIDE_INT +ix86_asan_shadow_offset (void) +{ + return (unsigned HOST_WIDE_INT) 1 << (TARGET_LP64 ? 44 : 29); +} + /* Argument support functions. */ /* Return true when register may be used to pass function parameters. */ @@ -42012,6 +42020,9 @@ ix86_memmodel_check (unsigned HOST_WIDE_INT val) #undef TARGET_LEGITIMATE_COMBINED_INSN #define TARGET_LEGITIMATE_COMBINED_INSN ix86_legitimate_combined_insn +#undef TARGET_ASAN_SHADOW_OFFSET +#define TARGET_ASAN_SHADOW_OFFSET ix86_asan_shadow_offset + #undef TARGET_GIMPLIFY_VA_ARG_EXPR #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index dbf6c20..eeb3f08 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -11357,6 +11357,12 @@ MIPS, where add-immediate takes a 16-bit signed value, is zero, which disables this optimization. @end deftypevr +@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_ASAN_SHADOW_OFFSET (void) +Return the offset bitwise ored into shifted address to get corresponding +Address Sanitizer shadow memory address. NULL if Address Sanitizer is not +supported by the target. +@end deftypefn + @deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_MEMMODEL_CHECK (unsigned HOST_WIDE_INT @var{val}) Validate target specific memory model mask bits. When NULL no target specific memory model bits are allowed. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 575cc73..2c9cb10 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -11199,6 +11199,8 @@ MIPS, where add-immediate takes a 16-bit signed value, is zero, which disables this optimization. @end deftypevr +@hook TARGET_ASAN_SHADOW_OFFSET + @hook TARGET_MEMMODEL_CHECK Validate target specific memory model mask bits. When NULL no target specific memory model bits are allowed. diff --git a/gcc/target.def b/gcc/target.def index 2801aea..6d00262 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -2056,6 +2056,17 @@ DEFHOOK "", unsigned HOST_WIDE_INT, (unsigned HOST_WIDE_INT val), NULL) +/* Defines an offset bitwise ored into shifted address to get corresponding + Address Sanitizer shadow address, or -1 if Address Sanitizer is not + supported by the target. */ +DEFHOOK +(asan_shadow_offset, + "Return the offset bitwise ored into shifted address to get corresponding\n\ +Address Sanitizer shadow memory address. NULL if Address Sanitizer is not\n\ +supported by the target.", + unsigned HOST_WIDE_INT, (void), + NULL) + /* Functions relating to calls - argument passing, returns, etc. */ /* Members of struct call have no special macro prefix. */ HOOK_VECTOR (TARGET_CALLS, calls) diff --git a/gcc/toplev.c b/gcc/toplev.c index 3ca0736..d9dfb2a 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1541,6 +1541,13 @@ process_options (void) flag_omit_frame_pointer = 0; } + /* Address Sanitizer needs porting to each target architecture. */ + if (flag_asan && targetm.asan_shadow_offset == NULL) + { + warning (0, "-faddress-sanitizer not supported for this target"); + flag_asan = 0; + } + /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error have not been set. */ if (!global_options_set.x_warnings_are_errors