ipa-chkp.c (chkp_produce_thunks): Add early param to split thunks production into...
authorIlya Enkovich <ilya.enkovich@intel.com>
Mon, 19 Jan 2015 10:26:52 +0000 (10:26 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Mon, 19 Jan 2015 10:26:52 +0000 (10:26 +0000)
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
gcc/ipa-chkp.c
gcc/passes.def
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/chkp-always_inline.c [new file with mode: 0644]
gcc/tree-pass.h

index bc69bd54516af35a387f4065edd0eb5d543e2dcd..cc796ac4bcedb0ba67718604e676ea05002ccaea 100644 (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.
index 8e6612ef1ec3c5b12a4194b104f6075149612ad1..67cb7d51478aec7a3993a99b459552274ffc100c 100644 (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)
 {
index c0ddee4c3c992f3f6e045f7e868fea2af5119e03..2bc5dcd781fe77591883527ddd0e9705a521c9a0 100644 (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);
index 29ad3f4db8ee248b90531761fe7b816835bc201d..a063907dfdb94813b97d000a7521353cc7e94403 100644 (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>
 
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 (file)
index 0000000..16d2358
--- /dev/null
@@ -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);
+}
index 9ff5bdc60ceec34c6da59e32ecb818e84abcb8cd..b59ae7a39d672973f178c0363f4485ed2f616afd 100644 (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);