diff mbox

[Pointer,Bounds,Checker,14/x] Passes [5/n] Replace function pointers

Message ID 20141008190313.GE13454@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Oct. 8, 2014, 7:03 p.m. UTC
Hi,

This patch add function pointers replacement into instrumentation pass.

Thanks,
Ilya
--
2014-10-08  Ilya Enkovich  <ilya.enkovich@intel.com>

	* tree-chkp.c: Include ipa-chkp.h.
	(chkp_replace_function_pointer): New.
	(chkp_replace_function_pointers): New.
	(chkp_instrument_function): Call replace function pointers
	in all statements with instrumented ones.

Comments

Jeff Law Oct. 10, 2014, 6:11 p.m. UTC | #1
On 10/08/14 13:03, Ilya Enkovich wrote:
> Hi,
>
> This patch add function pointers replacement into instrumentation pass.
>
> Thanks,
> Ilya
> --
> 2014-10-08  Ilya Enkovich  <ilya.enkovich@intel.com>
>
> 	* tree-chkp.c: Include ipa-chkp.h.
> 	(chkp_replace_function_pointer): New.
> 	(chkp_replace_function_pointers): New.
> 	(chkp_instrument_function): Call replace function pointers
> 	in all statements with instrumented ones.
OK.
Jeff
diff mbox

Patch

diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index d297171..bbb6459 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -64,6 +64,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "gimple-walk.h"
 #include "rtl.h" /* For MEM_P, assign_temp.  */
 #include "tree-dfa.h"
+#include "ipa-chkp.h"
 
 /*  Pointer Bounds Checker instruments code with memory checks to find
     out-of-bounds memory accesses.  Checks are performed by computing
@@ -3270,6 +3271,49 @@  chkp_fix_cfg ()
       }
 }
 
+/* Walker callback for chkp_replace_function_pointers.  Replaces
+   function pointer in the specified operand with pointer to the
+   instrumented function version.  */
+static tree
+chkp_replace_function_pointer (tree *op, int *walk_subtrees,
+			       void *data ATTRIBUTE_UNUSED)
+{
+  if (TREE_CODE (*op) == FUNCTION_DECL
+      && !lookup_attribute ("bnd_legacy", DECL_ATTRIBUTES (*op))
+      /* Do not replace builtins for now.  */
+      && DECL_BUILT_IN_CLASS (*op) == NOT_BUILT_IN)
+    {
+      struct cgraph_node *node = cgraph_node::get_create (*op);
+
+      if (!node->instrumentation_clone)
+	chkp_maybe_create_clone (*op);
+
+      *op = node->instrumented_version->decl;
+      *walk_subtrees = 0;
+    }
+
+  return NULL;
+}
+
+/* This function searches for function pointers in statement
+   pointed by GSI and replaces them with pointers to instrumented
+   function versions.  */
+static void
+chkp_replace_function_pointers (gimple_stmt_iterator *gsi)
+{
+  gimple stmt = gsi_stmt (*gsi);
+  /* For calls we want to walk call args only.  */
+  if (gimple_code (stmt) == GIMPLE_CALL)
+    {
+      unsigned i;
+      for (i = 0; i < gimple_call_num_args (stmt); i++)
+	walk_tree (gimple_call_arg_ptr (stmt, i),
+		   chkp_replace_function_pointer, NULL, NULL);
+    }
+  else
+    walk_gimple_stmt (gsi, NULL, chkp_replace_function_pointer, NULL);
+}
+
 /* This function instruments all statements working with memory.  */
 static void
 chkp_instrument_function (void)
@@ -3294,6 +3338,8 @@  chkp_instrument_function (void)
 	      continue;
 	    }
 
+	  chkp_replace_function_pointers (&i);
+
           switch (gimple_code (s))
             {
             case GIMPLE_ASSIGN: