On Mon, Jun 2, 2014 at 2:44 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > 2014-06-02 15:35 GMT+04:00 Richard Biener <richard.guent...@gmail.com>: >> On Fri, May 30, 2014 at 2:25 PM, Ilya Enkovich <enkovich....@gmail.com> >> wrote: >>> Hi, >>> >>> This patch adds Pointer Bounds Checker passes. Versioning happens before >>> early local passes. Earply local passes are split into 3 stages to have >>> everything instrumented before any optimization applies. >> >> That looks artificial to me. If you need to split up early_local_passes >> then do that - nesting three IPA pass groups inside it looks odd to me. >> Btw - doing this in three "IPA phases" makes things possibly slower >> due to cache effects. It might be worth pursuing to move the early >> stage completely to the lowering pipeline. > > Early local passes is some special case because these passes are > executed separately for new functions. I did not want to get three > special passes instead and therefore made split inside.
Yeah, but all passes are already executed via execute_early_local_passes, so it would be only an implementation detail. > If you prefer split pass itself, I suppose pass_early_local_passes may > be replaced with something like pass_build_ssa_passes + > pass_chkp_instrumentation_passes + pass_ipa_chkp_produce_thunks + > pass_local_optimization_passes. execute_early_local_passes would > execute gimple passes lists of pass_build_ssa_passes, > pass_chkp_instrumentation_passes and pass_local_optimization_passes. > > I think we cannot have the first stage moved into lowering passes > because it should be executed for newly created functions. Well, let's defer that then. >> >> Btw, fixup_cfg only needs to run once local_pure_const was run >> on a callee, thus it shouldn't be neccessary to run it from the >> first group. > > OK. Will try to remove it from the first group. > >> >> void >> pass_manager::execute_early_local_passes () >> { >> - execute_pass_list (pass_early_local_passes_1->sub); >> + execute_pass_list (pass_early_local_passes_1->sub->sub); >> + execute_pass_list (pass_early_local_passes_1->sub->next->sub); >> + execute_pass_list (pass_early_local_passes_1->sub->next->next->next->sub); >> } >> >> is gross - it should be enough to execute the early local pass list >> (obsolete comment with the suggestion above). > > This function should call only gimple passes for cfun. Therefore we > cannot call IPA passes here and has to execute each gimple passes list > separately. Ok, given a different split this would then become somewhat more sane anyway. Richard. > Ilya >> >> Richard. >> >>> Bootstrapped and tested on linux-x86_64. >>> >>> Thanks, >>> Ilya >>> -- >>> gcc/ >>> >>> 2014-05-29 Ilya Enkovich <ilya.enkov...@intel.com> >>> >>> * tree-chkp.c: New. >>> * tree-chkp.h: New. >>> * rtl-chkp.c: New. >>> * rtl-chkp.h: New. >>> * Makefile.in (OBJS): Add tree-chkp.o, rtl-chkp.o. >>> (GTFILES): Add tree-chkp.c. >>> * c-family/c.opt (fchkp-check-incomplete-type): New. >>> (fchkp-zero-input-bounds-for-main): New. >>> (fchkp-first-field-has-own-bounds): New. >>> (fchkp-narrow-bounds): New. >>> (fchkp-narrow-to-innermost-array): New. >>> (fchkp-optimize): New. >>> (fchkp-use-fast-string-functions): New. >>> (fchkp-use-nochk-string-functions): New. >>> (fchkp-use-static-bounds): New. >>> (fchkp-use-static-const-bounds): New. >>> (fchkp-treat-zero-dynamic-size-as-infinite): New. >>> (fchkp-check-read): New. >>> (fchkp-check-write): New. >>> (fchkp-store-bounds): New. >>> (fchkp-instrument-calls): New. >>> (fchkp-instrument-marked-only): New. >>> * cppbuiltin.c (define_builtin_macros_for_compilation_flags): Add >>> __CHKP__ macro when Pointer Bounds Checker is on. >>> * passes.def (pass_ipa_chkp_versioning): New. >>> (pass_before_local_optimization_passes): New. >>> (pass_chkp_instrumentation_passes): New. >>> (pass_ipa_chkp_produce_thunks): New. >>> (pass_local_optimization_passes): New. >>> (pass_chkp_opt): New. >>> * toplev.c: include tree-chkp.h. >>> (compile_file): Add chkp_finish_file call. >>> * tree-pass.h (make_pass_ipa_chkp_versioning): New. >>> (make_pass_ipa_chkp_produce_thunks): New. >>> (make_pass_chkp): New. >>> (make_pass_chkp_opt): New. >>> (make_pass_before_local_optimization_passes): New. >>> (make_pass_chkp_instrumentation_passes): New. >>> (make_pass_local_optimization_passes): New. >>> * tree.h (called_as_built_in): New. >>> * builtins.c (called_as_built_in): Not static anymore. >>> * passes.c (pass_manager::execute_early_local_passes): Execute >>> early passes in three steps. >>> (pass_data_before_local_optimization_passes): New. >>> (pass_before_local_optimization_passes): New. >>> (pass_data_chkp_instrumentation_passes): New. >>> (pass_chkp_instrumentation_passes): New. >>> (pass_data_local_optimization_passes): New. >>> (pass_local_optimization_passes): New. >>> (make_pass_before_local_optimization_passes): New. >>> (make_pass_chkp_instrumentation_passes): New. >>> (make_pass_local_optimization_passes): New.