diff --git a/BenchmarkDotNet.sln b/BenchmarkDotNet.sln
index 1df6c0aabd..ad1cb3e28e 100644
--- a/BenchmarkDotNet.sln
+++ b/BenchmarkDotNet.sln
@@ -33,10 +33,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Integration
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.IntegrationTests.ConfigPerAssembly", "tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj", "{043F1DA4-CD51-45FD-805E-6571D67AA661}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Disassembler.x64", "src\BenchmarkDotNet.Disassembler.x64\BenchmarkDotNet.Disassembler.x64.csproj", "{E5A0833C-B633-4D62-B645-A927CEBFEEBB}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.Disassembler.x86", "src\BenchmarkDotNet.Disassembler.x86\BenchmarkDotNet.Disassembler.x86.csproj", "{D189AAB3-46B4-4437-8E9C-72F021AB2B6E}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.IntegrationTests.ManualRunning", "tests\BenchmarkDotNet.IntegrationTests.ManualRunning\BenchmarkDotNet.IntegrationTests.ManualRunning.csproj", "{9816D316-95C4-42E6-9E7B-A256C7E5D4BF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkDotNet.IntegrationTests.Static", "tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj", "{B4405781-40D3-42B8-B168-00E711FABA15}"
@@ -59,6 +55,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchmarkDotNet.Exporters.P
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchmarkDotNet.Exporters.Plotting.Tests", "tests\BenchmarkDotNet.Exporters.Plotting.Tests\BenchmarkDotNet.Exporters.Plotting.Tests.csproj", "{199AC83E-30BD-40CD-87CE-0C838AC0320D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchmarkDotNet.Disassembler", "src\BenchmarkDotNet.Disassembler\BenchmarkDotNet.Disassembler.csproj", "{86DB5A20-73FA-DB96-1545-08FE5878637C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -113,14 +111,6 @@ Global
{043F1DA4-CD51-45FD-805E-6571D67AA661}.Debug|Any CPU.Build.0 = Debug|Any CPU
{043F1DA4-CD51-45FD-805E-6571D67AA661}.Release|Any CPU.ActiveCfg = Release|Any CPU
{043F1DA4-CD51-45FD-805E-6571D67AA661}.Release|Any CPU.Build.0 = Release|Any CPU
- {E5A0833C-B633-4D62-B645-A927CEBFEEBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E5A0833C-B633-4D62-B645-A927CEBFEEBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E5A0833C-B633-4D62-B645-A927CEBFEEBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E5A0833C-B633-4D62-B645-A927CEBFEEBB}.Release|Any CPU.Build.0 = Release|Any CPU
- {D189AAB3-46B4-4437-8E9C-72F021AB2B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D189AAB3-46B4-4437-8E9C-72F021AB2B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D189AAB3-46B4-4437-8E9C-72F021AB2B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D189AAB3-46B4-4437-8E9C-72F021AB2B6E}.Release|Any CPU.Build.0 = Release|Any CPU
{9816D316-95C4-42E6-9E7B-A256C7E5D4BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9816D316-95C4-42E6-9E7B-A256C7E5D4BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9816D316-95C4-42E6-9E7B-A256C7E5D4BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -161,6 +151,10 @@ Global
{199AC83E-30BD-40CD-87CE-0C838AC0320D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{199AC83E-30BD-40CD-87CE-0C838AC0320D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{199AC83E-30BD-40CD-87CE-0C838AC0320D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {86DB5A20-73FA-DB96-1545-08FE5878637C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {86DB5A20-73FA-DB96-1545-08FE5878637C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {86DB5A20-73FA-DB96-1545-08FE5878637C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {86DB5A20-73FA-DB96-1545-08FE5878637C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -178,8 +172,6 @@ Global
{45FE17A7-0E04-48C0-8CDC-493CDA449F7A} = {14195214-591A-45B7-851A-19D3BA2413F9}
{6A3CBB07-E337-488E-BDAC-ED96AF8ED608} = {14195214-591A-45B7-851A-19D3BA2413F9}
{043F1DA4-CD51-45FD-805E-6571D67AA661} = {14195214-591A-45B7-851A-19D3BA2413F9}
- {E5A0833C-B633-4D62-B645-A927CEBFEEBB} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
- {D189AAB3-46B4-4437-8E9C-72F021AB2B6E} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
{9816D316-95C4-42E6-9E7B-A256C7E5D4BF} = {14195214-591A-45B7-851A-19D3BA2413F9}
{B4405781-40D3-42B8-B168-00E711FABA15} = {14195214-591A-45B7-851A-19D3BA2413F9}
{D9F5065B-6190-431B-850C-117E3D64AB33} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
@@ -190,6 +182,7 @@ Global
{2E2283A3-6DA6-4482-8518-99D6D9F689AB} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
{B92ECCEF-7C27-4012-9E19-679F3C40A6A6} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
{199AC83E-30BD-40CD-87CE-0C838AC0320D} = {14195214-591A-45B7-851A-19D3BA2413F9}
+ {86DB5A20-73FA-DB96-1545-08FE5878637C} = {D6597E3A-6892-4A68-8E14-042FC941FDA2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4D9AF12B-1F7F-45A7-9E8C-E4E46ADCBD1F}
diff --git a/src/BenchmarkDotNet.Disassembler.x64/BenchmarkDotNet.Disassembler.x64.csproj b/src/BenchmarkDotNet.Disassembler.x64/BenchmarkDotNet.Disassembler.x64.csproj
deleted file mode 100644
index 2f15efcc13..0000000000
--- a/src/BenchmarkDotNet.Disassembler.x64/BenchmarkDotNet.Disassembler.x64.csproj
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- net462
- Exe
- BenchmarkDotNet.Disassembler.x64
- BenchmarkDotNet.Disassembler.x64
- win7-x64
- x64
- True
- $(DefineConstants);CLRMDV1
-
-
- ..\BenchmarkDotNet\Disassemblers
- BenchmarkDotNet.Disassembler
-
-
-
-
-
-
diff --git a/src/BenchmarkDotNet.Disassembler.x64/ClrMdV1Disassembler.cs b/src/BenchmarkDotNet.Disassembler.x64/ClrMdV1Disassembler.cs
deleted file mode 100644
index 734aa470e4..0000000000
--- a/src/BenchmarkDotNet.Disassembler.x64/ClrMdV1Disassembler.cs
+++ /dev/null
@@ -1,308 +0,0 @@
-using Iced.Intel;
-using Microsoft.Diagnostics.Runtime;
-using Microsoft.Diagnostics.Runtime.Interop;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.RegularExpressions;
-
-namespace BenchmarkDotNet.Disassemblers
-{
- // This Disassembler uses ClrMd v1x. Please keep it in sync with ClrMdV2Disassembler (if possible).
- internal static class ClrMdV1Disassembler
- {
- internal static DisassemblyResult AttachAndDisassemble(Settings settings)
- {
- using (var dataTarget = DataTarget.AttachToProcess(
- settings.ProcessId,
- (uint)TimeSpan.FromSeconds(5).TotalMilliseconds,
- AttachFlag.Passive))
- {
- var runtime = dataTarget.ClrVersions.Single().CreateRuntime();
-
- // Per https://github.com/microsoft/clrmd/issues/303
- dataTarget.DataReader.Flush();
-
- ConfigureSymbols(dataTarget);
-
- var state = new State(runtime, settings.TargetFrameworkMoniker);
-
- if (settings.Filters.Length > 0)
- {
- FilterAndEnqueue(state, settings);
- }
- else
- {
- var typeWithBenchmark = state.Runtime.Heap.GetTypeByName(settings.TypeName);
-
- state.Todo.Enqueue(
- new MethodInfo(
- // the Disassembler Entry Method is always parameterless, so check by name is enough
- typeWithBenchmark.Methods.Single(method => method.IsPublic && method.Name == settings.MethodName),
- 0));
- }
-
- var disassembledMethods = Disassemble(settings, state);
-
- // we don't want to export the disassembler entry point method which is just an artificial method added to get generic types working
- var filteredMethods = disassembledMethods.Length == 1
- ? disassembledMethods // if there is only one method we want to return it (most probably benchmark got inlined)
- : disassembledMethods.Where(method => !method.Name.Contains(DisassemblerConstants.DisassemblerEntryMethodName)).ToArray();
-
- return new DisassemblyResult
- {
- Methods = filteredMethods,
- SerializedAddressToNameMapping = state.AddressToNameMapping.Select(x => new DisassemblyResult.MutablePair { Key = x.Key, Value = x.Value }).ToArray(),
- PointerSize = (uint)IntPtr.Size
- };
- }
- }
-
- private static void ConfigureSymbols(DataTarget dataTarget)
- {
- // code copied from https://github.com/Microsoft/clrmd/issues/34#issuecomment-161926535
- var symbols = dataTarget.DebuggerInterface as IDebugSymbols;
- symbols?.SetSymbolPath("http://msdl.microsoft.com/download/symbols");
- var control = dataTarget.DebuggerInterface as IDebugControl;
- control?.Execute(DEBUG_OUTCTL.NOT_LOGGED, ".reload", DEBUG_EXECUTE.NOT_LOGGED);
- }
-
- private static void FilterAndEnqueue(State state, Settings settings)
- {
- Regex[] filters = settings.Filters
- .Select(pattern => new Regex(WildcardToRegex(pattern), RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)).ToArray();
-
- foreach (ClrModule module in state.Runtime.Modules)
- foreach (ClrType type in module.EnumerateTypes())
- foreach (ClrMethod method in type.Methods.Where(method => CanBeDisassembled(method) && method.GetFullSignature() != null))
- foreach (Regex filter in filters)
- {
- if (filter.IsMatch(method.GetFullSignature()))
- {
- state.Todo.Enqueue(new MethodInfo(method,
- depth: settings.MaxDepth)); // don't allow for recursive disassembling
- break;
- }
- }
- }
-
- // copied from GlobFilter type (this type must not reference BDN)
- private static string WildcardToRegex(string pattern) => $"^{Regex.Escape(pattern).Replace(@"\*", ".*").Replace(@"\?", ".")}$";
-
- private static DisassembledMethod[] Disassemble(Settings settings, State state)
- {
- var result = new List();
-
- using var sourceCodeProvider = new SourceCodeProvider();
- while (state.Todo.Count != 0)
- {
- var methodInfo = state.Todo.Dequeue();
-
- if (!state.HandledMethods.Add(methodInfo.Method)) // add it now to avoid StackOverflow for recursive methods
- continue; // already handled
-
- if (settings.MaxDepth >= methodInfo.Depth)
- result.Add(DisassembleMethod(methodInfo, state, settings, sourceCodeProvider));
- }
-
- return result.ToArray();
- }
-
- private static bool CanBeDisassembled(ClrMethod method)
- => !((method.ILOffsetMap is null || method.ILOffsetMap.Length == 0) && (method.HotColdInfo is null || method.HotColdInfo.HotStart == 0 || method.HotColdInfo.HotSize == 0));
-
- private static DisassembledMethod DisassembleMethod(MethodInfo methodInfo, State state, Settings settings, SourceCodeProvider sourceCodeProvider)
- {
- var method = methodInfo.Method;
-
- if (!CanBeDisassembled(method))
- {
- if (method.IsPInvoke)
- return CreateEmpty(method, "PInvoke method");
- if (method.IL is null || method.IL.Length == 0)
- return CreateEmpty(method, "Extern method");
- if (method.CompilationType == MethodCompilationType.None)
- return CreateEmpty(method, "Method was not JITted yet.");
-
- return CreateEmpty(method, $"No valid {nameof(method.ILOffsetMap)} and {nameof(method.HotColdInfo)}");
- }
-
- var codes = new List();
- if (settings.PrintSource && !(method.ILOffsetMap is null))
- {
- // we use HashSet to prevent from duplicates
- var uniqueSourceCodeLines = new HashSet(new SharpComparer());
- // for getting C# code we always use the original ILOffsetMap
- foreach (var map in method.ILOffsetMap.Where(map => map.StartAddress < map.EndAddress && map.ILOffset >= 0).OrderBy(map => map.StartAddress))
- foreach (var sharp in sourceCodeProvider.GetSource(method, map))
- uniqueSourceCodeLines.Add(sharp);
-
- codes.AddRange(uniqueSourceCodeLines);
- }
-
- // for getting ASM we try to use data from HotColdInfo if available (better for decoding)
- foreach (var map in GetCompleteNativeMap(method))
- codes.AddRange(Decode(map.StartAddress, (uint)(map.EndAddress - map.StartAddress), state, methodInfo.Depth, method));
-
- Map[] maps = settings.PrintSource
- ? codes.GroupBy(code => code.InstructionPointer).OrderBy(group => group.Key).Select(group => new Map() { SourceCodes = group.ToArray() }).ToArray()
- : new[] { new Map() { SourceCodes = codes.ToArray() } };
-
- return new DisassembledMethod
- {
- Maps = maps,
- Name = method.GetFullSignature(),
- NativeCode = method.NativeCode
- };
- }
-
- private static IEnumerable Decode(ulong startAddress, uint size, State state, int depth, ClrMethod currentMethod)
- {
- byte[] code = new byte[size];
- if (!state.Runtime.DataTarget.ReadProcessMemory(startAddress, code, code.Length, out int bytesRead) || bytesRead == 0)
- yield break;
-
- var reader = new ByteArrayCodeReader(code, 0, bytesRead);
- var decoder = Decoder.Create(state.Runtime.PointerSize * 8, reader);
- decoder.IP = startAddress;
-
- while (reader.CanReadByte)
- {
- decoder.Decode(out var instruction);
-
- TryTranslateAddressToName(instruction, state, depth, currentMethod, out ulong referencedAddress);
-
- yield return new IntelAsm
- {
- InstructionPointer = instruction.IP,
- InstructionLength = instruction.Length,
- Instruction = instruction,
- ReferencedAddress = (referencedAddress > ushort.MaxValue) ? referencedAddress : null,
- };
- }
- }
-
- private static void TryTranslateAddressToName(Instruction instruction, State state, int depth, ClrMethod currentMethod, out ulong address)
- {
- var runtime = state.Runtime;
-
- if (!TryGetReferencedAddress(instruction, (uint)runtime.PointerSize, out address))
- return;
-
- if (state.AddressToNameMapping.ContainsKey(address))
- return;
-
- var jitHelperFunctionName = runtime.GetJitHelperFunctionName(address);
- if (!string.IsNullOrEmpty(jitHelperFunctionName))
- {
- state.AddressToNameMapping.Add(address, jitHelperFunctionName);
- return;
- }
-
- var methodTableName = runtime.GetMethodTableName(address);
- if (!string.IsNullOrEmpty(methodTableName))
- {
- state.AddressToNameMapping.Add(address, $"MT_{methodTableName}");
- return;
- }
-
- var methodDescriptor = runtime.GetMethodByHandle(address);
- if (!(methodDescriptor is null))
- {
- state.AddressToNameMapping.Add(address, $"MD_{methodDescriptor.GetFullSignature()}");
- return;
- }
-
- var method = runtime.GetMethodByAddress(address);
- if (method is null && (address & ((uint)runtime.PointerSize - 1)) == 0)
- {
- if (runtime.ReadPointer(address, out ulong newAddress) && newAddress > ushort.MaxValue)
- method = runtime.GetMethodByAddress(newAddress);
- }
-
- if (method is null)
- return;
-
- if (method.NativeCode == currentMethod.NativeCode && method.GetFullSignature() == currentMethod.GetFullSignature())
- return; // in case of a call which is just a jump within the method or a recursive call
-
- if (!state.HandledMethods.Contains(method))
- state.Todo.Enqueue(new MethodInfo(method, depth + 1));
-
- var methodName = method.GetFullSignature();
- if (!methodName.Any(c => c == '.')) // the method name does not contain namespace and type name
- methodName = $"{method.Type.Name}.{method.GetFullSignature()}";
- state.AddressToNameMapping.Add(address, methodName);
- }
-
- internal static bool TryGetReferencedAddress(Instruction instruction, uint pointerSize, out ulong referencedAddress)
- {
- for (int i = 0; i < instruction.OpCount; i++)
- {
- switch (instruction.GetOpKind(i))
- {
- case OpKind.NearBranch16:
- case OpKind.NearBranch32:
- case OpKind.NearBranch64:
- referencedAddress = instruction.NearBranchTarget;
- return referencedAddress > ushort.MaxValue;
- case OpKind.Immediate16:
- case OpKind.Immediate8to16:
- case OpKind.Immediate8to32:
- case OpKind.Immediate8to64:
- case OpKind.Immediate32to64:
- case OpKind.Immediate32 when pointerSize == 4:
- case OpKind.Immediate64:
- referencedAddress = instruction.GetImmediate(i);
- return referencedAddress > ushort.MaxValue;
- case OpKind.Memory when instruction.IsIPRelativeMemoryOperand:
- referencedAddress = instruction.IPRelativeMemoryAddress;
- return referencedAddress > ushort.MaxValue;
- case OpKind.Memory:
- referencedAddress = instruction.MemoryDisplacement64;
- return referencedAddress > ushort.MaxValue;
- }
- }
-
- referencedAddress = default;
- return false;
- }
-
- private static ILToNativeMap[] GetCompleteNativeMap(ClrMethod method)
- {
- // it's better to use one single map rather than few small ones
- // it's simply easier to get next instruction when decoding ;)
- var hotColdInfo = method.HotColdInfo;
- if (!(hotColdInfo is null) && hotColdInfo.HotSize > 0 && hotColdInfo.HotStart > 0)
- {
- return hotColdInfo.ColdSize <= 0
- ? new[] { new ILToNativeMap() { StartAddress = hotColdInfo.HotStart, EndAddress = hotColdInfo.HotStart + hotColdInfo.HotSize, ILOffset = -1 } }
- : new[]
- {
- new ILToNativeMap() { StartAddress = hotColdInfo.HotStart, EndAddress = hotColdInfo.HotStart + hotColdInfo.HotSize, ILOffset = -1 },
- new ILToNativeMap() { StartAddress = hotColdInfo.ColdStart, EndAddress = hotColdInfo.ColdStart + hotColdInfo.ColdSize, ILOffset = -1 }
- };
- }
-
- return method.ILOffsetMap
- .Where(map => map.StartAddress < map.EndAddress) // some maps have 0 length?
- .OrderBy(map => map.StartAddress) // we need to print in the machine code order, not IL! #536
- .ToArray();
- }
-
- private static DisassembledMethod CreateEmpty(ClrMethod method, string reason)
- => DisassembledMethod.Empty(method.GetFullSignature(), method.NativeCode, reason);
-
- private class SharpComparer : IEqualityComparer
- {
- public bool Equals(Sharp x, Sharp y)
- {
- // sometimes some C# code lines are duplicated because the same line is the best match for multiple ILToNativeMaps
- // we don't want to confuse the users, so this must also be removed
- return x.FilePath == y.FilePath && x.LineNumber == y.LineNumber;
- }
-
- public int GetHashCode(Sharp obj) => obj.FilePath.GetHashCode() ^ obj.LineNumber;
- }
- }
-}
diff --git a/src/BenchmarkDotNet.Disassembler.x64/DataContracts.cs b/src/BenchmarkDotNet.Disassembler.x64/DataContracts.cs
deleted file mode 100644
index f088430970..0000000000
--- a/src/BenchmarkDotNet.Disassembler.x64/DataContracts.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-using Iced.Intel;
-using Microsoft.Diagnostics.Runtime;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Xml.Serialization;
-
-#pragma warning disable CS3001 // Argument type 'ulong' is not CLS-compliant
-#pragma warning disable CS3003 // Type is not CLS-compliant
-#pragma warning disable CS1591 // XML comments for public types...
-namespace BenchmarkDotNet.Disassemblers
-{
- public abstract class SourceCode
- {
- public ulong InstructionPointer { get; set; }
- }
-
- public class Sharp : SourceCode
- {
- public string Text { get; set; }
- public string FilePath { get; set; }
- public int LineNumber { get; set; }
- }
-
- public abstract class Asm : SourceCode
- {
- public int InstructionLength { get; set; }
- public ulong? ReferencedAddress { get; set; }
- public bool IsReferencedAddressIndirect { get; set; }
- }
-
- public class IntelAsm : Asm
- {
- public Instruction Instruction { get; set; }
-
- public override string ToString() => Instruction.ToString();
- }
-
- public class Arm64Asm : Asm
- {
-#if !CLRMDV1 // don't include it in ClrMD V1 disassembler that supports only x86 and x64
- public Gee.External.Capstone.Arm64.Arm64Instruction Instruction { get; set; }
-
- public override string ToString() => Instruction.ToString();
-#endif
- }
-
- public class MonoCode : SourceCode
- {
- public string Text { get; set; }
- }
-
- public class Map
- {
- [XmlArray("Instructions")]
- [XmlArrayItem(nameof(SourceCode), typeof(SourceCode))]
- [XmlArrayItem(nameof(Sharp), typeof(Sharp))]
- [XmlArrayItem(nameof(IntelAsm), typeof(IntelAsm))]
- public SourceCode[] SourceCodes { get; set; }
- }
-
- public class DisassembledMethod
- {
- public string Name { get; set; }
-
- public ulong NativeCode { get; set; }
-
- public string Problem { get; set; }
-
- public Map[] Maps { get; set; }
-
- public string CommandLine { get; set; }
-
- public static DisassembledMethod Empty(string fullSignature, ulong nativeCode, string problem)
- => new DisassembledMethod
- {
- Name = fullSignature,
- NativeCode = nativeCode,
- Maps = Array.Empty