From 00bb520b52baa03ebd784542d5ebdb01efc82881 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 10 Aug 2023 22:17:02 -0400 Subject: [PATCH] Use out-of-process disassembler with in-process toolchains when possible. --- .../Disassemblers/DisassemblyDiagnoser.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs b/src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs index 2c6eb62f79..32abff3a2f 100644 --- a/src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs +++ b/src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs @@ -14,6 +14,8 @@ using BenchmarkDotNet.Portability; using BenchmarkDotNet.Reports; using BenchmarkDotNet.Running; +using BenchmarkDotNet.Toolchains; +using BenchmarkDotNet.Toolchains.InProcess.Emit; using BenchmarkDotNet.Toolchains.InProcess.NoEmit; using BenchmarkDotNet.Validators; @@ -71,6 +73,11 @@ public void Handle(HostSignal signal, DiagnoserActionParameters parameters) switch (signal) { + case HostSignal.AfterAll when benchmark.GetToolchain().IsInProcess: + if (!IsOutOfProcessDisassemblerSupportedForCurrentPlatform()) + throw new PlatformNotSupportedException("The current platform does not support disassembling in-process."); + results.Add(benchmark, windowsDifferentArchitectureDisassembler.Disassemble(parameters)); + break; case HostSignal.AfterAll when ShouldUseSameArchitectureDisassembler(benchmark, parameters): results.Add(benchmark, sameArchitectureDisassembler.Disassemble(parameters)); break; @@ -100,9 +107,16 @@ public IEnumerable Validate(ValidationParameters validationPara foreach (var benchmark in validationParameters.Benchmarks) { - if (benchmark.Job.Infrastructure.TryGetToolchain(out var toolchain) && toolchain is InProcessNoEmitToolchain) + if (benchmark.Job.Infrastructure.TryGetToolchain(out var toolchain) && toolchain.IsInProcess) { - yield return new ValidationError(true, "InProcessToolchain has no DisassemblyDiagnoser support", benchmark); + if (toolchain is InProcessNoEmitToolchain) + { + yield return new ValidationError(true, "InProcessNoEmitToolchain has no DisassemblyDiagnoser support", benchmark); + } + if (toolchain is InProcessEmitToolchain && !IsOutOfProcessDisassemblerSupportedForCurrentPlatform()) + { + yield return new ValidationError(true, "InProcessEmitToolchain has no DisassemblyDiagnoser support on this platform", benchmark); + } } else if (benchmark.Job.IsNativeAOT()) { @@ -155,6 +169,11 @@ private static bool ShouldUseSameArchitectureDisassembler(BenchmarkCase benchmar return false; } + private static bool IsOutOfProcessDisassemblerSupportedForCurrentPlatform() + => RuntimeInformation.IsWindows() + && RuntimeInformation.GetCurrentPlatform() is Platform.X64 or Platform.X86 + && !RuntimeInformation.IsMono && !RuntimeInformation.IsWasm && !RuntimeInformation.IsAot; + private static IEnumerable GetExporters(Dictionary results, DisassemblyDiagnoserConfig config) { if (config.ExportGithubMarkdown)