On Thu, Oct 31, 2013 at 10:11 AM, Ilya Enkovich <enkovich....@gmail.com> 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.
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 <ilya.enkov...@intel.com> > > * 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;