aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-alias-common.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-alias-common.h')
-rw-r--r--gcc/tree-alias-common.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/gcc/tree-alias-common.h b/gcc/tree-alias-common.h
new file mode 100644
index 0000000..45c9e4b
--- /dev/null
+++ b/gcc/tree-alias-common.h
@@ -0,0 +1,99 @@
+#ifndef TREE_ALIAS_COMMON
+#define TREE_ALIAS_COMMON
+#include "tree-alias-type.h"
+/* Alias analysis function pointers.
+ Functions implemented by the actual alias analysis algorithms in
+ order for them to work with the common points-to structure. */
+struct tree_alias_ops
+{
+ /* Initialization.
+ Called right before we start using the other functions. */
+ void (*init) (struct tree_alias_ops *);
+
+ /* Cleanup.
+ Called when we are finished with the alias analyzer. */
+ void (*cleanup) (struct tree_alias_ops *);
+
+ /* Add variable.
+ Called when we want to inform the alias analyzer about a new
+ variable we've found. */
+ alias_var (*add_var) (struct tree_alias_ops *, tree);
+
+ /* Add variable equivalent to existing one.
+ Called when we want to inform the alias analyzer about a new
+ variable that has the same points-to set as an existing
+ variable. */
+ alias_var (*add_var_same) (struct tree_alias_ops *, tree,
+ alias_var);
+
+ /* Process a simple assignment (a = b).
+ Called to process simple assignment statements of the form a = b,
+ where a and b are both variables. */
+ void (*simple_assign) (struct tree_alias_ops *, alias_var,
+ alias_var);
+ /* Process an address assignment (a = &b).
+ Called to process address assignment statements of the form a =
+ &b, where a and b are both variables. */
+ void (*addr_assign) (struct tree_alias_ops *, alias_var, alias_var);
+
+ /* Process a pointer assignment (a = *b).
+ Called to process pointer assignment statements of the form a =
+ *b, where a and b are both variables. */
+ void (*ptr_assign) (struct tree_alias_ops *, alias_var, alias_var);
+
+ /* Process an operator assignment (a = op (...))
+ Called to process operators of the form a = op(...), where a is a
+ variable. */
+ void (*op_assign) (struct tree_alias_ops *, alias_var, varray_type,
+ tree, bitmap);
+ /* Process a heap assignment (a = alloc (...))
+ Called to process a heap assignment of the form a = alloc
+ (...), where a is a variable, and *alloc is a function that
+ returns new memory. */
+ void (*heap_assign) (struct tree_alias_ops *, alias_var);
+
+ /* Process an assignment to a pointer (*a = b)
+ Called to process assignment to pointer statements of the form
+ *a = b, where a and b are both variables. */
+ void (*assign_ptr) (struct tree_alias_ops *, alias_var, alias_var);
+
+ /* Process a function definition.
+ Called to inform the alias analyzer about a new function
+ definition. */
+ void (*function_def) (struct tree_alias_ops *, alias_var,
+ varray_type, alias_var);
+
+ /* Process a function call.
+ Return 1 if we need to assume conservative side-effects. */
+ int (*function_call) (struct tree_alias_ops *, alias_var,
+ alias_var, varray_type, bitmap);
+
+ /* Determine if two alias variables may alias. */
+ bool (*may_alias) (struct tree_alias_ops *, alias_var, alias_var);
+
+ /* Determine if two alias variables have the same points-to set. */
+ bool (*same_points_to_set) (struct tree_alias_ops *, alias_var,
+ alias_var);
+
+ /* Determine if the alias variable has an empty points-to set. */
+ bool (*empty_points_to_set) (struct tree_alias_ops *, alias_var);
+
+ /* Private data. */
+ void *data;
+
+ /* Interprocedural. */
+ int ip:1;
+
+ /* Can do conservative interprocedural analysis if we save the
+ * info. */
+ int ip_partial:1;
+
+};
+
+extern struct tree_alias_ops *current_alias_ops;
+extern void init_alias_vars (void);
+extern bool ptr_may_alias_var (tree, tree);
+extern bool same_points_to_set (tree, tree);
+extern bool empty_points_to_set (tree);
+extern const char *alias_get_name (tree);
+#endif