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
This commit is contained in:
Ilya Enkovich 2015-01-19 10:26:52 +00:00 committed by Ilya Enkovich
parent 9deaf59d1b
commit c11d86b47f
6 changed files with 91 additions and 9 deletions

View File

@ -1,3 +1,17 @@
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>
* cgraph.c (cgraph_node::dump): Dump profile flags.

View File

@ -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)
{

View File

@ -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);

View File

@ -1,3 +1,7 @@
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>
Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>

View File

@ -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);
}

View File

@ -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);