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:
parent
9deaf59d1b
commit
c11d86b47f
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue