2005-11-18 Massimiliano Mantione <massi@ximian.com>
[mono.git] / mono / mini / aliasing.h
diff --git a/mono/mini/aliasing.h b/mono/mini/aliasing.h
new file mode 100644 (file)
index 0000000..be93dff
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * aliasing.h: Alias Analysis
+ *
+ * Author:
+ *   Massimiliano Mantione (massi@ximian.com)
+ *
+ * (C) 2005 Novell, Inc.  http://www.novell.com
+ */
+
+#ifndef __MONO_ALIASING_H__
+#define __MONO_ALIASING_H__
+
+#include "mini.h"
+
+#define MONO_ALIASING_INVALID_VARIABLE_INDEX (-1)
+
+/*
+ * A struct representing the element of a list of local variables.
+ */
+typedef struct MonoLocalVariableList {
+       /* The index of the local variable */
+       int variable_index;
+       
+       /* Next in the list */
+       struct MonoLocalVariableList *next;
+} MonoLocalVariableList;
+
+/*
+ * A struct representing the information about the fact that an address
+ * that could be an alias is used.
+ */
+typedef struct MonoAliasUsageInformation {
+       /* The inst where the address is used */
+       MonoInst *inst;
+       
+       /* The possibly aliased variables. Note that if this field is null */
+       /* it means that any "problematic" variable could be aliased! */
+       MonoLocalVariableList *affected_variables;
+       
+       /* Next in the list */
+       struct MonoAliasUsageInformation *next;
+} MonoAliasUsageInformation;
+
+
+/*
+ * All the different kinds of locations for a variable's address.
+ * "ANY" means the location is unknown or cannot be handled.
+ */
+typedef enum {
+       MONO_ALIASING_TYPE_ANY,
+       MONO_ALIASING_TYPE_NO_ALIAS,
+       MONO_ALIASING_TYPE_LOCAL,
+       MONO_ALIASING_TYPE_LOCAL_FIELD
+} MonoAliasType;
+
+typedef struct MonoAliasValue {
+       MonoAliasType type;
+       int variable_index;
+} MonoAliasValue;
+
+/*
+ * A struct representing the aliasing information in a BB.
+ */
+typedef struct MonoAliasingInformationInBB {
+       /* The BB to which these info are relaed. */
+       MonoBasicBlock *bb;
+       
+       /* Info on alias usage. */
+       MonoAliasUsageInformation *potential_alias_uses;
+} MonoAliasingInformationInBB;
+
+/*
+ * A struct representing the aliasing information in a MonoCompile.
+ */
+typedef struct MonoAliasingInformation {
+       /* The MonoCompile to which these info are relaed. */
+       MonoCompile *cfg;
+       
+       /* The pool from where everything is allocated (including this struct). */
+       MonoMemPool *mempool;
+       
+       /* Aliasing info for each BB */
+       MonoAliasingInformationInBB *bb;
+       
+       /* The variables whose address has been taken and "lost": any pointer */
+       /* with an unknown value potentially aliases these variables. */
+       MonoLocalVariableList *uncontrollably_aliased_variables;
+       
+       /* Used to track the current inst when traversing inst trees in a BB. */
+       MonoAliasUsageInformation *next_interesting_inst;
+       
+       /* Array containing one MonoLocalVariableList for each local variable. */
+       MonoLocalVariableList *variables;
+       
+       /* Array containing one flag for each local variable stating if it is */
+       /* already in the uncontrollably_aliased_variables list. */
+       gboolean *variable_is_uncontrollably_aliased;
+       
+       /* This MonoLocalVariableList is a placeholder for uncontrollably_aliased_variables */
+       /* while the aliasing info are still being collected. */
+       MonoLocalVariableList *temporary_uncontrollably_aliased_variables;
+       
+       /* An array of MonoInst* containing all the arguments to the next call. */
+       MonoInst **arguments;
+       /* An array of MonoAliasValue containing all the aliases passed to the arguments of the next call. */
+       MonoAliasValue *arguments_aliases;
+       /* The total capacity of the "arguments" and "arguments_aliases" arrays. */
+       int arguments_capacity;
+       /* The number of used elements in the "arguments" and "arguments_aliases" arrays. */
+       int number_of_arguments;
+} MonoAliasingInformation;
+
+extern MonoAliasingInformation*
+mono_build_aliasing_information (MonoCompile *cfg);
+extern void
+mono_destroy_aliasing_information (MonoAliasingInformation *info);
+extern void
+mono_aliasing_initialize_code_traversal (MonoAliasingInformation *info, MonoBasicBlock *bb);
+extern MonoLocalVariableList*
+mono_aliasing_get_affected_variables_for_inst_traversing_code (MonoAliasingInformation *info, MonoInst *inst);
+extern MonoLocalVariableList*
+mono_aliasing_get_affected_variables_for_inst_in_bb (MonoAliasingInformation *info, MonoInst *inst, MonoBasicBlock *bb);
+extern MonoLocalVariableList*
+mono_aliasing_get_affected_variables_for_inst (MonoAliasingInformation *info, MonoInst *inst);
+
+extern void
+mono_aliasing_deadce (MonoAliasingInformation *info);
+
+#endif /* __MONO_ALIASING_H__ */