From c11d86b47facb2f787a7cfde0755454c73b8b90e Mon Sep 17 00:00:00 2001 From: Ilya Enkovich Date: Mon, 19 Jan 2015 10:26:52 +0000 Subject: [PATCH] ipa-chkp.c (chkp_produce_thunks): Add early param to split thunks production into two passes. gcc/ * ipa-chkp.c (chkp_produce_thunks): Add early param to split thunks production into two passes. Keep 'always_inline' function bodies after the first pass. (pass_data_ipa_chkp_early_produce_thunks): New. (pass_ipa_chkp_early_produce_thunks): New. (pass_ipa_chkp_produce_thunks::execute): Adjust to new chkp_produce_thunks signature. (make_pass_ipa_chkp_early_produce_thunks): New. * passes.def (pass_ipa_chkp_early_produce_thunks): New. (pass_ipa_chkp_produce_thunks): Move after local optimizations. * tree-pass.h (make_pass_ipa_chkp_early_produce_thunks): New. gcc/testsuite/ * gcc.target/i386/chkp-always_inline.c: New. From-SVN: r219834 --- gcc/ChangeLog | 14 ++++ gcc/ipa-chkp.c | 65 ++++++++++++++++--- gcc/passes.def | 3 +- gcc/testsuite/ChangeLog | 4 ++ .../gcc.target/i386/chkp-always_inline.c | 13 ++++ gcc/tree-pass.h | 1 + 6 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/chkp-always_inline.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc69bd54516..cc796ac4bce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2015-01-19 Ilya Enkovich + + * ipa-chkp.c (chkp_produce_thunks): Add early param + to split thunks production into two passes. Keep + 'always_inline' function bodies after the first pass. + (pass_data_ipa_chkp_early_produce_thunks): New. + (pass_ipa_chkp_early_produce_thunks): New. + (pass_ipa_chkp_produce_thunks::execute): Adjust to new + chkp_produce_thunks signature. + (make_pass_ipa_chkp_early_produce_thunks): New. + * passes.def (pass_ipa_chkp_early_produce_thunks): New. + (pass_ipa_chkp_produce_thunks): Move after local optimizations. + * tree-pass.h (make_pass_ipa_chkp_early_produce_thunks): New. + 2015-01-18 Jan Hubicka * cgraph.c (cgraph_node::dump): Dump profile flags. diff --git a/gcc/ipa-chkp.c b/gcc/ipa-chkp.c index 8e6612ef1ec..67cb7d51478 100644 --- a/gcc/ipa-chkp.c +++ b/gcc/ipa-chkp.c @@ -643,7 +643,7 @@ chkp_versioning (void) function. */ static unsigned int -chkp_produce_thunks (void) +chkp_produce_thunks (bool early) { struct cgraph_node *node; @@ -652,7 +652,9 @@ chkp_produce_thunks (void) if (!node->instrumentation_clone && node->instrumented_version && gimple_has_body_p (node->decl) - && gimple_has_body_p (node->instrumented_version->decl)) + && gimple_has_body_p (node->instrumented_version->decl) + && (!lookup_attribute ("always_inline", DECL_ATTRIBUTES (node->decl)) + || !early)) { node->release_body (); node->remove_callees (); @@ -670,12 +672,15 @@ chkp_produce_thunks (void) /* Mark instrumentation clones created for aliases and thunks as insttrumented so they could be removed as unreachable now. */ - FOR_EACH_DEFINED_FUNCTION (node) + if (!early) { - if (node->instrumentation_clone - && (node->alias || node->thunk.thunk_p) - && !chkp_function_instrumented_p (node->decl)) - chkp_function_mark_instrumented (node->decl); + FOR_EACH_DEFINED_FUNCTION (node) + { + if (node->instrumentation_clone + && (node->alias || node->thunk.thunk_p) + && !chkp_function_instrumented_p (node->decl)) + chkp_function_mark_instrumented (node->decl); + } } return TODO_remove_functions; @@ -694,6 +699,19 @@ const pass_data pass_data_ipa_chkp_versioning = 0 /* todo_flags_finish */ }; +const pass_data pass_data_ipa_chkp_early_produce_thunks = +{ + SIMPLE_IPA_PASS, /* type */ + "chkp_ecleanup", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0 /* todo_flags_finish */ +}; + const pass_data pass_data_ipa_chkp_produce_thunks = { SIMPLE_IPA_PASS, /* type */ @@ -732,6 +750,31 @@ public: }; // class pass_ipa_chkp_versioning +class pass_ipa_chkp_early_produce_thunks : public simple_ipa_opt_pass +{ +public: + pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt) + : simple_ipa_opt_pass (pass_data_ipa_chkp_early_produce_thunks, ctxt) + {} + + /* opt_pass methods: */ + virtual opt_pass * clone () + { + return new pass_ipa_chkp_early_produce_thunks (m_ctxt); + } + + virtual bool gate (function *) + { + return flag_check_pointer_bounds; + } + + virtual unsigned int execute (function *) + { + return chkp_produce_thunks (true); + } + +}; // class pass_chkp_produce_thunks + class pass_ipa_chkp_produce_thunks : public simple_ipa_opt_pass { public: @@ -752,7 +795,7 @@ public: virtual unsigned int execute (function *) { - return chkp_produce_thunks (); + return chkp_produce_thunks (false); } }; // class pass_chkp_produce_thunks @@ -763,6 +806,12 @@ make_pass_ipa_chkp_versioning (gcc::context *ctxt) return new pass_ipa_chkp_versioning (ctxt); } +simple_ipa_opt_pass * +make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt) +{ + return new pass_ipa_chkp_early_produce_thunks (ctxt); +} + simple_ipa_opt_pass * make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt) { diff --git a/gcc/passes.def b/gcc/passes.def index c0ddee4c3c9..2bc5dcd781f 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_ipa_function_and_variable_visibility); NEXT_PASS (pass_ipa_chkp_versioning); + NEXT_PASS (pass_ipa_chkp_early_produce_thunks); NEXT_PASS (pass_build_ssa_passes); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) NEXT_PASS (pass_fixup_cfg); @@ -65,7 +66,6 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_chkp); NEXT_PASS (pass_rebuild_cgraph_edges); POP_INSERT_PASSES () - NEXT_PASS (pass_ipa_chkp_produce_thunks); NEXT_PASS (pass_local_optimization_passes); PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) @@ -103,6 +103,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_inline_parameters); POP_INSERT_PASSES () + NEXT_PASS (pass_ipa_chkp_produce_thunks); NEXT_PASS (pass_ipa_auto_profile); NEXT_PASS (pass_ipa_free_inline_summary); NEXT_PASS (pass_ipa_tree_profile); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29ad3f4db8e..a063907dfdb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-01-19 Ilya Enkovich + + * gcc.target/i386/chkp-always_inline.c: New. + 2015-01-15 Andrew Pinski Naveen H.S diff --git a/gcc/testsuite/gcc.target/i386/chkp-always_inline.c b/gcc/testsuite/gcc.target/i386/chkp-always_inline.c new file mode 100644 index 00000000000..16d23582dde --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/chkp-always_inline.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target mpx } */ +/* { dg-options "-fcheck-pointer-bounds -mmpx -O2 -Wno-attributes" } */ + +__attribute__((always_inline)) int f1 (int *p) +{ + return *p; +} + +__attribute__((bnd_legacy)) int f2 (int *p) +{ + return f1 (p); +} diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 9ff5bdc60ce..b59ae7a39d6 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -334,6 +334,7 @@ extern void register_pass (opt_pass* pass, pass_positioning_ops pos, const char* ref_pass_name, int ref_pass_inst_number); extern simple_ipa_opt_pass *make_pass_ipa_chkp_versioning (gcc::context *ctxt); +extern simple_ipa_opt_pass *make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt); extern simple_ipa_opt_pass *make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt); extern gimple_opt_pass *make_pass_chkp (gcc::context *ctxt); extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt); -- 2.30.2