aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/ipa-chkp.c65
-rw-r--r--gcc/passes.def3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/chkp-always_inline.c13
-rw-r--r--gcc/tree-pass.h1
6 files changed, 91 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bc69bd5..cc796ac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/ipa-chkp.c b/gcc/ipa-chkp.c
index 8e6612e..67cb7d5 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
@@ -764,6 +807,12 @@ make_pass_ipa_chkp_versioning (gcc::context *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)
{
return new pass_ipa_chkp_produce_thunks (ctxt);
diff --git a/gcc/passes.def b/gcc/passes.def
index c0ddee4..2bc5dcd 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 29ad3f4..a063907 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
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 0000000..16d2358
--- /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 9ff5bdc..b59ae7a 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);