Skip to content

Commit

Permalink
Use out-of-process disassembler with in-process toolchains when possi…
Browse files Browse the repository at this point in the history
…ble.
  • Loading branch information
timcassell committed Aug 11, 2023
1 parent d058c7b commit 1d00b95
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using BenchmarkDotNet.Portability;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains;
using BenchmarkDotNet.Toolchains.InProcess.NoEmit;
using BenchmarkDotNet.Validators;

Expand Down Expand Up @@ -71,6 +72,9 @@ public void Handle(HostSignal signal, DiagnoserActionParameters parameters)

switch (signal)
{
case HostSignal.AfterAll when benchmark.GetToolchain().IsInProcess:
results.Add(benchmark, windowsDifferentArchitectureDisassembler.Disassemble(parameters));
break;
case HostSignal.AfterAll when ShouldUseSameArchitectureDisassembler(benchmark, parameters):
results.Add(benchmark, sameArchitectureDisassembler.Disassemble(parameters));
break;
Expand Down Expand Up @@ -100,9 +104,9 @@ public IEnumerable<ValidationError> 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 && IsOutOfProcessDisassemblerSupportedForCurrentPlatform())
{
yield return new ValidationError(true, "InProcessToolchain has no DisassemblyDiagnoser support", benchmark);
yield return new ValidationError(true, "InProcess toolchain has no DisassemblyDiagnoser support on this platform", benchmark);
}
else if (benchmark.Job.IsNativeAOT())
{
Expand Down Expand Up @@ -155,6 +159,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<IExporter> GetExporters(Dictionary<BenchmarkCase, DisassemblyResult> results, DisassemblyDiagnoserConfig config)
{
if (config.ExportGithubMarkdown)
Expand Down

0 comments on commit 1d00b95

Please sign in to comment.