protected abstract ILProvider GetILProvider();
+ public abstract CompilationBuilder UseJitPath(string jitPath);
+
protected DependencyAnalyzerBase<NodeFactory> CreateDependencyGraph(NodeFactory factory, IComparer<DependencyNodeCore<NodeFactory>> comparer = null)
{
return _dependencyTrackingLevel.CreateDependencyGraph(factory, comparer);
ARM = 0x01c4,
}
+ private const string JitLibrary = "clrjitilc";
+
#if SUPPORT_JIT
private const string JitSupportLibrary = "*";
#else
private static bool s_jitRegistered = RegisterJITModule();
- [DllImport("clrjitilc")]
+ [DllImport(JitLibrary)]
private extern static IntPtr PAL_RegisterModule([MarshalAs(UnmanagedType.LPUTF8Str)] string moduleName);
- [DllImport("clrjitilc", CallingConvention=CallingConvention.StdCall)] // stdcall in CoreCLR!
+ [DllImport(JitLibrary, CallingConvention=CallingConvention.StdCall)] // stdcall in CoreCLR!
private extern static IntPtr jitStartup(IntPtr host);
- [DllImport("clrjitilc", CallingConvention=CallingConvention.StdCall)]
+ [DllImport(JitLibrary, CallingConvention=CallingConvention.StdCall)]
private extern static IntPtr getJit();
[DllImport(JitSupportLibrary)]
}
}
+ private IntPtr JitLibraryResolver(string libraryName, System.Reflection.Assembly assembly, DllImportSearchPath? searchPath)
+ {
+ IntPtr libHandle = IntPtr.Zero;
+ if (libraryName == JitLibrary)
+ {
+ libHandle = NativeLibrary.Load(_jitConfig.JitPath, assembly, searchPath);
+ }
+ return libHandle;
+ }
+
public CorInfoImpl(JitConfigProvider jitConfig)
{
//
//
_jitConfig = jitConfig;
if (!s_jitRegistered)
+ {
throw new IOException("Failed to register JIT");
+ }
+
+ if (_jitConfig.JitPath != null)
+ {
+ NativeLibrary.SetDllImportResolver(typeof(CorInfoImpl).Assembly, JitLibraryResolver);
+ }
jitStartup(GetJitHost(_jitConfig.UnmanagedInstance));
get;
}
+ public string JitPath
+ {
+ get;
+ }
+
public IEnumerable<CorJitFlag> Flags => _jitFlags;
/// <summary>
/// Creates a new instance of <see cref="JitConfigProvider"/>.
/// </summary>
- /// <param name="parameters">Name-value pairs separated by an equals sign.</param>
- public JitConfigProvider(IEnumerable<CorJitFlag> jitFlags, IEnumerable<KeyValuePair<string, string>> parameters)
+ /// <param name="jitFlags">A collection of JIT compiler flags.</param>
+ /// <param name="parameters">A collection of parameter name/value pairs.</param>
+ /// <param name="jitPath">A path to the JIT library to be used (may be null).</param>
+ public JitConfigProvider(IEnumerable<CorJitFlag> jitFlags, IEnumerable<KeyValuePair<string, string>> parameters, string jitPath = null)
{
- foreach (var param in parameters)
- {
- _config[param.Key] = param.Value;
- }
-
ArrayBuilder<CorJitFlag> jitFlagBuilder = new ArrayBuilder<CorJitFlag>();
foreach (CorJitFlag jitFlag in jitFlags)
{
}
_jitFlags = jitFlagBuilder.ToArray();
+ foreach (var param in parameters)
+ {
+ _config[param.Key] = param.Value;
+ }
+
+ JitPath = jitPath;
UnmanagedInstance = CreateUnmanagedInstance();
}
private readonly EcmaModule _inputModule;
private readonly bool _ibcTuning;
private readonly bool _resilient;
+ private string _jitPath;
// These need to provide reasonable defaults so that the user can optionally skip
// calling the Use/Configure methods and still get something reasonable back.
public ReadyToRunCodegenCompilationBuilder(CompilerTypeSystemContext context, CompilationModuleGroup group, string inputFilePath, bool ibcTuning, bool resilient)
: base(context, group, new CoreRTNameMangler())
{
+ _inputFilePath = inputFilePath;
_ibcTuning = ibcTuning;
_resilient = resilient;
- _inputFilePath = inputFilePath;
_inputModule = context.GetModuleFromPath(_inputFilePath);
return _ilProvider;
}
+ public override CompilationBuilder UseJitPath(string jitPath)
+ {
+ _jitPath = jitPath;
+ return this;
+ }
+
public override ICompilation ToCompilation()
{
ModuleTokenResolver moduleTokenResolver = new ModuleTokenResolver(_compilationGroup, _context);
corJitFlags.Add(CorJitFlag.CORJIT_FLAG_BBINSTR);
corJitFlags.Add(CorJitFlag.CORJIT_FLAG_FEATURE_SIMD);
- var jitConfig = new JitConfigProvider(corJitFlags, _ryujitOptions);
+ var jitConfig = new JitConfigProvider(corJitFlags, _ryujitOptions, _jitPath);
return new ReadyToRunCodegenCompilation(
graph,
private string _targetArchitectureStr;
private TargetOS _targetOS;
private string _targetOSStr;
+ private string _jitPath;
private OptimizationMode _optimizationMode;
private string _systemModuleName = DefaultSystemModule;
private bool _tuning;
syntax.DefineOption("targetarch", ref _targetArchitectureStr, "Target architecture for cross compilation");
syntax.DefineOption("targetos", ref _targetOSStr, "Target OS for cross compilation");
+ syntax.DefineOption("jitpath", ref _jitPath, "Path to JIT compiler library");
syntax.DefineOption("singlemethodtypename", ref _singleMethodTypeName, "Single method compilation: name of the owning type");
syntax.DefineOption("singlemethodname", ref _singleMethodName, "Single method compilation: name of the method");
ILProvider ilProvider = new ReadyToRunILProvider();
-
DependencyTrackingLevel trackingLevel = _dgmlLogFileName == null ?
DependencyTrackingLevel.None : (_generateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First);
builder
.UseILProvider(ilProvider)
+ .UseJitPath(_jitPath)
.UseBackendOptions(_codegenOptions)
.UseLogger(logger)
.UseDependencyTracking(trackingLevel)