internal RyuJitCompilation( DependencyAnalyzerBase <NodeFactory> dependencyGraph, NodeFactory nodeFactory, IEnumerable <ICompilationRootProvider> roots, ILProvider ilProvider, DebugInformationProvider debugInformationProvider, Logger logger, DevirtualizationManager devirtualizationManager, IInliningPolicy inliningPolicy, InstructionSetSupport instructionSetSupport, ProfileDataManager profileDataManager, MethodImportationErrorProvider errorProvider, RyuJitCompilationOptions options, int parallelism) : base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, devirtualizationManager, inliningPolicy, logger) { _compilationOptions = options; _hardwareIntrinsicFlags = new ExternSymbolMappedField(nodeFactory.TypeSystemContext.GetWellKnownType(WellKnownType.Int32), "g_cpuFeatures"); InstructionSetSupport = instructionSetSupport; _instructionSetMap = new Dictionary <string, InstructionSet>(); foreach (var instructionSetInfo in InstructionSetFlags.ArchitectureToValidInstructionSets(TypeSystemContext.Target.Architecture)) { if (instructionSetInfo.ManagedName != "") { _instructionSetMap.Add(instructionSetInfo.ManagedName, instructionSetInfo.InstructionSet); } } _profileDataManager = profileDataManager; _methodImportationErrorProvider = errorProvider; _parallelism = parallelism; }
internal ReadyToRunCodegenCompilation( DependencyAnalyzerBase <NodeFactory> dependencyGraph, NodeFactory nodeFactory, IEnumerable <ICompilationRootProvider> roots, ILProvider ilProvider, Logger logger, DevirtualizationManager devirtualizationManager, IEnumerable <string> inputFiles, string compositeRootPath, InstructionSetSupport instructionSetSupport, bool resilient, bool generateMapFile, bool generateMapCsvFile, bool generatePdbFile, string pdbPath, bool generatePerfMapFile, string perfMapPath, int parallelism, ProfileDataManager profileData, ReadyToRunMethodLayoutAlgorithm methodLayoutAlgorithm, ReadyToRunFileLayoutAlgorithm fileLayoutAlgorithm, int customPESectionAlignment, bool verifyTypeAndFieldLayout) : base( dependencyGraph, nodeFactory, roots, ilProvider, devirtualizationManager, modulesBeingInstrumented: nodeFactory.CompilationModuleGroup.CompilationModuleSet, logger, instructionSetSupport) { _resilient = resilient; _parallelism = parallelism; _generateMapFile = generateMapFile; _generateMapCsvFile = generateMapCsvFile; _generatePdbFile = generatePdbFile; _pdbPath = pdbPath; _generatePerfMapFile = generatePerfMapFile; _perfMapPath = perfMapPath; _customPESectionAlignment = customPESectionAlignment; SymbolNodeFactory = new ReadyToRunSymbolNodeFactory(nodeFactory, verifyTypeAndFieldLayout); _corInfoImpls = new ConditionalWeakTable <Thread, CorInfoImpl>(); _inputFiles = inputFiles; _compositeRootPath = compositeRootPath; CompilationModuleGroup = (ReadyToRunCompilationModuleGroupBase)nodeFactory.CompilationModuleGroup; // Generate baseline support specification for InstructionSetSupport. This will prevent usage of the generated // code if the runtime environment doesn't support the specified instruction set string instructionSetSupportString = ReadyToRunInstructionSetSupportSignature.ToInstructionSetSupportString(instructionSetSupport); ReadyToRunInstructionSetSupportSignature instructionSetSupportSig = new ReadyToRunInstructionSetSupportSignature(instructionSetSupportString); _dependencyGraph.AddRoot(new Import(NodeFactory.EagerImports, instructionSetSupportSig), "Baseline instruction set support"); _profileData = profileData; _fileLayoutOptimizer = new ReadyToRunFileLayoutOptimizer(methodLayoutAlgorithm, fileLayoutAlgorithm, profileData, _nodeFactory); }
public sealed override void ApplyProfilerGuidedCompilationRestriction(ProfileDataManager profileGuidedCompileRestriction) { if (_profileGuidedCompileRestrictionSet) { throw new InternalCompilerErrorException("Called ApplyProfilerGuidedCompilationRestriction twice."); } _profileGuidedCompileRestrictionSet = true; _profileGuidedCompileRestriction = profileGuidedCompileRestriction; }
public ReadyToRunFileLayoutOptimizer(ReadyToRunMethodLayoutAlgorithm methodAlgorithm, ReadyToRunFileLayoutAlgorithm fileAlgorithm, ProfileDataManager profileData, NodeFactory nodeFactory) { _methodLayoutAlgorithm = methodAlgorithm; _fileLayoutAlgorithm = fileAlgorithm; _profileData = profileData; _nodeFactory = nodeFactory; }
public sealed override void ApplyProfileGuidedOptimizationData(ProfileDataManager profileGuidedCompileRestriction, bool partial) { if (_profileGuidedCompileRestrictionSet) { throw new InternalCompilerErrorException("Called ApplyProfileGuidedOptimizationData twice."); } _profileGuidedCompileRestrictionSet = true; if (partial) { _profileGuidedCompileRestriction = profileGuidedCompileRestriction; } base.ApplyProfileGuidedOptimizationData(profileGuidedCompileRestriction, partial); }
public ReadyToRunSingleAssemblyCompilationModuleGroup( TypeSystemContext context, IEnumerable <ModuleDesc> compilationModuleSet, IEnumerable <ModuleDesc> versionBubbleModuleSet, bool compileGenericDependenciesFromVersionBubbleModuleSet, ProfileDataManager profileGuidedCompileRestriction) { _compilationModuleSet = new HashSet <ModuleDesc>(compilationModuleSet); _versionBubbleModuleSet = new HashSet <ModuleDesc>(versionBubbleModuleSet); _versionBubbleModuleSet.UnionWith(_compilationModuleSet); _compileGenericDependenciesFromVersionBubbleModuleSet = compileGenericDependenciesFromVersionBubbleModuleSet; _profileGuidedCompileRestriction = profileGuidedCompileRestriction; }
public ReadyToRunCodegenCompilationBuilder UseProfileData(ProfileDataManager profileData) { _profileData = profileData; return(this); }
public override void ApplyProfilerGuidedCompilationRestriction(ProfileDataManager profileGuidedCompileRestriction) { // Profiler guided restrictions are ignored for single method compilation return; }
private int Run() { using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { InitializeDefaultOptions(); ProcessCommandLine(); if (_commandLineOptions.OutputFilePath == null) { throw new CommandLineException(SR.MissingOutputFile); } CheckCustomPESectionAlignment(); ConfigureTarget(); InstructionSetSupport instructionSetSupport = ConfigureInstructionSetSupport(); // // Initialize type system context // SharedGenericsMode genericsMode = SharedGenericsMode.CanonicalReferenceTypes; var targetDetails = new TargetDetails(_targetArchitecture, _targetOS, TargetAbi.CoreRT, instructionSetSupport.GetVectorTSimdVector()); _typeSystemContext = new ReadyToRunCompilerContext(targetDetails, genericsMode); string compositeRootPath = _commandLineOptions.CompositeRootPath?.FullName; // // TODO: To support our pre-compiled test tree, allow input files that aren't managed assemblies since // some tests contain a mixture of both managed and native binaries. // // See: https://github.com/dotnet/corert/issues/2785 // // When we undo this this hack, replace this foreach with // typeSystemContext.InputFilePaths = _inputFilePaths; // Dictionary <string, string> allInputFilePaths = new Dictionary <string, string>(); Dictionary <string, string> inputFilePaths = new Dictionary <string, string>(); List <ModuleDesc> referenceableModules = new List <ModuleDesc>(); foreach (var inputFile in _inputFilePaths) { try { var module = _typeSystemContext.GetModuleFromPath(inputFile.Value); allInputFilePaths.Add(inputFile.Key, inputFile.Value); inputFilePaths.Add(inputFile.Key, inputFile.Value); referenceableModules.Add(module); if (compositeRootPath == null) { compositeRootPath = Path.GetDirectoryName(inputFile.Value); } } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } Dictionary <string, string> unrootedInputFilePaths = new Dictionary <string, string>(); foreach (var unrootedInputFile in _unrootedInputFilePaths) { try { var module = _typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); if (!allInputFilePaths.ContainsKey(unrootedInputFile.Key)) { allInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); unrootedInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); referenceableModules.Add(module); if (compositeRootPath == null) { compositeRootPath = Path.GetDirectoryName(unrootedInputFile.Value); } } } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } CheckManagedCppInputFiles(allInputFilePaths.Values); _typeSystemContext.InputFilePaths = allInputFilePaths; _typeSystemContext.ReferenceFilePaths = _referenceFilePaths; List <EcmaModule> inputModules = new List <EcmaModule>(); List <EcmaModule> rootingModules = new List <EcmaModule>(); HashSet <ModuleDesc> versionBubbleModulesHash = new HashSet <ModuleDesc>(); foreach (var inputFile in inputFilePaths) { EcmaModule module = _typeSystemContext.GetModuleFromPath(inputFile.Value); inputModules.Add(module); rootingModules.Add(module); versionBubbleModulesHash.Add(module); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } foreach (var unrootedInputFile in unrootedInputFilePaths) { EcmaModule module = _typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); inputModules.Add(module); versionBubbleModulesHash.Add(module); } string systemModuleName = _commandLineOptions.SystemModule ?? DefaultSystemModule; _typeSystemContext.SetSystemModule((EcmaModule)_typeSystemContext.GetModuleForSimpleName(systemModuleName)); if (_typeSystemContext.InputFilePaths.Count == 0) { throw new CommandLineException(SR.NoInputFiles); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(_typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <string> mibcFiles = new List <string>(); if (_commandLineOptions.Mibc != null) { foreach (var file in _commandLineOptions.Mibc) { mibcFiles.Add(file.FullName); } } foreach (var referenceFile in _referenceFilePaths.Values) { try { EcmaModule module = _typeSystemContext.GetModuleFromPath(referenceFile); if (versionBubbleModulesHash.Contains(module)) { // Ignore reference assemblies that have also been passed as inputs continue; } referenceableModules.Add(module); if (_commandLineOptions.InputBubble) { // In large version bubble mode add reference paths to the compilation group versionBubbleModulesHash.Add(module); } } catch { } // Ignore non-managed pe files } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(versionBubbleModulesHash); if (!_commandLineOptions.Composite && inputModules.Count != 1) { throw new Exception(string.Format(SR.ErrorMultipleInputFilesCompositeModeOnly, string.Join("; ", inputModules))); } ReadyToRunCompilationModuleGroupBase compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else if (_commandLineOptions.CompileNoMethods) { compilationGroup = new NoMethodsCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } else { // Single assembly compilation. compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } // Examine profile guided information as appropriate ProfileDataManager profileDataManager = new ProfileDataManager(logger, referenceableModules, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics ? inputModules[0] : null, mibcFiles, _typeSystemContext, compilationGroup); if (_commandLineOptions.Partial) { compilationGroup.ApplyProfilerGuidedCompilationRestriction(profileDataManager); } else { compilationGroup.ApplyProfilerGuidedCompilationRestriction(null); } if ((singleMethod == null) && !_commandLineOptions.CompileNoMethods) { // For normal compilations add compilation roots. foreach (var module in rootingModules) { compilationRoots.Add(new ReadyToRunRootProvider( module, profileDataManager, profileDrivenPartialNGen: _commandLineOptions.Partial)); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } } // // Compile // ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder( _typeSystemContext, compilationGroup, allInputFilePaths.Values, compositeRootPath); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.Map) .UseParallelism(_commandLineOptions.Parallelism) .UseProfileData(profileDataManager) .FileLayoutAlgorithms(_commandLineOptions.MethodLayout, _commandLineOptions.FileLayout) .UseJitPath(_commandLineOptions.JitPath) .UseInstructionSetSupport(instructionSetSupport) .UseCustomPESectionAlignment(_commandLineOptions.CustomPESectionAlignment) .UseVerifyTypeAndFieldLayout(_commandLineOptions.VerifyTypeAndFieldLayout) .GenerateOutputFile(_commandLineOptions.OutputFilePath.FullName) .UseILProvider(ilProvider) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(_optimizationMode); compilation = builder.ToCompilation(); } compilation.Compile(_commandLineOptions.OutputFilePath.FullName); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName.FullName); } } return(0); }
private int Run() { InitializeDefaultOptions(); ProcessCommandLine(); if (_commandLineOptions.OutputFilePath == null) { throw new CommandLineException(SR.MissingOutputFile); } // // Set target Architecture and OS // if (_commandLineOptions.TargetArch != null) { if (_commandLineOptions.TargetArch.Equals("x86", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X86; } else if (_commandLineOptions.TargetArch.Equals("x64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X64; } else if (_commandLineOptions.TargetArch.Equals("arm", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("armel", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("arm64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM64; } else { throw new CommandLineException(SR.TargetArchitectureUnsupported); } } if (_commandLineOptions.TargetOS != null) { if (_commandLineOptions.TargetOS.Equals("windows", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Windows; } else if (_commandLineOptions.TargetOS.Equals("linux", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Linux; } else if (_commandLineOptions.TargetOS.Equals("osx", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.OSX; } else { throw new CommandLineException(SR.TargetOSUnsupported); } } InstructionSetSupportBuilder instructionSetSupportBuilder = new InstructionSetSupportBuilder(_targetArchitecture); // Ready to run images are built with certain instruction set baselines if ((_targetArchitecture == TargetArchitecture.X86) || (_targetArchitecture == TargetArchitecture.X64)) { instructionSetSupportBuilder.AddSupportedInstructionSet("sse"); instructionSetSupportBuilder.AddSupportedInstructionSet("sse2"); } else if (_targetArchitecture == TargetArchitecture.ARM64) { instructionSetSupportBuilder.AddSupportedInstructionSet("base"); instructionSetSupportBuilder.AddSupportedInstructionSet("neon"); } if (_commandLineOptions.InstructionSet != null) { List <string> instructionSetParams = new List <string>(); // At this time, instruction sets may only be specified with --input-bubble, as // we do not yet have a stable ABI for all vector parameter/return types. if (!_commandLineOptions.InputBubble) { throw new CommandLineException(SR.InstructionSetWithoutInputBubble); } // Normalize instruction set format to include implied +. string[] instructionSetParamsInput = _commandLineOptions.InstructionSet.Split(","); for (int i = 0; i < instructionSetParamsInput.Length; i++) { string instructionSet = instructionSetParamsInput[i]; if (String.IsNullOrEmpty(instructionSet)) { throw new CommandLineException(String.Format(SR.InstructionSetMustNotBe, "")); } char firstChar = instructionSet[0]; if ((firstChar != '+') && (firstChar != '-')) { instructionSet = "+" + instructionSet; } instructionSetParams.Add(instructionSet); } Dictionary <string, bool> instructionSetSpecification = new Dictionary <string, bool>(); foreach (string instructionSetSpecifier in instructionSetParams) { string instructionSet = instructionSetSpecifier.Substring(1, instructionSetSpecifier.Length - 1); bool enabled = instructionSetSpecifier[0] == '+' ? true : false; if (enabled) { if (!instructionSetSupportBuilder.AddSupportedInstructionSet(instructionSet)) { throw new CommandLineException(String.Format(SR.InstructionSetMustNotBe, instructionSet)); } } else { if (!instructionSetSupportBuilder.RemoveInstructionSetSupport(instructionSet)) { throw new CommandLineException(String.Format(SR.InstructionSetMustNotBe, instructionSet)); } } } } instructionSetSupportBuilder.ComputeInstructionSetFlags(out var supportedInstructionSet, out var unsupportedInstructionSet, (string specifiedInstructionSet, string impliedInstructionSet) => throw new CommandLineException(String.Format(SR.InstructionSetInvalidImplication, specifiedInstructionSet, impliedInstructionSet))); InstructionSetSupportBuilder optimisticInstructionSetSupportBuilder = new InstructionSetSupportBuilder(_targetArchitecture); // Ready to run images are built with certain instruction sets that are optimistically assumed to be present if ((_targetArchitecture == TargetArchitecture.X86) || (_targetArchitecture == TargetArchitecture.X64)) { // For ReadyToRun we set these hardware features as enabled always, as most // of hardware in the wild supports them. Note that we do not indicate support for AVX, or any other // instruction set which uses the VEX encodings as the presence of those makes otherwise acceptable // code be unusable on hardware which does not support VEX encodings, as well as emulators that do not // support AVX instructions. As the jit generates logic that depends on these features it will call // notifyInstructionSetUsage, which will result in generation of a fixup to verify the behavior of // code. // optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("sse"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("sse2"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("sse4.1"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("sse4.2"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("aes"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("pclmul"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("popcnt"); optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("lzcnt"); } optimisticInstructionSetSupportBuilder.ComputeInstructionSetFlags(out var optimisticInstructionSet, out _, (string specifiedInstructionSet, string impliedInstructionSet) => throw new NotSupportedException()); optimisticInstructionSet.Remove(unsupportedInstructionSet); optimisticInstructionSet.Add(supportedInstructionSet); var instructionSetSupport = new InstructionSetSupport(supportedInstructionSet, unsupportedInstructionSet, optimisticInstructionSet, InstructionSetSupportBuilder.GetNonSpecifiableInstructionSetsForArch(_targetArchitecture), _targetArchitecture); using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { // // Initialize type system context // SharedGenericsMode genericsMode = SharedGenericsMode.CanonicalReferenceTypes; var targetDetails = new TargetDetails(_targetArchitecture, _targetOS, TargetAbi.CoreRT, instructionSetSupport.GetVectorTSimdVector()); CompilerTypeSystemContext typeSystemContext = new ReadyToRunCompilerContext(targetDetails, genericsMode); // // TODO: To support our pre-compiled test tree, allow input files that aren't managed assemblies since // some tests contain a mixture of both managed and native binaries. // // See: https://github.com/dotnet/corert/issues/2785 // // When we undo this this hack, replace this foreach with // typeSystemContext.InputFilePaths = _inputFilePaths; // Dictionary <string, string> allInputFilePaths = new Dictionary <string, string>(); Dictionary <string, string> inputFilePaths = new Dictionary <string, string>(); List <ModuleDesc> referenceableModules = new List <ModuleDesc>(); foreach (var inputFile in _inputFilePaths) { try { var module = typeSystemContext.GetModuleFromPath(inputFile.Value); allInputFilePaths.Add(inputFile.Key, inputFile.Value); inputFilePaths.Add(inputFile.Key, inputFile.Value); referenceableModules.Add(module); } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } Dictionary <string, string> unrootedInputFilePaths = new Dictionary <string, string>(); foreach (var unrootedInputFile in _unrootedInputFilePaths) { try { var module = typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); if (!allInputFilePaths.ContainsKey(unrootedInputFile.Key)) { allInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); unrootedInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); referenceableModules.Add(module); } } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } typeSystemContext.InputFilePaths = allInputFilePaths; typeSystemContext.ReferenceFilePaths = _referenceFilePaths; List <EcmaModule> inputModules = new List <EcmaModule>(); List <EcmaModule> rootingModules = new List <EcmaModule>(); HashSet <ModuleDesc> versionBubbleModulesHash = new HashSet <ModuleDesc>(); foreach (var inputFile in inputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(inputFile.Value); inputModules.Add(module); rootingModules.Add(module); versionBubbleModulesHash.Add(module); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } foreach (var unrootedInputFile in unrootedInputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); inputModules.Add(module); versionBubbleModulesHash.Add(module); } string systemModuleName = _commandLineOptions.SystemModule ?? DefaultSystemModule; typeSystemContext.SetSystemModule((EcmaModule)typeSystemContext.GetModuleForSimpleName(systemModuleName)); if (typeSystemContext.InputFilePaths.Count == 0) { throw new CommandLineException(SR.NoInputFiles); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <string> mibcFiles = new List <string>(); if (_commandLineOptions.Mibc != null) { foreach (var file in _commandLineOptions.Mibc) { mibcFiles.Add(file.FullName); } } foreach (var referenceFile in _referenceFilePaths.Values) { try { EcmaModule module = typeSystemContext.GetModuleFromPath(referenceFile); if (versionBubbleModulesHash.Contains(module)) { // Ignore reference assemblies that have also been passed as inputs continue; } referenceableModules.Add(module); if (_commandLineOptions.InputBubble) { // In large version bubble mode add reference paths to the compilation group versionBubbleModulesHash.Add(module); } } catch { } // Ignore non-managed pe files } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(versionBubbleModulesHash); if (!_commandLineOptions.Composite && inputModules.Count != 1) { throw new Exception(string.Format(SR.ErrorMultipleInputFilesCompositeModeOnly, string.Join("; ", inputModules))); } ReadyToRunCompilationModuleGroupBase compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else if (_commandLineOptions.CompileNoMethods) { compilationGroup = new NoMethodsCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } else { // Single assembly compilation. compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } // Examine profile guided information as appropriate ProfileDataManager profileDataManager = new ProfileDataManager(logger, referenceableModules, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics ? inputModules[0] : null, mibcFiles, typeSystemContext, compilationGroup); if (_commandLineOptions.Partial) { compilationGroup.ApplyProfilerGuidedCompilationRestriction(profileDataManager); } else { compilationGroup.ApplyProfilerGuidedCompilationRestriction(null); } if ((singleMethod == null) && !_commandLineOptions.CompileNoMethods) { // For normal compilations add compilation roots. foreach (var module in rootingModules) { compilationRoots.Add(new ReadyToRunRootProvider( module, profileDataManager, profileDrivenPartialNGen: _commandLineOptions.Partial)); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } } // // Compile // ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder( typeSystemContext, compilationGroup, allInputFilePaths.Values); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.Map) .UseParallelism(_commandLineOptions.Parallelism) .UseProfileData(profileDataManager) .FileLayoutAlgorithms(_commandLineOptions.MethodLayout, _commandLineOptions.FileLayout) .UseJitPath(_commandLineOptions.JitPath) .UseInstructionSetSupport(instructionSetSupport) .GenerateOutputFile(_commandLineOptions.OutputFilePath.FullName) .UseILProvider(ilProvider) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(_optimizationMode); compilation = builder.ToCompilation(); } compilation.Compile(_commandLineOptions.OutputFilePath.FullName); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName.FullName); } } return(0); }
public ReadyToRunRootProvider(EcmaModule module, ProfileDataManager profileDataManager, bool profileDrivenPartialNGen) { _module = module; _profileData = profileDataManager.GetMethodsForModuleDesc(module); _profileDrivenPartialNGen = profileDrivenPartialNGen; }
public ReadyToRunRootProvider(EcmaModule module, ProfileDataManager profileDataManager) { _module = module; _profileData = profileDataManager.GetDataForModuleDesc(module); }
public RyuJitCompilationBuilder UseProfileData(IEnumerable <string> mibcFiles) { _profileDataManager = new ProfileDataManager(mibcFiles, _context); return(this); }
public override void ApplyProfilerGuidedCompilationRestriction(ProfileDataManager profileGuidedCompileRestriction) { return; }
private int Run(string[] args) { using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { InitializeDefaultOptions(); ProcessCommandLine(args); if (_commandLineOptions.Help) { Console.WriteLine(_commandLineOptions.HelpText); return(1); } if (_commandLineOptions.OutputFilePath == null) { throw new CommandLineException(SR.MissingOutputFile); } ConfigureTarget(); InstructionSetSupport instructionSetSupport = ConfigureInstructionSetSupport(); // // Initialize type system context // SharedGenericsMode genericsMode = SharedGenericsMode.CanonicalReferenceTypes; var targetDetails = new TargetDetails(_targetArchitecture, _targetOS, _armelAbi ? TargetAbi.CoreRTArmel : TargetAbi.CoreRT, instructionSetSupport.GetVectorTSimdVector()); bool versionBubbleIncludesCoreLib = false; if (_commandLineOptions.InputBubble) { versionBubbleIncludesCoreLib = true; } else { foreach (var inputFile in _inputFilePaths) { if (String.Compare(inputFile.Key, "System.Private.CoreLib", StringComparison.OrdinalIgnoreCase) == 0) { versionBubbleIncludesCoreLib = true; break; } } if (!versionBubbleIncludesCoreLib) { foreach (var inputFile in _unrootedInputFilePaths) { if (String.Compare(inputFile.Key, "System.Private.CoreLib", StringComparison.OrdinalIgnoreCase) == 0) { versionBubbleIncludesCoreLib = true; break; } } } } _typeSystemContext = new ReadyToRunCompilerContext(targetDetails, genericsMode, versionBubbleIncludesCoreLib); string compositeRootPath = _commandLineOptions.CompositeRootPath; // // TODO: To support our pre-compiled test tree, allow input files that aren't managed assemblies since // some tests contain a mixture of both managed and native binaries. // // See: https://github.com/dotnet/corert/issues/2785 // // When we undo this this hack, replace this foreach with // typeSystemContext.InputFilePaths = _inputFilePaths; // Dictionary <string, string> allInputFilePaths = new Dictionary <string, string>(); Dictionary <string, string> inputFilePaths = new Dictionary <string, string>(); List <ModuleDesc> referenceableModules = new List <ModuleDesc>(); foreach (var inputFile in _inputFilePaths) { try { var module = _typeSystemContext.GetModuleFromPath(inputFile.Value); allInputFilePaths.Add(inputFile.Key, inputFile.Value); inputFilePaths.Add(inputFile.Key, inputFile.Value); referenceableModules.Add(module); if (compositeRootPath == null) { compositeRootPath = Path.GetDirectoryName(inputFile.Value); } } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } Dictionary <string, string> unrootedInputFilePaths = new Dictionary <string, string>(); foreach (var unrootedInputFile in _unrootedInputFilePaths) { try { var module = _typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); if (!allInputFilePaths.ContainsKey(unrootedInputFile.Key)) { allInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); unrootedInputFilePaths.Add(unrootedInputFile.Key, unrootedInputFile.Value); referenceableModules.Add(module); if (compositeRootPath == null) { compositeRootPath = Path.GetDirectoryName(unrootedInputFile.Value); } } } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } CheckManagedCppInputFiles(allInputFilePaths.Values); _typeSystemContext.InputFilePaths = allInputFilePaths; _typeSystemContext.ReferenceFilePaths = _referenceFilePaths; List <EcmaModule> inputModules = new List <EcmaModule>(); List <EcmaModule> rootingModules = new List <EcmaModule>(); HashSet <ModuleDesc> versionBubbleModulesHash = new HashSet <ModuleDesc>(); Guid?inputModuleMvid = null; foreach (var inputFile in inputFilePaths) { EcmaModule module = _typeSystemContext.GetModuleFromPath(inputFile.Value); inputModules.Add(module); rootingModules.Add(module); versionBubbleModulesHash.Add(module); if (!_commandLineOptions.Composite && !inputModuleMvid.HasValue) { inputModuleMvid = module.MetadataReader.GetGuid(module.MetadataReader.GetModuleDefinition().Mvid); } if (!_commandLineOptions.CompositeOrInputBubble) { break; } } foreach (var unrootedInputFile in unrootedInputFilePaths) { EcmaModule module = _typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); inputModules.Add(module); versionBubbleModulesHash.Add(module); } string systemModuleName = _commandLineOptions.SystemModule ?? DefaultSystemModule; _typeSystemContext.SetSystemModule((EcmaModule)_typeSystemContext.GetModuleForSimpleName(systemModuleName)); if (_typeSystemContext.InputFilePaths.Count == 0) { if (_commandLineOptions.InputFilePaths.Count > 0) { Console.WriteLine(SR.InputWasNotLoadable); return(2); } throw new CommandLineException(SR.NoInputFiles); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(_typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <string> mibcFiles = new List <string>(); foreach (var file in _commandLineOptions.MibcFilePaths) { mibcFiles.Add(file); } foreach (var referenceFile in _referenceFilePaths.Values) { try { EcmaModule module = _typeSystemContext.GetModuleFromPath(referenceFile); if (versionBubbleModulesHash.Contains(module)) { // Ignore reference assemblies that have also been passed as inputs continue; } referenceableModules.Add(module); if (_commandLineOptions.InputBubble) { // In large version bubble mode add reference paths to the compilation group versionBubbleModulesHash.Add(module); } } catch { } // Ignore non-managed pe files } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(versionBubbleModulesHash); if (!_commandLineOptions.Composite && inputModules.Count != 1) { throw new Exception(string.Format(SR.ErrorMultipleInputFilesCompositeModeOnly, string.Join("; ", inputModules))); } ReadyToRunCompilationModuleGroupBase compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else if (_commandLineOptions.CompileNoMethods) { compilationGroup = new NoMethodsCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } else { // Single assembly compilation. compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( _typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } // Load any profiles generated by method call chain analyis CallChainProfile jsonProfile = null; if (!string.IsNullOrEmpty(_commandLineOptions.CallChainProfileFile)) { jsonProfile = new CallChainProfile(_commandLineOptions.CallChainProfileFile, _typeSystemContext, referenceableModules); } // Examine profile guided information as appropriate ProfileDataManager profileDataManager = new ProfileDataManager(logger, referenceableModules, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics ? inputModules[0] : null, mibcFiles, jsonProfile, _typeSystemContext, compilationGroup, _commandLineOptions.EmbedPgoData); if (_commandLineOptions.Partial) { compilationGroup.ApplyProfilerGuidedCompilationRestriction(profileDataManager); } else { compilationGroup.ApplyProfilerGuidedCompilationRestriction(null); } if ((singleMethod == null) && !_commandLineOptions.CompileNoMethods) { // For normal compilations add compilation roots. foreach (var module in rootingModules) { compilationRoots.Add(new ReadyToRunRootProvider( module, profileDataManager, profileDrivenPartialNGen: _commandLineOptions.Partial)); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } } // In single-file compilation mode, use the assembly's DebuggableAttribute to determine whether to optimize // or produce debuggable code if an explicit optimization level was not specified on the command line if (_optimizationMode == OptimizationMode.None && !_commandLineOptions.OptimizeDisabled && !_commandLineOptions.Composite) { System.Diagnostics.Debug.Assert(inputModules.Count == 1); _optimizationMode = ((EcmaAssembly)inputModules[0].Assembly).HasOptimizationsDisabled() ? OptimizationMode.None : OptimizationMode.Blended; } // // Compile // ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder( _typeSystemContext, compilationGroup, allInputFilePaths.Values, compositeRootPath); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.Map) .UseMapCsvFile(_commandLineOptions.MapCsv) .UsePdbFile(_commandLineOptions.Pdb, _commandLineOptions.PdbPath) .UsePerfMapFile(_commandLineOptions.PerfMap, _commandLineOptions.PerfMapPath, inputModuleMvid) .UseProfileFile(jsonProfile != null) .UseParallelism(_commandLineOptions.Parallelism) .UseProfileData(profileDataManager) .FileLayoutAlgorithms(_methodLayout, _fileLayout) .UseJitPath(_commandLineOptions.JitPath) .UseInstructionSetSupport(instructionSetSupport) .UseCustomPESectionAlignment(_commandLineOptions.CustomPESectionAlignment) .UseVerifyTypeAndFieldLayout(_commandLineOptions.VerifyTypeAndFieldLayout) .GenerateOutputFile(_commandLineOptions.OutputFilePath) .UseILProvider(ilProvider) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(_optimizationMode); if (_commandLineOptions.PrintReproInstructions) { builder.UsePrintReproInstructions(CreateReproArgumentString); } compilation = builder.ToCompilation(); } compilation.Compile(_commandLineOptions.OutputFilePath); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName); } compilation.Dispose(); } return(0); }
private int Run() { InitializeDefaultOptions(); ProcessCommandLine(); if (_commandLineOptions.OutputFilePath == null) { throw new CommandLineException("Output filename must be specified (/out <file>)"); } // // Set target Architecture and OS // if (_commandLineOptions.TargetArch != null) { if (_commandLineOptions.TargetArch.Equals("x86", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X86; } else if (_commandLineOptions.TargetArch.Equals("x64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X64; } else if (_commandLineOptions.TargetArch.Equals("arm", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("armel", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("arm64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM64; } else { throw new CommandLineException("Target architecture is not supported"); } } if (_commandLineOptions.TargetOS != null) { if (_commandLineOptions.TargetOS.Equals("windows", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Windows; } else if (_commandLineOptions.TargetOS.Equals("linux", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Linux; } else if (_commandLineOptions.TargetOS.Equals("osx", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.OSX; } else { throw new CommandLineException("Target OS is not supported"); } } using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { // // Initialize type system context // SharedGenericsMode genericsMode = SharedGenericsMode.CanonicalReferenceTypes; var targetDetails = new TargetDetails(_targetArchitecture, _targetOS, TargetAbi.CoreRT, SimdVectorLength.None); CompilerTypeSystemContext typeSystemContext = new ReadyToRunCompilerContext(targetDetails, genericsMode); // // TODO: To support our pre-compiled test tree, allow input files that aren't managed assemblies since // some tests contain a mixture of both managed and native binaries. // // See: https://github.com/dotnet/corert/issues/2785 // // When we undo this this hack, replace this foreach with // typeSystemContext.InputFilePaths = _inputFilePaths; // Dictionary <string, string> inputFilePaths = new Dictionary <string, string>(); foreach (var inputFile in _inputFilePaths) { try { var module = typeSystemContext.GetModuleFromPath(inputFile.Value); inputFilePaths.Add(inputFile.Key, inputFile.Value); } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } typeSystemContext.InputFilePaths = inputFilePaths; typeSystemContext.ReferenceFilePaths = _referenceFilePaths; string systemModuleName = _commandLineOptions.SystemModule ?? DefaultSystemModule; typeSystemContext.SetSystemModule(typeSystemContext.GetModuleForSimpleName(systemModuleName)); if (typeSystemContext.InputFilePaths.Count == 0) { throw new CommandLineException("No input files specified"); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <ModuleDesc> referenceableModules = new List <ModuleDesc>(); foreach (var inputFile in inputFilePaths) { try { referenceableModules.Add(typeSystemContext.GetModuleFromPath(inputFile.Value)); } catch { } // Ignore non-managed pe files } foreach (var referenceFile in _referenceFilePaths.Values) { try { referenceableModules.Add(typeSystemContext.GetModuleFromPath(referenceFile)); } catch { } // Ignore non-managed pe files } ProfileDataManager profileDataManager = new ProfileDataManager(logger, referenceableModules); CompilationModuleGroup compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup(singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else { // Either single file, or multifile library, or multifile consumption. EcmaModule entrypointModule = null; foreach (var inputFile in typeSystemContext.InputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(inputFile.Value); if (module.PEReader.PEHeaders.IsExe) { if (entrypointModule != null) { throw new Exception("Multiple EXE modules"); } entrypointModule = module; } } List <EcmaModule> inputModules = new List <EcmaModule>(); foreach (var inputFile in typeSystemContext.InputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(inputFile.Value); compilationRoots.Add(new ReadyToRunRootProvider(module, profileDataManager)); inputModules.Add(module); if (!_commandLineOptions.InputBubble) { break; } } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(); if (_commandLineOptions.InputBubble) { // In large version bubble mode add reference paths to the compilation group foreach (string referenceFile in _referenceFilePaths.Values) { try { // Currently SimpleTest.targets has no easy way to filter out non-managed assemblies // from the reference list. EcmaModule module = typeSystemContext.GetModuleFromPath(referenceFile); versionBubbleModules.Add(module); } catch (TypeSystemException.BadImageFormatException ex) { Console.WriteLine("Warning: cannot open reference assembly '{0}': {1}", referenceFile, ex.Message); } } } compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( typeSystemContext, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, _commandLineOptions.Partial ? profileDataManager : null); } // // Compile // string inputFilePath = ""; foreach (var input in typeSystemContext.InputFilePaths) { inputFilePath = input.Value; break; } ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder(typeSystemContext, compilationGroup, inputFilePath); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.GenerateMapFile) .UseParallelism(_commandLineOptions.Parallelism) .UseILProvider(ilProvider) .UseJitPath(_commandLineOptions.JitPath) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(_optimizationMode); compilation = builder.ToCompilation(); } compilation.Compile(_commandLineOptions.OutputFilePath.FullName); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName.FullName); } } return(0); }
private void RunSingleCompilation(Dictionary <string, string> inFilePaths, InstructionSetSupport instructionSetSupport, string compositeRootPath, Dictionary <string, string> unrootedInputFilePaths, HashSet <ModuleDesc> versionBubbleModulesHash, CompilerTypeSystemContext typeSystemContext) { // // Initialize output filename // string inFilePath = inFilePaths.First().Value; string inputFileExtension = Path.GetExtension(inFilePath); string nearOutFilePath = inputFileExtension switch { ".dll" => Path.ChangeExtension(inFilePath, _commandLineOptions.SingleFileCompilation && _commandLineOptions.InputBubble ? ".ni.dll.tmp" : ".ni.dll"), ".exe" => Path.ChangeExtension(inFilePath, _commandLineOptions.SingleFileCompilation && _commandLineOptions.InputBubble ? ".ni.exe.tmp" : ".ni.exe"), _ => throw new CommandLineException(string.Format(SR.UnsupportedInputFileExtension, inputFileExtension)) }; string outFile = _commandLineOptions.OutNearInput ? nearOutFilePath : _commandLineOptions.OutputFilePath; using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { List <EcmaModule> inputModules = new List <EcmaModule>(); List <EcmaModule> rootingModules = new List <EcmaModule>(); foreach (var inputFile in inFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(inputFile.Value); inputModules.Add(module); rootingModules.Add(module); versionBubbleModulesHash.Add(module); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } foreach (var unrootedInputFile in unrootedInputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(unrootedInputFile.Value); inputModules.Add(module); versionBubbleModulesHash.Add(module); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <string> mibcFiles = new List <string>(); foreach (var file in _commandLineOptions.MibcFilePaths) { mibcFiles.Add(file); } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(versionBubbleModulesHash); if (!_commandLineOptions.Composite && inputModules.Count != 1) { throw new Exception(string.Format(SR.ErrorMultipleInputFilesCompositeModeOnly, string.Join("; ", inputModules))); } ReadyToRunCompilationModuleGroupBase compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else if (_commandLineOptions.CompileNoMethods) { compilationGroup = new NoMethodsCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } else { // Single assembly compilation. compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( typeSystemContext, _commandLineOptions.Composite, _commandLineOptions.InputBubble, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } // Load any profiles generated by method call chain analyis CallChainProfile jsonProfile = null; if (!string.IsNullOrEmpty(_commandLineOptions.CallChainProfileFile)) { jsonProfile = new CallChainProfile(_commandLineOptions.CallChainProfileFile, typeSystemContext, _referenceableModules); } // Examine profile guided information as appropriate ProfileDataManager profileDataManager = new ProfileDataManager(logger, _referenceableModules, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics ? inputModules[0] : null, mibcFiles, jsonProfile, typeSystemContext, compilationGroup, _commandLineOptions.EmbedPgoData); if (_commandLineOptions.Partial) { compilationGroup.ApplyProfilerGuidedCompilationRestriction(profileDataManager); } else { compilationGroup.ApplyProfilerGuidedCompilationRestriction(null); } if ((singleMethod == null) && !_commandLineOptions.CompileNoMethods) { // For normal compilations add compilation roots. foreach (var module in rootingModules) { compilationRoots.Add(new ReadyToRunRootProvider( module, profileDataManager, profileDrivenPartialNGen: _commandLineOptions.Partial)); if (!_commandLineOptions.CompositeOrInputBubble) { break; } } } // In single-file compilation mode, use the assembly's DebuggableAttribute to determine whether to optimize // or produce debuggable code if an explicit optimization level was not specified on the command line OptimizationMode optimizationMode = _optimizationMode; if (optimizationMode == OptimizationMode.None && !_commandLineOptions.OptimizeDisabled && !_commandLineOptions.Composite) { System.Diagnostics.Debug.Assert(inputModules.Count == 1); optimizationMode = ((EcmaAssembly)inputModules[0].Assembly).HasOptimizationsDisabled() ? OptimizationMode.None : OptimizationMode.Blended; } CompositeImageSettings compositeImageSettings = new CompositeImageSettings(); if (_commandLineOptions.CompositeKeyFile != null) { ImmutableArray <byte> compositeStrongNameKey = File.ReadAllBytes(_commandLineOptions.CompositeKeyFile).ToImmutableArray(); if (!IsValidPublicKey(compositeStrongNameKey)) { throw new Exception(string.Format(SR.ErrorCompositeKeyFileNotPublicKey)); } compositeImageSettings.PublicKey = compositeStrongNameKey; } // // Compile // ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder( typeSystemContext, compilationGroup, _allInputFilePaths.Values, compositeRootPath); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.Map) .UseMapCsvFile(_commandLineOptions.MapCsv) .UsePdbFile(_commandLineOptions.Pdb, _commandLineOptions.PdbPath) .UsePerfMapFile(_commandLineOptions.PerfMap, _commandLineOptions.PerfMapPath, _commandLineOptions.PerfMapFormatVersion) .UseProfileFile(jsonProfile != null) .UseParallelism(_commandLineOptions.Parallelism) .UseProfileData(profileDataManager) .FileLayoutAlgorithms(_methodLayout, _fileLayout) .UseCompositeImageSettings(compositeImageSettings) .UseJitPath(_commandLineOptions.JitPath) .UseInstructionSetSupport(instructionSetSupport) .UseCustomPESectionAlignment(_commandLineOptions.CustomPESectionAlignment) .UseVerifyTypeAndFieldLayout(_commandLineOptions.VerifyTypeAndFieldLayout) .GenerateOutputFile(outFile) .UseILProvider(ilProvider) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(optimizationMode); if (_commandLineOptions.PrintReproInstructions) { builder.UsePrintReproInstructions(CreateReproArgumentString); } compilation = builder.ToCompilation(); } compilation.Compile(outFile); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName); } compilation.Dispose(); } }
private int Run() { InitializeDefaultOptions(); ProcessCommandLine(); if (_commandLineOptions.OutputFilePath == null) { throw new CommandLineException(SR.MissingOutputFile); } // // Set target Architecture and OS // if (_commandLineOptions.TargetArch != null) { if (_commandLineOptions.TargetArch.Equals("x86", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X86; } else if (_commandLineOptions.TargetArch.Equals("x64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.X64; } else if (_commandLineOptions.TargetArch.Equals("arm", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("armel", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM; } else if (_commandLineOptions.TargetArch.Equals("arm64", StringComparison.OrdinalIgnoreCase)) { _targetArchitecture = TargetArchitecture.ARM64; } else { throw new CommandLineException(SR.TargetArchitectureUnsupported); } } if (_commandLineOptions.TargetOS != null) { if (_commandLineOptions.TargetOS.Equals("windows", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Windows; } else if (_commandLineOptions.TargetOS.Equals("linux", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.Linux; } else if (_commandLineOptions.TargetOS.Equals("osx", StringComparison.OrdinalIgnoreCase)) { _targetOS = TargetOS.OSX; } else { throw new CommandLineException(SR.TargetOSUnsupported); } } using (PerfEventSource.StartStopEvents.CompilationEvents()) { ICompilation compilation; using (PerfEventSource.StartStopEvents.LoadingEvents()) { // // Initialize type system context // SharedGenericsMode genericsMode = SharedGenericsMode.CanonicalReferenceTypes; var targetDetails = new TargetDetails(_targetArchitecture, _targetOS, TargetAbi.CoreRT, SimdVectorLength.None); CompilerTypeSystemContext typeSystemContext = new ReadyToRunCompilerContext(targetDetails, genericsMode); // // TODO: To support our pre-compiled test tree, allow input files that aren't managed assemblies since // some tests contain a mixture of both managed and native binaries. // // See: https://github.com/dotnet/corert/issues/2785 // // When we undo this this hack, replace this foreach with // typeSystemContext.InputFilePaths = _inputFilePaths; // Dictionary <string, string> inputFilePaths = new Dictionary <string, string>(); List <ModuleDesc> referenceableModules = new List <ModuleDesc>(); foreach (var inputFile in _inputFilePaths) { try { var module = typeSystemContext.GetModuleFromPath(inputFile.Value); inputFilePaths.Add(inputFile.Key, inputFile.Value); referenceableModules.Add(module); } catch (TypeSystemException.BadImageFormatException) { // Keep calm and carry on. } } typeSystemContext.InputFilePaths = inputFilePaths; typeSystemContext.ReferenceFilePaths = _referenceFilePaths; List <EcmaModule> inputModules = new List <EcmaModule>(); HashSet <ModuleDesc> versionBubbleModulesHash = new HashSet <ModuleDesc>(); foreach (var inputFile in typeSystemContext.InputFilePaths) { EcmaModule module = typeSystemContext.GetModuleFromPath(inputFile.Value); inputModules.Add(module); versionBubbleModulesHash.Add(module); if (!_commandLineOptions.InputBubble) { break; } } string systemModuleName = _commandLineOptions.SystemModule ?? DefaultSystemModule; typeSystemContext.SetSystemModule(typeSystemContext.GetModuleForSimpleName(systemModuleName)); if (typeSystemContext.InputFilePaths.Count == 0) { throw new CommandLineException(SR.NoInputFiles); } // // Initialize compilation group and compilation roots // // Single method mode? MethodDesc singleMethod = CheckAndParseSingleMethodModeArguments(typeSystemContext); var logger = new Logger(Console.Out, _commandLineOptions.Verbose); List <string> mibcFiles = new List <string>(); if (_commandLineOptions.Mibc != null) { foreach (var file in _commandLineOptions.Mibc) { mibcFiles.Add(file.FullName); } } foreach (var referenceFile in _referenceFilePaths.Values) { try { EcmaModule module = typeSystemContext.GetModuleFromPath(referenceFile); referenceableModules.Add(module); if (_commandLineOptions.InputBubble) { // In large version bubble mode add reference paths to the compilation group versionBubbleModulesHash.Add(module); } } catch { } // Ignore non-managed pe files } List <ModuleDesc> versionBubbleModules = new List <ModuleDesc>(versionBubbleModulesHash); ReadyToRunCompilationModuleGroupBase compilationGroup; List <ICompilationRootProvider> compilationRoots = new List <ICompilationRootProvider>(); if (singleMethod != null) { // Compiling just a single method compilationGroup = new SingleMethodCompilationModuleGroup(typeSystemContext, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics, singleMethod); compilationRoots.Add(new SingleMethodRootProvider(singleMethod)); } else { // Single assembly compilation. compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup( typeSystemContext, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics); } // Examine profile guided information as appropriate ProfileDataManager profileDataManager = new ProfileDataManager(logger, referenceableModules, inputModules, versionBubbleModules, _commandLineOptions.CompileBubbleGenerics ? inputModules[0] : null, mibcFiles, typeSystemContext, compilationGroup); if (_commandLineOptions.Partial) { compilationGroup.ApplyProfilerGuidedCompilationRestriction(profileDataManager); } else { compilationGroup.ApplyProfilerGuidedCompilationRestriction(null); } if (singleMethod == null) { // For non-single-method compilations add compilation roots. foreach (var module in inputModules) { compilationRoots.Add(new ReadyToRunRootProvider(module, profileDataManager, _commandLineOptions.Partial)); if (!_commandLineOptions.InputBubble) { break; } } } // // Compile // string inputFilePath = ""; foreach (var input in typeSystemContext.InputFilePaths) { inputFilePath = input.Value; break; } ReadyToRunCodegenCompilationBuilder builder = new ReadyToRunCodegenCompilationBuilder(typeSystemContext, compilationGroup, inputFilePath); string compilationUnitPrefix = ""; builder.UseCompilationUnitPrefix(compilationUnitPrefix); ILProvider ilProvider = new ReadyToRunILProvider(); DependencyTrackingLevel trackingLevel = _commandLineOptions.DgmlLogFileName == null ? DependencyTrackingLevel.None : (_commandLineOptions.GenerateFullDgmlLog ? DependencyTrackingLevel.All : DependencyTrackingLevel.First); builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) .UseMapFile(_commandLineOptions.Map) .UseParallelism(_commandLineOptions.Parallelism) .UseJitPath(_commandLineOptions.JitPath) .UseILProvider(ilProvider) .UseBackendOptions(_commandLineOptions.CodegenOptions) .UseLogger(logger) .UseDependencyTracking(trackingLevel) .UseCompilationRoots(compilationRoots) .UseOptimizationMode(_optimizationMode); compilation = builder.ToCompilation(); } compilation.Compile(_commandLineOptions.OutputFilePath.FullName); if (_commandLineOptions.DgmlLogFileName != null) { compilation.WriteDependencyLog(_commandLineOptions.DgmlLogFileName.FullName); } } return(0); }