On Tue, Nov 5, 2013 at 2:37 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > 2013/11/5 Richard Biener <richard.guent...@gmail.com>: >> On Tue, Nov 5, 2013 at 2:20 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: >>> 2013/11/5 Richard Biener <richard.guent...@gmail.com>: >>>> On Tue, Nov 5, 2013 at 2:02 PM, Ilya Enkovich <enkovich....@gmail.com> >>>> wrote: >>>>> 2013/11/4 Richard Biener <richard.guent...@gmail.com>: >>>>>> 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. >>>>> >>>>> 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: >>> >>> 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 >>> >>> If we try to use -fcheck-pointers -flto for some unsupported language, >>> code will not be instrumented. >> >> What's the reason to have unsupported languages? > > For some languages (e.g. Java) Pointer Bounds Checker does not make > sense at all. Others may require additional support in front-end. The > primary target is C family where solved problem is more critical.
What does break if you "enable" it for Java or other "unsupported" languages? That is, if LTO is able to handle a mixed Java and C binary then why can Java alone not handle it? Richard. > Ilya >> >> Richard. >> >>> 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 <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;