Discussion:
[PATCH, Pointer Bounds Checker 14/x] Passes [5/n] Replace function pointers
Ilya Enkovich
2014-10-08 19:03:13 UTC
Permalink
Hi,

This patch add function pointers replacement into instrumentation pass.

Thanks,
Ilya
--
2014-10-08 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.


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:

Loading...