From db1cd0020dadd1bd9b701f0df780fadce9ee2b32 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 29 Feb 2012 23:41:40 +0100 Subject: [PATCH] Add support for AnyCPU32BitPreferred and ARM assemblies. --- ILSpy/Languages/CSharpLanguage.cs | 73 ++++++++++++++----------- ILSpy/VB/VBLanguage.cs | 33 +---------- Mono.Cecil/Mono.Cecil.PE/ImageReader.cs | 4 +- Mono.Cecil/Mono.Cecil/ModuleKind.cs | 2 + 4 files changed, 49 insertions(+), 63 deletions(-) diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 87d6ce63d..0e161e1ed 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -220,6 +220,46 @@ namespace ICSharpCode.ILSpy astBuilder.GenerateCode(output); } + public static string GetPlatformDisplayName(ModuleDefinition module) + { + switch (module.Architecture) { + case TargetArchitecture.I386: + if ((module.Attributes & ModuleAttributes.Preferred32Bit) == ModuleAttributes.Preferred32Bit) + return "AnyCPU (32-bit preferred)"; + else if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) + return "x86"; + else + return "AnyCPU (64-bit preferred)"; + break; + case TargetArchitecture.AMD64: + return "x64"; + case TargetArchitecture.IA64: + return "Itanium"; + default: + return module.Architecture.ToString(); + } + } + + public static string GetPlatformName(ModuleDefinition module) + { + switch (module.Architecture) { + case TargetArchitecture.I386: + if ((module.Attributes & ModuleAttributes.Preferred32Bit) == ModuleAttributes.Preferred32Bit) + return "AnyCPU"; + else if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) + return "x86"; + else + return "AnyCPU"; + break; + case TargetArchitecture.AMD64: + return "x64"; + case TargetArchitecture.IA64: + return "Itanium"; + default: + return module.Architecture.ToString(); + } + } + public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options) { if (options.FullDecompilation && options.SaveAsProjectDirectory != null) { @@ -236,20 +276,7 @@ namespace ICSharpCode.ILSpy output.WriteReference(mainModule.EntryPoint.DeclaringType.FullName + "." + mainModule.EntryPoint.Name, mainModule.EntryPoint); output.WriteLine(); } - switch (mainModule.Architecture) { - case TargetArchitecture.I386: - if ((mainModule.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) - output.WriteLine("// Architecture: x86"); - else - output.WriteLine("// Architecture: AnyCPU"); - break; - case TargetArchitecture.AMD64: - output.WriteLine("// Architecture: x64"); - break; - case TargetArchitecture.IA64: - output.WriteLine("// Architecture: Itanium-64"); - break; - } + output.WriteLine("// Architecture: " + GetPlatformDisplayName(mainModule)); if ((mainModule.Attributes & ModuleAttributes.ILOnly) == 0) { output.WriteLine("// This assembly contains unmanaged code."); } @@ -283,23 +310,7 @@ namespace ICSharpCode.ILSpy void WriteProjectFile(TextWriter writer, IEnumerable> files, ModuleDefinition module) { const string ns = "http://schemas.microsoft.com/developer/msbuild/2003"; - string platformName; - switch (module.Architecture) { - case TargetArchitecture.I386: - if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) - platformName = "x86"; - else - platformName = "AnyCPU"; - break; - case TargetArchitecture.AMD64: - platformName = "x64"; - break; - case TargetArchitecture.IA64: - platformName = "Itanium"; - break; - default: - throw new NotSupportedException("Invalid value for TargetArchitecture"); - } + string platformName = GetPlatformName(module); using (XmlTextWriter w = new XmlTextWriter(writer)) { w.Formatting = Formatting.Indented; w.WriteStartDocument(); diff --git a/ILSpy/VB/VBLanguage.cs b/ILSpy/VB/VBLanguage.cs index 030a78318..6330bf01f 100644 --- a/ILSpy/VB/VBLanguage.cs +++ b/ILSpy/VB/VBLanguage.cs @@ -84,20 +84,7 @@ namespace ICSharpCode.ILSpy.VB output.WriteReference(mainModule.EntryPoint.DeclaringType.FullName + "." + mainModule.EntryPoint.Name, mainModule.EntryPoint); output.WriteLine(); } - switch (mainModule.Architecture) { - case TargetArchitecture.I386: - if ((mainModule.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) - WriteCommentLine(output, "Architecture: x86"); - else - WriteCommentLine(output, "Architecture: AnyCPU"); - break; - case TargetArchitecture.AMD64: - WriteCommentLine(output, "Architecture: x64"); - break; - case TargetArchitecture.IA64: - WriteCommentLine(output, "Architecture: Itanium-64"); - break; - } + WriteCommentLine(output, "Architecture: " + CSharpLanguage.GetPlatformDisplayName(mainModule)); if ((mainModule.Attributes & ModuleAttributes.ILOnly) == 0) { WriteCommentLine(output, "This assembly contains unmanaged code."); } @@ -138,23 +125,7 @@ namespace ICSharpCode.ILSpy.VB void WriteProjectFile(TextWriter writer, IEnumerable> files, ModuleDefinition module) { const string ns = "http://schemas.microsoft.com/developer/msbuild/2003"; - string platformName; - switch (module.Architecture) { - case TargetArchitecture.I386: - if ((module.Attributes & ModuleAttributes.Required32Bit) == ModuleAttributes.Required32Bit) - platformName = "x86"; - else - platformName = "AnyCPU"; - break; - case TargetArchitecture.AMD64: - platformName = "x64"; - break; - case TargetArchitecture.IA64: - platformName = "Itanium"; - break; - default: - throw new NotSupportedException("Invalid value for TargetArchitecture"); - } + string platformName = CSharpLanguage.GetPlatformName(module); using (XmlTextWriter w = new XmlTextWriter(writer)) { w.Formatting = Formatting.Indented; w.WriteStartDocument(); diff --git a/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs index 734b00a53..0714e7559 100644 --- a/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs +++ b/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs @@ -118,9 +118,11 @@ namespace Mono.Cecil.PE { return TargetArchitecture.AMD64; case 0x0200: return TargetArchitecture.IA64; + case 0x01c4: + return TargetArchitecture.ARMv7; } - throw new NotSupportedException (); + throw new NotSupportedException (machine.ToString()); } static ModuleKind GetModuleKind (ushort characteristics, ushort subsystem) diff --git a/Mono.Cecil/Mono.Cecil/ModuleKind.cs b/Mono.Cecil/Mono.Cecil/ModuleKind.cs index e5f745824..d42c7bea2 100644 --- a/Mono.Cecil/Mono.Cecil/ModuleKind.cs +++ b/Mono.Cecil/Mono.Cecil/ModuleKind.cs @@ -41,6 +41,7 @@ namespace Mono.Cecil { I386, AMD64, IA64, + ARMv7 } [Flags] @@ -48,5 +49,6 @@ namespace Mono.Cecil { ILOnly = 1, Required32Bit = 2, StrongNameSigned = 8, + Preferred32Bit = 0x00020000 } }