Commit c11d86b4 by Ilya Enkovich Committed by Ilya Enkovich

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
parent 9deaf59d
2015-01-19 Ilya Enkovich <ilya.enkovich@intel.com>
* 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 <hubicka@ucw.cz> 2015-01-18 Jan Hubicka <hubicka@ucw.cz>
* cgraph.c (cgraph_node::dump): Dump profile flags. * cgraph.c (cgraph_node::dump): Dump profile flags.
......
...@@ -643,7 +643,7 @@ chkp_versioning (void) ...@@ -643,7 +643,7 @@ chkp_versioning (void)
function. */ function. */
static unsigned int static unsigned int
chkp_produce_thunks (void) chkp_produce_thunks (bool early)
{ {
struct cgraph_node *node; struct cgraph_node *node;
...@@ -652,7 +652,9 @@ chkp_produce_thunks (void) ...@@ -652,7 +652,9 @@ chkp_produce_thunks (void)
if (!node->instrumentation_clone if (!node->instrumentation_clone
&& node->instrumented_version && node->instrumented_version
&& gimple_has_body_p (node->decl) && 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->release_body ();
node->remove_callees (); node->remove_callees ();
...@@ -670,6 +672,8 @@ chkp_produce_thunks (void) ...@@ -670,6 +672,8 @@ chkp_produce_thunks (void)
/* Mark instrumentation clones created for aliases and thunks /* Mark instrumentation clones created for aliases and thunks
as insttrumented so they could be removed as unreachable as insttrumented so they could be removed as unreachable
now. */ now. */
if (!early)
{
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
{ {
if (node->instrumentation_clone if (node->instrumentation_clone
...@@ -677,6 +681,7 @@ chkp_produce_thunks (void) ...@@ -677,6 +681,7 @@ chkp_produce_thunks (void)
&& !chkp_function_instrumented_p (node->decl)) && !chkp_function_instrumented_p (node->decl))
chkp_function_mark_instrumented (node->decl); chkp_function_mark_instrumented (node->decl);
} }
}
return TODO_remove_functions; return TODO_remove_functions;
} }
...@@ -694,6 +699,19 @@ const pass_data pass_data_ipa_chkp_versioning = ...@@ -694,6 +699,19 @@ const pass_data pass_data_ipa_chkp_versioning =
0 /* todo_flags_finish */ 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 = const pass_data pass_data_ipa_chkp_produce_thunks =
{ {
SIMPLE_IPA_PASS, /* type */ SIMPLE_IPA_PASS, /* type */
...@@ -732,6 +750,31 @@ public: ...@@ -732,6 +750,31 @@ public:
}; // class pass_ipa_chkp_versioning }; // 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 class pass_ipa_chkp_produce_thunks : public simple_ipa_opt_pass
{ {
public: public:
...@@ -752,7 +795,7 @@ public: ...@@ -752,7 +795,7 @@ public:
virtual unsigned int execute (function *) virtual unsigned int execute (function *)
{ {
return chkp_produce_thunks (); return chkp_produce_thunks (false);
} }
}; // class pass_chkp_produce_thunks }; // class pass_chkp_produce_thunks
...@@ -764,6 +807,12 @@ make_pass_ipa_chkp_versioning (gcc::context *ctxt) ...@@ -764,6 +807,12 @@ make_pass_ipa_chkp_versioning (gcc::context *ctxt)
} }
simple_ipa_opt_pass * 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) make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt)
{ {
return new pass_ipa_chkp_produce_thunks (ctxt); return new pass_ipa_chkp_produce_thunks (ctxt);
......
...@@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -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_free_lang_data);
NEXT_PASS (pass_ipa_function_and_variable_visibility); NEXT_PASS (pass_ipa_function_and_variable_visibility);
NEXT_PASS (pass_ipa_chkp_versioning); NEXT_PASS (pass_ipa_chkp_versioning);
NEXT_PASS (pass_ipa_chkp_early_produce_thunks);
NEXT_PASS (pass_build_ssa_passes); NEXT_PASS (pass_build_ssa_passes);
PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_fixup_cfg);
...@@ -65,7 +66,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -65,7 +66,6 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_chkp); NEXT_PASS (pass_chkp);
NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_rebuild_cgraph_edges);
POP_INSERT_PASSES () POP_INSERT_PASSES ()
NEXT_PASS (pass_ipa_chkp_produce_thunks);
NEXT_PASS (pass_local_optimization_passes); NEXT_PASS (pass_local_optimization_passes);
PUSH_INSERT_PASSES_WITHIN (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 ...@@ -103,6 +103,7 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_rebuild_cgraph_edges);
NEXT_PASS (pass_inline_parameters); NEXT_PASS (pass_inline_parameters);
POP_INSERT_PASSES () POP_INSERT_PASSES ()
NEXT_PASS (pass_ipa_chkp_produce_thunks);
NEXT_PASS (pass_ipa_auto_profile); NEXT_PASS (pass_ipa_auto_profile);
NEXT_PASS (pass_ipa_free_inline_summary); NEXT_PASS (pass_ipa_free_inline_summary);
NEXT_PASS (pass_ipa_tree_profile); NEXT_PASS (pass_ipa_tree_profile);
......
2015-01-19 Ilya Enkovich <ilya.enkovich@intel.com>
* gcc.target/i386/chkp-always_inline.c: New.
2015-01-15 Andrew Pinski <apinski@cavium.com> 2015-01-15 Andrew Pinski <apinski@cavium.com>
Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com> Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
......
/* { 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);
}
...@@ -334,6 +334,7 @@ extern void register_pass (opt_pass* pass, pass_positioning_ops pos, ...@@ -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); 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_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 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 (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt); extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment