From patchwork Tue Nov 5 13:20:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Enkovich X-Patchwork-Id: 288510 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 D53E72C032F for ; Wed, 6 Nov 2013 00:21:02 +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 :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; q=dns; s=default; b=ldVHTgYi74i1F65VeT /FbOfJ3gNeL0keltohGqadJteJP04vuaSNgCK7gwakYIFhHkk1a0ywIpUSn1tzv9 3iQEcaZHG98Wht+1PYviznLSS4QR8qe+aqgN0Hm6mxjnZyi4/N/X+iAzZmsbjaYW 5nv0UyNshOfkfPf2J07vSH7Ys= 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 :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; s=default; bh=mtBsfjr5ClRQWEK2xAjyy98s SE4=; b=L+QFM9S0TeGAIiVhBmowL/ofmzpnbVZg1+VfjbWDX3zLMU1jkTX4Bg1S sVidPz4ZbIqK3ENX4dNn1gzkALyagseYlVSKhONW2h5o8WHIH7A2J2TtUErTiSWm ERZ2Xmzmhhe9+4fHH53ockWivw+ksPOt9KpUL8NY0adXUJS7OHA= Received: (qmail 24840 invoked by alias); 5 Nov 2013 13:20:52 -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 24829 invoked by uid 89); 5 Nov 2013 13:20:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.5 required=5.0 tests=AWL, BAYES_99, FREEMAIL_FROM, RDNS_NONE, SPF_PASS, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: mail-ie0-f182.google.com Received: from Unknown (HELO mail-ie0-f182.google.com) (209.85.223.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 05 Nov 2013 13:20:50 +0000 Received: by mail-ie0-f182.google.com with SMTP id as1so15153237iec.13 for ; Tue, 05 Nov 2013 05:20:42 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.50.120.6 with SMTP id ky6mr15474539igb.58.1383657642587; Tue, 05 Nov 2013 05:20:42 -0800 (PST) Received: by 10.64.128.163 with HTTP; Tue, 5 Nov 2013 05:20:42 -0800 (PST) In-Reply-To: References: <20131031091116.GD54327@msticlxl57.ims.intel.com> Date: Tue, 5 Nov 2013 17:20:42 +0400 Message-ID: Subject: Re: [PATCH, MPX, 2/X] Pointers Checker [8/25] Languages support From: Ilya Enkovich To: Richard Biener Cc: GCC Patches X-IsSubscribed: yes 2013/11/5 Richard Biener : > On Tue, Nov 5, 2013 at 2:02 PM, Ilya Enkovich wrote: >> 2013/11/4 Richard Biener : >>> On Thu, Oct 31, 2013 at 10:11 AM, Ilya Enkovich wrote: >>>> Hi, >>>> >>>> This patch adds support Pointer Bounds Checker into c-family and LTO front-ends. The main purpose of changes in front-end is to register all statically initialized objects for checker. We also need to register such objects created by compiler. >> >> LTO is quite specific front-end. For LTO Pointer Bounds Checker >> support macro just means it allows instrumented code as input because >> all instrumentation is performed before code is streamed out for LTO. > > But your patch doesn't even make use of the langhook... Use of langhook is in previous patch (http://gcc.gnu.org/ml/gcc-patches/2013-10/msg02408.html). Here is it's part: If we try to use -fcheck-pointers -flto for some unsupported language, code will not be instrumented. Ilya > > Richard. > >> Ilya >> >>> >>> You define CHKP as supported in LTO. That means it has to be supported >>> for all languages and thus you should drop the langhook. >>> >>> Richard. >>> >>>> Thanks, >>>> Ilya >>>> -- >>>> >>>> gcc/ >>>> >>>> 2013-10-29 Ilya Enkovich >>>> >>>> * c/c-lang.c (LANG_HOOKS_CHKP_SUPPORTED): New. >>>> * cp/cp-lang.c (LANG_HOOKS_CHKP_SUPPORTED): New. >>>> * objc/objc-lang.c (LANG_HOOKS_CHKP_SUPPORTED): New. >>>> * objcp/objcp-lang.c (LANG_HOOKS_CHKP_SUPPORTED): New. >>>> * lto/lto-lang.c (LANG_HOOKS_CHKP_SUPPORTED): New. >>>> * c/c-parser.c (c_parser_declaration_or_fndef): Register statically >>>> initialized decls in Pointer Bounds Checker. >>>> * cp/decl.c (cp_finish_decl): Likewise. >>>> * gimplify.c (gimplify_init_constructor): Likewise. >>>> >>>> >>>> diff --git a/gcc/c/c-lang.c b/gcc/c/c-lang.c >>>> index 614c46d..a32bc6b 100644 >>>> --- a/gcc/c/c-lang.c >>>> +++ b/gcc/c/c-lang.c >>>> @@ -43,6 +43,8 @@ enum c_language_kind c_language = clk_c; >>>> #define LANG_HOOKS_INIT c_objc_common_init >>>> #undef LANG_HOOKS_INIT_TS >>>> #define LANG_HOOKS_INIT_TS c_common_init_ts >>>> +#undef LANG_HOOKS_CHKP_SUPPORTED >>>> +#define LANG_HOOKS_CHKP_SUPPORTED true >>>> >>>> /* Each front end provides its own lang hook initializer. */ >>>> struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; >>>> diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c >>>> index 9ccae3b..65d83c8 100644 >>>> --- a/gcc/c/c-parser.c >>>> +++ b/gcc/c/c-parser.c >>>> @@ -1682,6 +1682,12 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, >>>> maybe_warn_string_init (TREE_TYPE (d), init); >>>> finish_decl (d, init_loc, init.value, >>>> init.original_type, asm_name); >>>> + >>>> + /* Register all decls with initializers in Pointer >>>> + Bounds Checker to generate required static bounds >>>> + initializers. */ >>>> + if (DECL_INITIAL (d) != error_mark_node) >>>> + chkp_register_var_initializer (d); >>>> } >>>> } >>>> else >>>> diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c >>>> index a7fa8e4..6d138bd 100644 >>>> --- a/gcc/cp/cp-lang.c >>>> +++ b/gcc/cp/cp-lang.c >>>> @@ -81,6 +81,8 @@ static tree get_template_argument_pack_elems_folded (const_tree); >>>> #define LANG_HOOKS_EH_PERSONALITY cp_eh_personality >>>> #undef LANG_HOOKS_EH_RUNTIME_TYPE >>>> #define LANG_HOOKS_EH_RUNTIME_TYPE build_eh_type_type >>>> +#undef LANG_HOOKS_CHKP_SUPPORTED >>>> +#define LANG_HOOKS_CHKP_SUPPORTED true >>>> >>>> /* Each front end provides its own lang hook initializer. */ >>>> struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; >>>> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c >>>> index 1e92f2a..db40e75 100644 >>>> --- a/gcc/cp/decl.c >>>> +++ b/gcc/cp/decl.c >>>> @@ -6379,6 +6379,12 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, >>>> the class specifier. */ >>>> if (!DECL_EXTERNAL (decl)) >>>> var_definition_p = true; >>>> + >>>> + /* If var has initilizer then we need to register it in >>>> + Pointer Bounds Checker to generate static bounds initilizer >>>> + if required. */ >>>> + if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node) >>>> + chkp_register_var_initializer (decl); >>>> } >>>> /* If the variable has an array type, lay out the type, even if >>>> there is no initializer. It is valid to index through the >>>> diff --git a/gcc/gimplify.c b/gcc/gimplify.c >>>> index 4f52c27..503450f 100644 >>>> --- a/gcc/gimplify.c >>>> +++ b/gcc/gimplify.c >>>> @@ -4111,6 +4111,11 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, >>>> >>>> walk_tree (&ctor, force_labels_r, NULL, NULL); >>>> ctor = tree_output_constant_def (ctor); >>>> + >>>> + /* We need to register created constant object to >>>> + initialize bounds for pointers in it. */ >>>> + chkp_register_var_initializer (ctor); >>>> + >>>> if (!useless_type_conversion_p (type, TREE_TYPE (ctor))) >>>> ctor = build1 (VIEW_CONVERT_EXPR, type, ctor); >>>> TREE_OPERAND (*expr_p, 1) = ctor; >>>> diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c >>>> index 0fa0fc9..b6073d9 100644 >>>> --- a/gcc/lto/lto-lang.c >>>> +++ b/gcc/lto/lto-lang.c >>>> @@ -1278,6 +1278,8 @@ static void lto_init_ts (void) >>>> >>>> #undef LANG_HOOKS_INIT_TS >>>> #define LANG_HOOKS_INIT_TS lto_init_ts >>>> +#undef LANG_HOOKS_CHKP_SUPPORTED >>>> +#define LANG_HOOKS_CHKP_SUPPORTED true >>>> >>>> struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; >>>> >>>> diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c >>>> index bc0008b..5e7e43b 100644 >>>> --- a/gcc/objc/objc-lang.c >>>> +++ b/gcc/objc/objc-lang.c >>>> @@ -49,6 +49,8 @@ enum c_language_kind c_language = clk_objc; >>>> #define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr >>>> #undef LANG_HOOKS_INIT_TS >>>> #define LANG_HOOKS_INIT_TS objc_common_init_ts >>>> +#undef LANG_HOOKS_CHKP_SUPPORTED >>>> +#define LANG_HOOKS_CHKP_SUPPORTED true >>>> >>>> /* Each front end provides its own lang hook initializer. */ >>>> struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; >>>> diff --git a/gcc/objcp/objcp-lang.c b/gcc/objcp/objcp-lang.c >>>> index f9b126f..0bb80eb 100644 >>>> --- a/gcc/objcp/objcp-lang.c >>>> +++ b/gcc/objcp/objcp-lang.c >>>> @@ -46,6 +46,8 @@ static void objcxx_init_ts (void); >>>> #define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr >>>> #undef LANG_HOOKS_INIT_TS >>>> #define LANG_HOOKS_INIT_TS objcxx_init_ts >>>> +#undef LANG_HOOKS_CHKP_SUPPORTED >>>> +#define LANG_HOOKS_CHKP_SUPPORTED true >>>> >>>> /* Each front end provides its own lang hook initializer. */ >>>> struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; diff --git a/gcc/toplev.c b/gcc/toplev.c index db269b7..0eaf081 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1282,6 +1282,15 @@ process_options (void) "and -ftree-loop-linear)"); #endif + if (flag_check_pointer_bounds) + { + if (targetm.chkp_bound_mode () == VOIDmode) + error ("-fcheck-pointers is not supported for this target"); + + if (!lang_hooks.chkp_supported) + flag_check_pointer_bounds = 0; + } + /* One region RA really helps to decrease the code size. */ if (flag_ira_region == IRA_REGION_AUTODETECT) flag_ira_region