diff --git a/protocol/src/main/kotlin/model/rider/AsmViewerModel.kt b/protocol/src/main/kotlin/model/rider/AsmViewerModel.kt index 165ebcd..e4729dc 100644 --- a/protocol/src/main/kotlin/model/rider/AsmViewerModel.kt +++ b/protocol/src/main/kotlin/model/rider/AsmViewerModel.kt @@ -65,6 +65,8 @@ class AsmViewerModel : Ext(SolutionModel.Solution) { field("targetFrameworkOverride", string.nullable) field("selectedCompiler", CompilerType) field("disassemblyTimeoutSeconds", int) + field("useCustomRuntime", bool) + field("pathToLocalCoreClr", string.nullable) } private val CompilationResult = structdef { diff --git a/src/dotnet/ReSharperPlugin.DotNetDisassembler/AsmViewerModel.Generated.cs b/src/dotnet/ReSharperPlugin.DotNetDisassembler/AsmViewerModel.Generated.cs index e985798..dd0d825 100644 --- a/src/dotnet/ReSharperPlugin.DotNetDisassembler/AsmViewerModel.Generated.cs +++ b/src/dotnet/ReSharperPlugin.DotNetDisassembler/AsmViewerModel.Generated.cs @@ -36,7 +36,7 @@ namespace JetBrains.Rider.Model /// - /// Generated from: AsmViewerModel.kt:8 + /// Generated from: AsmViewerModel.kt:7 /// public class AsmViewerModel : RdExtBase { @@ -112,7 +112,7 @@ internal AsmViewerModel ( - protected override long SerializationHash => -8744739113612796705L; + protected override long SerializationHash => 4503471233995481963L; protected override Action Register => RegisterDeclaredTypesSerializers; public static void RegisterDeclaredTypesSerializers(ISerializers serializers) @@ -161,7 +161,7 @@ public static AsmViewerModel GetAsmViewerModel(this Solution solution) /// - /// Generated from: AsmViewerModel.kt:70 + /// Generated from: AsmViewerModel.kt:72 /// public sealed class CompilationResult : IPrintable, IEquatable { @@ -406,6 +406,8 @@ public sealed class JitConfiguration : IPrintable, IEquatable [CanBeNull] public string TargetFrameworkOverride {get; private set;} public CompilerType SelectedCompiler {get; private set;} public int DisassemblyTimeoutSeconds {get; private set;} + public bool UseCustomRuntime {get; private set;} + [CanBeNull] public string PathToLocalCoreClr {get; private set;} //private fields //primary constructor @@ -420,7 +422,9 @@ public JitConfiguration( bool useDotnetBuildForReload, [CanBeNull] string targetFrameworkOverride, CompilerType selectedCompiler, - int disassemblyTimeoutSeconds + int disassemblyTimeoutSeconds, + bool useCustomRuntime, + [CanBeNull] string pathToLocalCoreClr ) { ShowAsmComments = showAsmComments; @@ -434,10 +438,12 @@ int disassemblyTimeoutSeconds TargetFrameworkOverride = targetFrameworkOverride; SelectedCompiler = selectedCompiler; DisassemblyTimeoutSeconds = disassemblyTimeoutSeconds; + UseCustomRuntime = useCustomRuntime; + PathToLocalCoreClr = pathToLocalCoreClr; } //secondary constructor //deconstruct trait - public void Deconstruct(out bool showAsmComments, out bool diffable, out bool useTieredJit, out bool usePGO, out bool runAppMode, out bool useNoRestoreFlag, out bool useDotnetPublishForReload, out bool useDotnetBuildForReload, [CanBeNull] out string targetFrameworkOverride, out CompilerType selectedCompiler, out int disassemblyTimeoutSeconds) + public void Deconstruct(out bool showAsmComments, out bool diffable, out bool useTieredJit, out bool usePGO, out bool runAppMode, out bool useNoRestoreFlag, out bool useDotnetPublishForReload, out bool useDotnetBuildForReload, [CanBeNull] out string targetFrameworkOverride, out CompilerType selectedCompiler, out int disassemblyTimeoutSeconds, out bool useCustomRuntime, [CanBeNull] out string pathToLocalCoreClr) { showAsmComments = ShowAsmComments; diffable = Diffable; @@ -450,6 +456,8 @@ public void Deconstruct(out bool showAsmComments, out bool diffable, out bool us targetFrameworkOverride = TargetFrameworkOverride; selectedCompiler = SelectedCompiler; disassemblyTimeoutSeconds = DisassemblyTimeoutSeconds; + useCustomRuntime = UseCustomRuntime; + pathToLocalCoreClr = PathToLocalCoreClr; } //statics @@ -466,7 +474,9 @@ public void Deconstruct(out bool showAsmComments, out bool diffable, out bool us var targetFrameworkOverride = ReadStringNullable(ctx, reader); var selectedCompiler = (CompilerType)reader.ReadInt(); var disassemblyTimeoutSeconds = reader.ReadInt(); - var _result = new JitConfiguration(showAsmComments, diffable, useTieredJit, usePGO, runAppMode, useNoRestoreFlag, useDotnetPublishForReload, useDotnetBuildForReload, targetFrameworkOverride, selectedCompiler, disassemblyTimeoutSeconds); + var useCustomRuntime = reader.ReadBool(); + var pathToLocalCoreClr = ReadStringNullable(ctx, reader); + var _result = new JitConfiguration(showAsmComments, diffable, useTieredJit, usePGO, runAppMode, useNoRestoreFlag, useDotnetPublishForReload, useDotnetBuildForReload, targetFrameworkOverride, selectedCompiler, disassemblyTimeoutSeconds, useCustomRuntime, pathToLocalCoreClr); return _result; }; public static CtxReadDelegate ReadStringNullable = JetBrains.Rd.Impl.Serializers.ReadString.NullableClass(); @@ -484,6 +494,8 @@ public void Deconstruct(out bool showAsmComments, out bool diffable, out bool us WriteStringNullable(ctx, writer, value.TargetFrameworkOverride); writer.Write((int)value.SelectedCompiler); writer.Write(value.DisassemblyTimeoutSeconds); + writer.Write(value.UseCustomRuntime); + WriteStringNullable(ctx, writer, value.PathToLocalCoreClr); }; public static CtxWriteDelegate WriteStringNullable = JetBrains.Rd.Impl.Serializers.WriteString.NullableClass(); @@ -503,7 +515,7 @@ public bool Equals(JitConfiguration other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; - return ShowAsmComments == other.ShowAsmComments && Diffable == other.Diffable && UseTieredJit == other.UseTieredJit && UsePGO == other.UsePGO && RunAppMode == other.RunAppMode && UseNoRestoreFlag == other.UseNoRestoreFlag && UseDotnetPublishForReload == other.UseDotnetPublishForReload && UseDotnetBuildForReload == other.UseDotnetBuildForReload && Equals(TargetFrameworkOverride, other.TargetFrameworkOverride) && SelectedCompiler == other.SelectedCompiler && DisassemblyTimeoutSeconds == other.DisassemblyTimeoutSeconds; + return ShowAsmComments == other.ShowAsmComments && Diffable == other.Diffable && UseTieredJit == other.UseTieredJit && UsePGO == other.UsePGO && RunAppMode == other.RunAppMode && UseNoRestoreFlag == other.UseNoRestoreFlag && UseDotnetPublishForReload == other.UseDotnetPublishForReload && UseDotnetBuildForReload == other.UseDotnetBuildForReload && Equals(TargetFrameworkOverride, other.TargetFrameworkOverride) && SelectedCompiler == other.SelectedCompiler && DisassemblyTimeoutSeconds == other.DisassemblyTimeoutSeconds && UseCustomRuntime == other.UseCustomRuntime && Equals(PathToLocalCoreClr, other.PathToLocalCoreClr); } //hash code trait public override int GetHashCode() @@ -521,6 +533,8 @@ public override int GetHashCode() hash = hash * 31 + (TargetFrameworkOverride != null ? TargetFrameworkOverride.GetHashCode() : 0); hash = hash * 31 + (int) SelectedCompiler; hash = hash * 31 + DisassemblyTimeoutSeconds.GetHashCode(); + hash = hash * 31 + UseCustomRuntime.GetHashCode(); + hash = hash * 31 + (PathToLocalCoreClr != null ? PathToLocalCoreClr.GetHashCode() : 0); return hash; } } @@ -540,6 +554,8 @@ public void Print(PrettyPrinter printer) printer.Print("targetFrameworkOverride = "); TargetFrameworkOverride.PrintEx(printer); printer.Println(); printer.Print("selectedCompiler = "); SelectedCompiler.PrintEx(printer); printer.Println(); printer.Print("disassemblyTimeoutSeconds = "); DisassemblyTimeoutSeconds.PrintEx(printer); printer.Println(); + printer.Print("useCustomRuntime = "); UseCustomRuntime.PrintEx(printer); printer.Println(); + printer.Print("pathToLocalCoreClr = "); PathToLocalCoreClr.PrintEx(printer); printer.Println(); } printer.Print(")"); } diff --git a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitCodegenProvider.cs b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitCodegenProvider.cs index 7ad6f0c..77cfe65 100644 --- a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitCodegenProvider.cs +++ b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitCodegenProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using JetBrains.Core; @@ -276,7 +277,9 @@ private async Task> GetJitCodegenInternalAsync(D if (!runtimePackPath.Succeed) return Result.FailWithValue(new Error(AsmViewerErrorCode.RuntimePackNotFound, runtimePackPath.FailMessage)); - executable = Path.Combine(configuration.PathToLocalCoreClr, "dotnet.cmd"); + var dotnetScript = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + ? "dotnet.cmd" : "dotnet.sh"; + executable = Path.Combine(configuration.PathToLocalCoreClr, dotnetScript); command = $"{Path.Combine(pathToCoreClrChecked.Value, "crossgen2", "crossgen2.dll")} --out aot "; foreach (var envVar in envVars) @@ -476,7 +479,7 @@ private async Task> GetJitCodegenInternalAsync(D if (!pathToCoreClrChecked.Succeed) return Result.FailWithValue(new Error(AsmViewerErrorCode.CoreClrCheckedNotFound, pathToCoreClrChecked.FailMessage)); - executable = Path.Combine(pathToCoreClrChecked.Value, "CoreRun.exe"); + executable = Path.Combine(pathToCoreClrChecked.Value, JitPathUtils.CoreRunExecutable); } if ((configuration.RunAppMode) && diff --git a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitPathUtils.cs b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitPathUtils.cs index 9cfd02c..4cb774c 100644 --- a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitPathUtils.cs +++ b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/JitPathUtils.cs @@ -1,32 +1,43 @@ using System.IO; using System.Linq; +using System.Runtime.InteropServices; using JetBrains.Core; namespace ReSharperPlugin.DotNetDisassembler.JitDisasm; public class JitPathUtils { + private static readonly string OsPrefix = + RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "osx" : + RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? "linux" : "windows"; + + private static readonly string CoreRunExecutableName = + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "CoreRun.exe" : "corerun"; + + public static string CoreRunExecutable => CoreRunExecutableName; + public static Result GetPathToRuntimePack(string pathToLocalCoreClr, string arch) { var result = GetPathToCoreClrChecked(pathToLocalCoreClr, arch); if (!result.Succeed) return Result.Fail(result.FailMessage); - string runtimePacksPath = Path.Combine(pathToLocalCoreClr, @"artifacts\bin\runtime"); + string runtimePacksPath = Path.Combine(pathToLocalCoreClr, "artifacts", "bin", "runtime"); string runtimePackPath = null; if (Directory.Exists(runtimePacksPath)) { - var packs = Directory.GetDirectories(runtimePacksPath, "*-windows-Release-" + arch); + var packs = Directory.GetDirectories(runtimePacksPath, $"*-{OsPrefix}-Release-{arch}"); runtimePackPath = packs.OrderByDescending(i => i).FirstOrDefault(); } if (!Directory.Exists(runtimePackPath)) { + var buildCmd = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "build.cmd" : "./build.sh"; var msg = $""" Please, build a runtime-pack in your local repo: - Run 'build.cmd Clr+Clr.Aot+Libs -c Release -a {arch}' in the repo root + Run '{buildCmd} Clr+Clr.Aot+Libs -c Release -a {arch}' in the repo root Don't worry, you won't have to re-build it every time you change something in jit, vm or corelib. """; return Result.Fail(msg); @@ -37,13 +48,14 @@ public static Result GetPathToRuntimePack(string pathToLocalCoreClr, str public static Result GetPathToCoreClrChecked(JitDisasmConfiguration configuration) => GetPathToCoreClrChecked(configuration.PathToLocalCoreClr, configuration.Arch, configuration.CrossgenIsSelected); - + public static Result GetPathToCoreClrChecked(string pathToLocalCoreClr, string arch, bool isCrossgenSelected = false) { var clrCheckedFilesDir = FindJitDirectory(pathToLocalCoreClr, arch); if (string.IsNullOrWhiteSpace(clrCheckedFilesDir)) { + var buildCmd = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "build.cmd" : "./build.sh"; var msg = $""" Path to a local dotnet/runtime repository is either not set or it's not built for {arch} arch yet @@ -53,7 +65,7 @@ public static Result GetPathToCoreClrChecked(string pathToLocalCoreClr, \nPlease clone it and build it in `Checked` mode, e.g.:\n\n git clone git@github.com:dotnet/runtime.git\n cd runtime\n - build.cmd Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch}\n\n + {buildCmd} Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch}\n\n """; return Result.Fail(msg); } @@ -61,13 +73,23 @@ build.cmd Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch}\n\n return Result.Success(clrCheckedFilesDir); } - public static Result GetPathToCoreClrCheckedForNativeAot(string pathToLocalCoreClr, string arch) { - var releaseFolder = Path.Combine(pathToLocalCoreClr, "artifacts", "bin", "coreclr", $"windows.{arch}.Checked"); - if (!Directory.Exists(releaseFolder) || !Directory.Exists(Path.Combine(releaseFolder, "aotsdk")) || - !Directory.Exists(Path.Combine(releaseFolder, "ilc"))) + string releaseFolder = null; + foreach (var config in new[] { "Checked", "Debug" }) { + var candidate = Path.Combine(pathToLocalCoreClr, "artifacts", "bin", "coreclr", $"{OsPrefix}.{arch}.{config}"); + if (Directory.Exists(candidate) && Directory.Exists(Path.Combine(candidate, "aotsdk")) && + Directory.Exists(Path.Combine(candidate, "ilc"))) + { + releaseFolder = candidate; + break; + } + } + + if (releaseFolder == null) + { + var buildCmd = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "build.cmd" : "./build.sh"; var msg = $""" Path to a local dotnet/runtime repository is either not set or it's not correctly built for {arch} arch yet for NativeAOT @@ -75,7 +97,7 @@ public static Result GetPathToCoreClrCheckedForNativeAot(string pathToLo git clone git@github.com:dotnet/runtime.git cd runtime - build.cmd Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch} + {buildCmd} Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch} """; return Result.Fail(msg); } @@ -85,17 +107,13 @@ build.cmd Clr+Clr.Aot+Libs -c Release -rc Checked -a {arch} public static string FindJitDirectory(string basePath, string arch) { - string jitDir = Path.Combine(basePath, $@"artifacts\bin\coreclr\windows.{arch}.Checked"); + string jitDir = Path.Combine(basePath, "artifacts", "bin", "coreclr", $"{OsPrefix}.{arch}.Checked"); if (Directory.Exists(jitDir)) - { return jitDir; - } - jitDir = Path.Combine(basePath, $@"artifacts\bin\coreclr\windows.{arch}.Debug"); + jitDir = Path.Combine(basePath, "artifacts", "bin", "coreclr", $"{OsPrefix}.{arch}.Debug"); if (Directory.Exists(jitDir)) - { return jitDir; - } return null; } @@ -122,4 +140,4 @@ public static void CopyDirectory(string sourceDir, string destinationDir) CopyDirectory(subDir.FullName, newDestinationDir); } } -} \ No newline at end of file +} diff --git a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasmAdapters/JitDisasmConfigurationFactory.cs b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasmAdapters/JitDisasmConfigurationFactory.cs index becc4fd..d763502 100644 --- a/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasmAdapters/JitDisasmConfigurationFactory.cs +++ b/src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasmAdapters/JitDisasmConfigurationFactory.cs @@ -27,12 +27,12 @@ public static JitDisasmConfiguration Create(JitConfiguration config) // Advanced properties use defaults (not exposed in UI) UseUnloadableContext = false, JitDumpInsteadOfDisasm = false, - UseCustomRuntime = false, + UseCustomRuntime = config.UseCustomRuntime, FgEnable = false, CustomEnvVars = null, Crossgen2Args = null, IlcArgs = null, - PathToLocalCoreClr = null, + PathToLocalCoreClr = config.PathToLocalCoreClr, OverridenJitDisasm = null, DontGuessTfm = false, Arch = RuntimePlatformUtils.GetCurrentArch() diff --git a/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerModel.Generated.kt b/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerModel.Generated.kt index be2db23..9020066 100644 --- a/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerModel.Generated.kt +++ b/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerModel.Generated.kt @@ -16,7 +16,7 @@ import kotlin.jvm.JvmStatic /** - * #### Generated from [AsmViewerModel.kt:8] + * #### Generated from [AsmViewerModel.kt:7] */ class AsmViewerModel private constructor( private val _show: RdSignal, @@ -44,7 +44,7 @@ class AsmViewerModel private constructor( - const val serializationHash = -8744739113612796705L + const val serializationHash = 4503471233995481963L } override val serializersOwner: ISerializersOwner get() = AsmViewerModel @@ -125,7 +125,7 @@ val Solution.asmViewerModel get() = getOrCreateExtension("asmViewerModel", ::Asm /** - * #### Generated from [AsmViewerModel.kt:70] + * #### Generated from [AsmViewerModel.kt:72] */ data class CompilationResult ( val content: String?, @@ -340,7 +340,9 @@ data class JitConfiguration ( val useDotnetBuildForReload: Boolean, val targetFrameworkOverride: String?, val selectedCompiler: CompilerType, - val disassemblyTimeoutSeconds: Int + val disassemblyTimeoutSeconds: Int, + val useCustomRuntime: Boolean, + val pathToLocalCoreClr: String? ) : IPrintable { //companion @@ -361,7 +363,9 @@ data class JitConfiguration ( val targetFrameworkOverride = buffer.readNullable { buffer.readString() } val selectedCompiler = buffer.readEnum() val disassemblyTimeoutSeconds = buffer.readInt() - return JitConfiguration(showAsmComments, diffable, useTieredJit, usePGO, runAppMode, useNoRestoreFlag, useDotnetPublishForReload, useDotnetBuildForReload, targetFrameworkOverride, selectedCompiler, disassemblyTimeoutSeconds) + val useCustomRuntime = buffer.readBool() + val pathToLocalCoreClr = buffer.readNullable { buffer.readString() } + return JitConfiguration(showAsmComments, diffable, useTieredJit, usePGO, runAppMode, useNoRestoreFlag, useDotnetPublishForReload, useDotnetBuildForReload, targetFrameworkOverride, selectedCompiler, disassemblyTimeoutSeconds, useCustomRuntime, pathToLocalCoreClr) } override fun write(ctx: SerializationCtx, buffer: AbstractBuffer, value: JitConfiguration) { @@ -376,6 +380,8 @@ data class JitConfiguration ( buffer.writeNullable(value.targetFrameworkOverride) { buffer.writeString(it) } buffer.writeEnum(value.selectedCompiler) buffer.writeInt(value.disassemblyTimeoutSeconds) + buffer.writeBool(value.useCustomRuntime) + buffer.writeNullable(value.pathToLocalCoreClr) { buffer.writeString(it) } } @@ -402,6 +408,8 @@ data class JitConfiguration ( if (targetFrameworkOverride != other.targetFrameworkOverride) return false if (selectedCompiler != other.selectedCompiler) return false if (disassemblyTimeoutSeconds != other.disassemblyTimeoutSeconds) return false + if (useCustomRuntime != other.useCustomRuntime) return false + if (pathToLocalCoreClr != other.pathToLocalCoreClr) return false return true } @@ -419,6 +427,8 @@ data class JitConfiguration ( __r = __r*31 + if (targetFrameworkOverride != null) targetFrameworkOverride.hashCode() else 0 __r = __r*31 + selectedCompiler.hashCode() __r = __r*31 + disassemblyTimeoutSeconds.hashCode() + __r = __r*31 + useCustomRuntime.hashCode() + __r = __r*31 + if (pathToLocalCoreClr != null) pathToLocalCoreClr.hashCode() else 0 return __r } //pretty print @@ -436,6 +446,8 @@ data class JitConfiguration ( print("targetFrameworkOverride = "); targetFrameworkOverride.print(printer); println() print("selectedCompiler = "); selectedCompiler.print(printer); println() print("disassemblyTimeoutSeconds = "); disassemblyTimeoutSeconds.print(printer); println() + print("useCustomRuntime = "); useCustomRuntime.print(printer); println() + print("pathToLocalCoreClr = "); pathToLocalCoreClr.print(printer); println() } printer.print(")") } diff --git a/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerSettings.kt b/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerSettings.kt index 09d8c07..a178715 100644 --- a/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerSettings.kt +++ b/src/rider/main/kotlin/com/jetbrains/rider/plugins/dotnetdisassembler/AsmViewerSettings.kt @@ -21,6 +21,8 @@ class JitConfigurationState : BaseState() { var targetFrameworkOverride by string(null) var selectedCompiler by enum(CompilerType.Clrjit) var disassemblyTimeoutSeconds by property(120) + var useCustomRuntime by property(false) + var pathToLocalCoreClr by string(null) } @Service(Service.Level.PROJECT) @@ -60,7 +62,9 @@ class AsmViewerSettings : SimplePersistentStateComponentWarning: may take a long time or hang if the application waits for input. runtime.timeout.label=Timeout (seconds):
Generated from: AsmViewerModel.kt:8
Generated from: AsmViewerModel.kt:7
Generated from: AsmViewerModel.kt:70
Generated from: AsmViewerModel.kt:72