diff --git a/ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj b/ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj index c07a6eef2..0695fd40e 100644 --- a/ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj +++ b/ILSpy.ReadyToRun/ILSpy.ReadyToRun.csproj @@ -37,10 +37,22 @@ False + + + + + + ReadyToRunOptionPage.xaml + + + + + + diff --git a/ILSpy.ReadyToRun/ReadyToRunLanguage.cs b/ILSpy.ReadyToRun/ReadyToRunLanguage.cs index fb1e39d9f..770b94d35 100644 --- a/ILSpy.ReadyToRun/ReadyToRunLanguage.cs +++ b/ILSpy.ReadyToRun/ReadyToRunLanguage.cs @@ -29,7 +29,7 @@ using ICSharpCode.Decompiler.Solution; using ICSharpCode.Decompiler.TypeSystem; using ILCompiler.Reflection.ReadyToRun; -namespace ICSharpCode.ILSpy +namespace ICSharpCode.ILSpy.ReadyToRun { [Export(typeof(Language))] internal class ReadyToRunLanguage : Language @@ -44,7 +44,7 @@ namespace ICSharpCode.ILSpy public override ProjectId DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options) { PEFile module = assembly.GetPEFileOrNull(); - R2RReaderCacheEntry r2rReaderCacheEntry = GetReader(assembly, module); + R2RReaderCacheEntry r2rReaderCacheEntry = GetReader(assembly, module); if (r2rReaderCacheEntry.r2rReader == null) { WriteCommentLine(output, r2rReaderCacheEntry.failureReason); } else { @@ -109,8 +109,14 @@ namespace ICSharpCode.ILSpy decoder.Decode(out instructions.AllocUninitializedElement()); } - // TODO: DecompilationOptions? - var formatter = new NasmFormatter(); + string disassemblyFormat = ReadyToRunOptions.GetDisassemblyFormat(null); + Formatter formatter = null; + if (disassemblyFormat.Equals(ReadyToRunOptions.intel)) { + formatter = new NasmFormatter(); + } else { + Debug.Assert(disassemblyFormat.Equals(ReadyToRunOptions.gas)); + formatter = new GasFormatter(); + } formatter.Options.DigitSeparator = "`"; formatter.Options.FirstOperandCharIndex = 10; var tempOutput = new StringBuilderFormatterOutput(); diff --git a/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml b/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml new file mode 100644 index 000000000..9920b8344 --- /dev/null +++ b/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml @@ -0,0 +1,10 @@ + + + + Disassembly Format + + + + \ No newline at end of file diff --git a/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml.cs b/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml.cs new file mode 100644 index 000000000..3c0c04ad8 --- /dev/null +++ b/ILSpy.ReadyToRun/ReadyToRunOptionPage.xaml.cs @@ -0,0 +1,82 @@ +// Copyright (c) 2018 Siegfried Pammer +// +// 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.ComponentModel; +using System.Windows.Controls; +using System.Xml.Linq; +using ICSharpCode.ILSpy.Options; + +namespace ICSharpCode.ILSpy.ReadyToRun +{ + [ExportOptionPage(Title = "ReadyToRun", Order = 0)] + partial class ReadyToRunOptionPage : UserControl, IOptionPage + { + public ReadyToRunOptionPage() + { + InitializeComponent(); + } + + public void Load(ILSpySettings settings) + { + Options s = new Options(); + s.DisassemblyFormat = ReadyToRunOptions.GetDisassemblyFormat(settings); + this.DataContext = s; + } + + public void LoadDefaults() + { + this.DataContext = new Options(); + } + + public void Save(XElement root) + { + Options s = (Options)this.DataContext; + ReadyToRunOptions.SetDisassemblyFormat(root, s.DisassemblyFormat); + } + } + + internal class Options : INotifyPropertyChanged + { + public string[] DisassemblyFormats { + get { + return ReadyToRunOptions.disassemblyFormats; + } + } + + private string disassemblyFormat; + + public string DisassemblyFormat { + get { return disassemblyFormat; } + set { + if (disassemblyFormat != value) { + disassemblyFormat = value; + OnPropertyChanged(nameof(DisassemblyFormat)); + } + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} \ No newline at end of file diff --git a/ILSpy.ReadyToRun/ReadyToRunOptions.cs b/ILSpy.ReadyToRun/ReadyToRunOptions.cs new file mode 100644 index 000000000..6ee672880 --- /dev/null +++ b/ILSpy.ReadyToRun/ReadyToRunOptions.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2018 Siegfried Pammer +// +// 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.Xml.Linq; + +namespace ICSharpCode.ILSpy.ReadyToRun +{ + internal class ReadyToRunOptions + { + private static readonly XNamespace ns = "http://www.ilspy.net/ready-to-run"; + + internal static string intel = "Intel"; + internal static string gas = "AT & T"; + internal static string[] disassemblyFormats = new string[] { intel, gas }; + + public static string GetDisassemblyFormat(ILSpySettings settings) + { + if (settings == null) { + settings = ILSpySettings.Load(); + } + XElement e = settings[ns + "ReadyToRunOptions"]; + XAttribute a = e.Attribute("DisassemblyFormat"); + if (a == null) { + return ReadyToRunOptions.intel; + } else { + return (string)a; + } + } + + public static void SetDisassemblyFormat(XElement root, string disassemblyFormat) + { + XElement section = new XElement(ns + "ReadyToRunOptions"); + section.SetAttributeValue("DisassemblyFormat", disassemblyFormat); + + XElement existingElement = root.Element(ns + "ReadyToRunOptions"); + if (existingElement != null) { + existingElement.ReplaceWith(section); + } else { + root.Add(section); + } + } + } +}