From patchwork Tue Nov 19 20:52:46 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Enkovich X-Patchwork-Id: 292572 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id ECD662C00B7 for ; Wed, 20 Nov 2013 07:53:50 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=Wn33MULrAGhckWWX1cjOhoiCaJA4iqoAEpx3k9gGBeUvVoYQVzUbI 1rTRfpU7lvuhDII4B/vv2l16GpWTBs/F7T8J06KerAks5OtcsTQ+DKlyRspK1gKL HlDhG5B5BbmDwtym4L3Rwfigidze7mCuz7c390zsQCx/4uofsfxs40= 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:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=V32TsKtphIFYYjccQ8fxYE8Hzwc=; b=gPDm+gDy5C02xeMjGclJ 6b7U/JnW15Dhu0CKduZm9RHfqMpTPuddHNOgr5sHtD5CGuamA5sCw4Ze7LA//SqY 7XOg/vEkmHthJv3eZhC5GqqR4uOjq+RFB1RjT5NoNIXfWx0zkHIEma9SxM65Br9R mJauOH+wGkzG+pSfnm6IQ5k= Received: (qmail 5172 invoked by alias); 19 Nov 2013 20:53:41 -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 5153 invoked by uid 89); 19 Nov 2013 20:53:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.3 required=5.0 tests=AWL, BAYES_50, FREEMAIL_FROM, RDNS_NONE, SPF_PASS, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: mail-pd0-f174.google.com Received: from Unknown (HELO mail-pd0-f174.google.com) (209.85.192.174) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 19 Nov 2013 20:53:39 +0000 Received: by mail-pd0-f174.google.com with SMTP id y13so2474096pdi.33 for ; Tue, 19 Nov 2013 12:53:31 -0800 (PST) X-Received: by 10.68.190.229 with SMTP id gt5mr2742867pbc.177.1384894411496; Tue, 19 Nov 2013 12:53:31 -0800 (PST) Received: from msticlxl57.ims.intel.com (fmdmzpr04-ext.fm.intel.com. [192.55.55.39]) by mx.google.com with ESMTPSA id fk4sm36937372pab.23.2013.11.19.12.53.29 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 19 Nov 2013 12:53:30 -0800 (PST) Date: Wed, 20 Nov 2013 00:52:46 +0400 From: Ilya Enkovich To: gcc-patches@gcc.gnu.org Subject: [PATCH, i386, MPX, 2/X] Pointers Checker [25/25] Vararg support for i386 Message-ID: <20131119205246.GW21297@msticlxl57.ims.intel.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Hi, Here is a patch to support instrumentation in vararg expands for i386 target. Thanks, Ilya --- 2013-11-19 Ilya Enkovich * config/i386/i386.c (setup_incoming_varargs_64): Store bounds for each stored register. (ix86_va_start): Initialize bounds for pointers in va_list. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 1077168..8ad1ebf 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -8039,7 +8039,7 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum) { rtx save_area, mem; alias_set_type set; - int i, max; + int i, max, bnd_reg; /* GPR size of varargs save area. */ if (cfun->va_list_gpr_size) @@ -8064,6 +8064,7 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum) if (max > X86_64_REGPARM_MAX) max = X86_64_REGPARM_MAX; + bnd_reg = cum->bnd_regno; for (i = cum->regno; i < max; i++) { mem = gen_rtx_MEM (word_mode, @@ -8073,6 +8074,37 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum) emit_move_insn (mem, gen_rtx_REG (word_mode, x86_64_int_parameter_registers[i])); + + /* In instrumented code we need to store bounds for each + stored register. */ + if (chkp_function_instrumented_p (current_function_decl)) + { + rtx addr = plus_constant (Pmode, save_area, i * UNITS_PER_WORD); + rtx ptr = gen_rtx_REG (DImode, + x86_64_int_parameter_registers[i]); + rtx bounds; + + if (bnd_reg <= LAST_BND_REG) + bounds = gen_rtx_REG (BNDmode, bnd_reg); + else + { + rtx ldx_addr; + if (bnd_reg == LAST_BND_REG + 1) + ldx_addr = plus_constant (Pmode, arg_pointer_rtx, -8); + else + ldx_addr = plus_constant (Pmode, arg_pointer_rtx, -16); + bounds = gen_reg_rtx (BNDmode); + emit_insn (TARGET_64BIT + ? gen_bnd64_ldx (bounds, ldx_addr, ptr) + : gen_bnd32_ldx (bounds, ldx_addr, ptr)); + } + + emit_insn (TARGET_64BIT + ? gen_bnd64_stx (addr, ptr, bounds) + : gen_bnd32_stx (addr, ptr, bounds)); + + bnd_reg++; + } } if (ix86_varargs_fpr_size) @@ -8196,7 +8228,7 @@ ix86_va_start (tree valist, rtx nextarg) { HOST_WIDE_INT words, n_gpr, n_fpr; tree f_gpr, f_fpr, f_ovf, f_sav; - tree gpr, fpr, ovf, sav, t; + tree gpr, fpr, ovf, sav, t, t1; tree type; rtx ovf_rtx; @@ -8247,6 +8279,13 @@ ix86_va_start (tree valist, rtx nextarg) crtl->args.arg_offset_rtx, NULL_RTX, 0, OPTAB_LIB_WIDEN); convert_move (va_r, next, 0); + + /* Store zero bounds for va_list. */ + if (chkp_function_instrumented_p (current_function_decl)) + chkp_expand_bounds_reset_for_mem (valist, + make_tree (TREE_TYPE (valist), + next)); + } return; } @@ -8300,10 +8339,15 @@ ix86_va_start (tree valist, rtx nextarg) t = make_tree (type, ovf_rtx); if (words != 0) t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD); + t1 = t; t = build2 (MODIFY_EXPR, type, ovf, t); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + /* Store zero bounds for overflow area pointer. */ + if (chkp_function_instrumented_p (current_function_decl)) + chkp_expand_bounds_reset_for_mem (ovf, t1); + if (ix86_varargs_gpr_size || ix86_varargs_fpr_size) { /* Find the register save area. @@ -8312,9 +8356,14 @@ ix86_va_start (tree valist, rtx nextarg) t = make_tree (type, frame_pointer_rtx); if (!ix86_varargs_gpr_size) t = fold_build_pointer_plus_hwi (t, -8 * X86_64_REGPARM_MAX); + t1 = t; t = build2 (MODIFY_EXPR, type, sav, t); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + + /* Store zero bounds for save area pointer. */ + if (chkp_function_instrumented_p (current_function_decl)) + chkp_expand_bounds_reset_for_mem (sav, t1); } }