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);
+ }
+ }
+ }
+}