Hi,

This patch add function pointers replacement into instrumentation pass.

Thanks,
Ilya
--
2014-10-08  Ilya Enkovich  <ilya.enkov...@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.


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:

Reply via email to