From patchwork Wed Dec 19 12:10:38 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 207327 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 0A42C2C008C for ; Wed, 19 Dec 2012 23:11:03 +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=1356523864; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Date:From:To:Cc:Subject:Message-ID:Reply-To: MIME-Version:Content-Type:Content-Disposition:User-Agent: Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:Sender:Delivered-To; bh=GPqKPvs/qJmrbDn3PwMs vZg6+I0=; b=MAtWEG+lYGI53OCC+71TKQmvQLAmWf7lCby3Tc46yXq2AGZMj3JS zpurcEek9LwGTaydUr93wbJo9DK0dlJSyzseXJFuPv8CWLLsoAHN1JIjrxZP6Fiw toZnqee4vNOj8Va+x98dXLlQe/si9214VrYnusbLpTD++n/fXwKrPbg= 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:Received:Received:Date:From:To:Cc:Subject:Message-ID:Reply-To:MIME-Version:Content-Type:Content-Disposition:User-Agent:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=X6HAN8ZBPsUSFOu5RUisO7oTgLN8rZcy+nsUMEsekTnrMHxCLBAo9re1Yhqgvh iCzG3STkN/Oogb4cQvMsujjZlGN1p7YX6e0gRYHEMxRA/RF6yxokzBLRbfEcyLmD wFREu59vnCtOCEKGVkvOrm+dQMWyEHbX1Rf+27qLsROWQ=; Received: (qmail 2267 invoked by alias); 19 Dec 2012 12:10:55 -0000 Received: (qmail 2253 invoked by uid 22791); 19 Dec 2012 12:10:54 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 19 Dec 2012 12:10:43 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qBJCAgf3011088 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Dec 2012 07:10:42 -0500 Received: from zalov.redhat.com (vpn1-7-112.ams2.redhat.com [10.36.7.112]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qBJCAeTm002317 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 19 Dec 2012 07:10:41 -0500 Received: from zalov.cz (localhost [127.0.0.1]) by zalov.redhat.com (8.14.5/8.14.5) with ESMTP id qBJCAdDg021068; Wed, 19 Dec 2012 13:10:39 +0100 Received: (from jakub@localhost) by zalov.cz (8.14.5/8.14.5/Submit) id qBJCAd7h021067; Wed, 19 Dec 2012 13:10:39 +0100 Date: Wed, 19 Dec 2012 13:10:38 +0100 From: Jakub Jelinek To: Konstantin Serebryany , Dmitry Vyukov , Dodji Seketeli Cc: gcc-patches@gcc.gnu.org Subject: [asan] Never use memset for clearing of shadow mem in epilogues (PR fortran/55341) Message-ID: <20121219121038.GW2315@tucnak.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) 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 Hi! clear_storage sometimes emits a library call instead of clearing storage by pieces, rep stos* and similar, unfortunately if it is a call that libasan intercepts (memset), it fails because it doesn't allow writes into shadow mem. Fixed by scanning the clear_storage sequence if there are any calls, and if there are, replaces it with a simple loop storing 0. Tested on x86_64-linux, ok for trunk? 2012-12-19 Jakub Jelinek PR fortran/55341 * asan.c (asan_clear_shadow): New function. (asan_emit_stack_protection): Use it. Jakub --- gcc/asan.c.jj 2012-12-13 00:05:04.000000000 +0100 +++ gcc/asan.c 2012-12-19 12:25:57.676365851 +0100 @@ -270,6 +270,45 @@ asan_shadow_cst (unsigned char shadow_by return GEN_INT (trunc_int_for_mode (val, SImode)); } +/* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here + though. */ + +static void +asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len) +{ + rtx insn, insns, top_label, end, addr, tmp, jump; + + start_sequence (); + clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL); + insns = get_insns (); + end_sequence (); + for (insn = insns; insn; insn = NEXT_INSN (insn)) + if (CALL_P (insn)) + break; + if (insn == NULL_RTX) + { + emit_insn (insns); + return; + } + + gcc_assert ((len & 3) == 0); + top_label = gen_label_rtx (); + addr = force_reg (Pmode, XEXP (shadow_mem, 0)); + shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0); + end = force_reg (Pmode, plus_constant (Pmode, addr, len)); + emit_label (top_label); + + emit_move_insn (shadow_mem, const0_rtx); + tmp = expand_simple_binop (Pmode, PLUS, addr, GEN_INT (4), addr, + true, OPTAB_LIB_WIDEN); + if (tmp != addr) + emit_move_insn (addr, tmp); + emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label); + jump = get_last_insn (); + gcc_assert (JUMP_P (jump)); + add_reg_note (jump, REG_BR_PROB, GEN_INT (REG_BR_PROB_BASE * 80 / 100)); +} + /* Insert code to protect stack vars. The prologue sequence should be emitted directly, epilogue sequence returned. BASE is the register holding the stack base, against which OFFSETS array offsets are relative to, OFFSETS @@ -404,8 +443,7 @@ asan_emit_stack_protection (rtx base, HO (last_offset - prev_offset) >> ASAN_SHADOW_SHIFT); prev_offset = last_offset; - clear_storage (shadow_mem, GEN_INT (last_size >> ASAN_SHADOW_SHIFT), - BLOCK_OP_NORMAL); + asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT); last_offset = offset; last_size = 0; } @@ -418,8 +456,7 @@ asan_emit_stack_protection (rtx base, HO shadow_mem = adjust_address (shadow_mem, VOIDmode, (last_offset - prev_offset) >> ASAN_SHADOW_SHIFT); - clear_storage (shadow_mem, GEN_INT (last_size >> ASAN_SHADOW_SHIFT), - BLOCK_OP_NORMAL); + asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT); } do_pending_stack_adjust ();