summaryrefslogtreecommitdiff
path: root/ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs')
-rw-r--r--ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs91
1 files changed, 91 insertions, 0 deletions
diff --git a/ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs b/ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs
new file mode 100644
index 00000000..902b7002
--- /dev/null
+++ b/ICSharpCode.Decompiler/FlowAnalysis/SsaVariable.cs
@@ -0,0 +1,91 @@
+// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using Mono.Cecil;
+using Mono.Cecil.Cil;
+
+namespace ICSharpCode.Decompiler.FlowAnalysis
+{
+ /// <summary>
+ /// Represents a variable used with the SsaInstruction register-based instructions.
+ /// Despite what the name suggests, the variable is not necessarily in single-assignment form - take a look at "bool IsSingleAssignment".
+ /// </summary>
+ public sealed class SsaVariable
+ {
+ public int OriginalVariableIndex;
+ public readonly string Name;
+ public readonly bool IsStackLocation;
+
+ public readonly ParameterDefinition Parameter;
+ public readonly VariableDefinition Variable;
+
+ public SsaVariable(ParameterDefinition p)
+ {
+ Name = string.IsNullOrEmpty(p.Name) ? "param" + p.Index : p.Name;
+ Parameter = p;
+ }
+
+ public SsaVariable(VariableDefinition v)
+ {
+ Name = string.IsNullOrEmpty(v.Name) ? "V_" + v.Index : v.Name;
+ Variable = v;
+ }
+
+ public SsaVariable(int stackLocation)
+ {
+ Name = "stack" + stackLocation;
+ IsStackLocation = true;
+ }
+
+ public SsaVariable(SsaVariable original, string newName)
+ {
+ Name = newName;
+ IsStackLocation = original.IsStackLocation;
+ OriginalVariableIndex = original.OriginalVariableIndex;
+ Parameter = original.Parameter;
+ Variable = original.Variable;
+ }
+
+ public override string ToString()
+ {
+ return Name;
+ }
+
+ /// <summary>
+ /// Gets whether this variable has only a single assignment.
+ /// This field is initialized in TransformToSsa step.
+ /// </summary>
+ /// <remarks>Not all variables can be transformed to single assignment form: variables that have their address taken
+ /// cannot be represented in SSA (although SimplifyByRefCalls will get rid of the address-taking instruction in almost all cases)</remarks>
+ public bool IsSingleAssignment;
+
+ /// <summary>
+ /// Gets the instruction defining the variable.
+ /// This field is initialized in TransformToSsa step. It is only set for variables with a single assignment.
+ /// </summary>
+ public SsaInstruction Definition;
+
+ /// <summary>
+ /// Gets the places where a variable is used.
+ /// If a single instruction reads a variable 2 times (e.g. adding to itself), then it must be included 2 times in this list!
+ /// </summary>
+ public List<SsaInstruction> Usage;
+ }
+}