--- /dev/null
+/*
+ * 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__ */