internal RyuJitCompilation( DependencyAnalyzerBase<NodeFactory> dependencyGraph, NodeFactory nodeFactory, IEnumerable<ICompilationRootProvider> roots, Logger logger, JitConfigProvider configProvider) : base(dependencyGraph, nodeFactory, roots, new NameMangler(false), logger) { _jitConfigProvider = configProvider; }
internal CppCodegenCompilation( DependencyAnalyzerBase<NodeFactory> dependencyGraph, NodeFactory nodeFactory, IEnumerable<ICompilationRootProvider> roots, Logger logger, CppCodegenConfigProvider options) : base(dependencyGraph, nodeFactory, GetCompilationRoots(roots, nodeFactory), new NameMangler(true), logger) { Options = options; }
protected Compilation( DependencyAnalyzerBase<NodeFactory> dependencyGraph, NodeFactory nodeFactory, IEnumerable<ICompilationRootProvider> compilationRoots, NameMangler nameMangler, Logger logger) { _dependencyGraph = dependencyGraph; _nodeFactory = nodeFactory; _nameMangler = nameMangler; _logger = logger; _dependencyGraph.ComputeDependencyRoutine += ComputeDependencyNodeDependencies; NodeFactory.AttachToDependencyGraph(_dependencyGraph); // TODO: hacky static field NodeFactory.NameMangler = nameMangler; var rootingService = new RootingServiceProvider(dependencyGraph, nodeFactory); foreach (var rootProvider in compilationRoots) rootProvider.AddCompilationRoots(rootingService); }
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) { byte[] compositeStrongNameKey = File.ReadAllBytes(_commandLineOptions.CompositeKeyFile); if (!IsValidPublicKey(compositeStrongNameKey)) { throw new Exception(string.Format(SR.ErrorCompositeKeyFileNotPublicKey)); } compositeImageSettings.PublicKey = compositeStrongNameKey.ToImmutableArray(); } // // 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(); } }
public ProfileDataManager(Logger logger, IEnumerable<ModuleDesc> possibleReferenceModules, IEnumerable<ModuleDesc> inputModules, IEnumerable<ModuleDesc> versionBubbleModules, ModuleDesc nonLocalGenericsHome, IReadOnlyList<string> mibcFiles, CompilerTypeSystemContext context, ReadyToRunCompilationModuleGroupBase compilationGroup) { _ibcParser = new IBCProfileParser(logger, possibleReferenceModules); _compilationGroup = compilationGroup; HashSet<ModuleDesc> versionBubble = new HashSet<ModuleDesc>(versionBubbleModules); { // Parse MIbc Data string onlyParseItemsDefinedInAssembly = nonLocalGenericsHome == null ? inputModules.First().Assembly.GetName().Name : null; HashSet<string> versionBubbleModuleStrings = new HashSet<string>(); foreach (ModuleDesc versionBubbleModule in versionBubble) { versionBubbleModuleStrings.Add(versionBubbleModule.Assembly.GetName().Name); } foreach (string file in mibcFiles) { _inputData.Add(MIbcProfileParser.ParseMIbcFile(context, file, versionBubbleModuleStrings, onlyParseItemsDefinedInAssembly)); } } { // Parse Ibc data foreach (var module in inputModules) { _inputData.Add(_ibcParser.ParseIBCDataFromModule((EcmaModule)module)); _placedProfileMethods.Add(module, new HashSet<MethodDesc>()); } } // Merge all data together foreach (ProfileData profileData in _inputData) { MergeProfileData(ref _partialNGen, _mergedProfileData, profileData); } // With the merged data find the set of methods to be placed within this module foreach (var profileData in _mergedProfileData) { // If the method is not excluded from processing if (!profileData.Value.Flags.HasFlag(MethodProfilingDataFlags.ExcludeHotMethodCode) && !profileData.Value.Flags.HasFlag(MethodProfilingDataFlags.ExcludeColdMethodCode)) { // Check for methods which are defined within the version bubble, and only rely on other modules within the bubble if (!_compilationGroup.VersionsWithMethodBody(profileData.Key)) continue; // Method not contained within version bubble if (_compilationGroup.ContainsType(profileData.Key.OwningType) && (profileData.Key.OwningType is MetadataType declaringType)) { // In this case the method is placed in its natural home (which is the defining module of the method) _placedProfileMethods[declaringType.Module].Add(profileData.Key); _placedProfileMethodsAll.Add(profileData.Key); } else { // If the defining module is not within the input set, if the nonLocalGenericsHome is provided, place it there if ((nonLocalGenericsHome != null) && (profileData.Key.GetTypicalMethodDefinition() != profileData.Key)) { _placedProfileMethods[nonLocalGenericsHome].Add(profileData.Key); _placedProfileMethodsAll.Add(profileData.Key); } } } } }