From ec226b000607d14831ee4c1a7adbffbc29450dfb Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 26 Jun 2016 16:57:09 +0200 Subject: [PATCH] Add ILAst folding and remove unused RemoveDeadVariableInit transform. --- .../CSharp/CSharpDecompiler.cs | 1 - .../ICSharpCode.Decompiler.csproj | 1 - .../IL/Instructions/Block.cs | 3 ++ .../IL/Instructions/BlockContainer.cs | 5 ++- .../IL/Instructions/ILFunction.cs | 2 + .../IL/Instructions/SwitchInstruction.cs | 5 ++- .../IL/Transforms/RemoveDeadVariableInit.cs | 43 ------------------- 7 files changed, 13 insertions(+), 47 deletions(-) delete mode 100644 ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 51545184e..4d3a48c5f 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -47,7 +47,6 @@ namespace ICSharpCode.Decompiler.CSharp readonly DecompilerSettings settings; List ilTransforms = new List { - //new RemoveDeadVariableInit(), new SplitVariables(), new ControlFlowSimplification(), //new ILInlining(), // temporary pass, just to make the ILAst easier to read while debugging loop detection diff --git a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj index 9305a187c..6dcd50013 100644 --- a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj +++ b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj @@ -127,7 +127,6 @@ - diff --git a/ICSharpCode.Decompiler/IL/Instructions/Block.cs b/ICSharpCode.Decompiler/IL/Instructions/Block.cs index aea7482fa..9578f1095 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Block.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Block.cs @@ -120,6 +120,8 @@ namespace ICSharpCode.Decompiler.IL output.WriteDefinition(Label, this); if (Parent is BlockContainer) output.Write(" (incoming: {0})", IncomingEdgeCount); + output.Write(' '); + output.MarkFoldStart("{...}"); output.WriteLine(" {"); output.Indent(); foreach (var inst in Instructions) { @@ -133,6 +135,7 @@ namespace ICSharpCode.Decompiler.IL } output.Unindent(); output.Write("}"); + output.MarkFoldEnd(); } protected override int GetChildCount() diff --git a/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs b/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs index b97ff6e07..5c743a8e2 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs @@ -107,7 +107,9 @@ namespace ICSharpCode.Decompiler.IL public override void WriteTo(ITextOutput output) { output.WriteDefinition("BlockContainer", this); - output.WriteLine(" {"); + output.Write(' '); + output.MarkFoldStart("{...}"); + output.WriteLine("{"); output.Indent(); foreach (var inst in Blocks) { inst.WriteTo(output); @@ -116,6 +118,7 @@ namespace ICSharpCode.Decompiler.IL } output.Unindent(); output.Write("}"); + output.MarkFoldEnd(); } protected override int GetChildCount() diff --git a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs index 7a1784c90..ec128a5b8 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs @@ -43,10 +43,12 @@ namespace ICSharpCode.Decompiler.IL output.WriteLine(" {"); output.Indent(); + output.MarkFoldStart(Variables.Count + " variable(s)", true); foreach (var variable in Variables) { variable.WriteDefinitionTo(output); output.WriteLine(); } + output.MarkFoldEnd(); output.WriteLine(); body.WriteTo(output); diff --git a/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs index 5335c2c25..92ab257cc 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs @@ -68,7 +68,9 @@ namespace ICSharpCode.Decompiler.IL { output.Write("switch ("); value.WriteTo(output); - output.WriteLine(") {"); + output.Write(") "); + output.MarkFoldStart("{...}"); + output.WriteLine("{"); output.Indent(); foreach (var section in this.Sections) { section.WriteTo(output); @@ -76,6 +78,7 @@ namespace ICSharpCode.Decompiler.IL } output.Unindent(); output.Write('}'); + output.MarkFoldEnd(); } protected override int GetChildCount() diff --git a/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs b/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs deleted file mode 100644 index 5d9271a78..000000000 --- a/ICSharpCode.Decompiler/IL/Transforms/RemoveDeadVariableInit.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2016 Daniel Grunwald -// -// 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.Diagnostics; -using System.Linq; -using ICSharpCode.Decompiler.FlowAnalysis; - -namespace ICSharpCode.Decompiler.IL.Transforms -{ - /// - /// Remove HasInitialValue from locals that are definitely assigned before every use - /// (=the initial value is a dead store). - /// - public class RemoveDeadVariableInit : IILTransform - { - public void Run(ILFunction function, ILTransformContext context) - { - var visitor = new DefiniteAssignmentVisitor(function); - function.Body.AcceptVisitor(visitor); - foreach (var v in function.Variables) { - if (v.Kind != VariableKind.Parameter && !visitor.IsPotentiallyUsedUninitialized(v)) { - v.HasInitialValue = false; - } - } - } - } -}