Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        internal RyuJitCompilation(
            DependencyAnalyzerBase <NodeFactory> dependencyGraph,
            NodeFactory nodeFactory,
            IEnumerable <ICompilationRootProvider> roots,
            ILProvider ilProvider,
            DebugInformationProvider debugInformationProvider,
            Logger logger,
            DevirtualizationManager devirtualizationManager,
            InstructionSetSupport instructionSetSupport,
            RyuJitCompilationOptions options)
            : base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, devirtualizationManager, 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.Specifiable)
                {
                    continue;
                }

                _instructionSetMap.Add(instructionSetInfo.ManagedName, instructionSetInfo.InstructionSet);
            }
        }
Exemplo n.º 3
0
        public override ICompilation ToCompilation()
        {
            ArrayBuilder <CorJitFlag> jitFlagBuilder = new ArrayBuilder <CorJitFlag>();

            switch (_optimizationMode)
            {
            case OptimizationMode.None:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_DEBUG_CODE);
                break;

            case OptimizationMode.PreferSize:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_SIZE_OPT);
                break;

            case OptimizationMode.PreferSpeed:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_SPEED_OPT);
                break;

            default:
                // Not setting a flag results in BLENDED_CODE.
                break;
            }

            if (_optimizationMode != OptimizationMode.None && _profileDataManager != null)
            {
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_BBOPT);
            }

            // Do not bother with debug information if the debug info provider never gives anything.
            if (!(_debugInformationProvider is NullDebugInformationProvider))
            {
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_DEBUG_INFO);
            }

            RyuJitCompilationOptions options = 0;

            if (_methodBodyFolding)
            {
                options |= RyuJitCompilationOptions.MethodBodyFolding;
            }

            if (_singleThreaded)
            {
                options |= RyuJitCompilationOptions.SingleThreadedCompilation;
            }

            if ((_mitigationOptions & SecurityMitigationOptions.ControlFlowGuardAnnotations) != 0)
            {
                options |= RyuJitCompilationOptions.ControlFlowGuardAnnotations;
            }

            var factory = new RyuJitNodeFactory(_context, _compilationGroup, _metadataManager, _interopStubManager, _nameMangler, _vtableSliceProvider, _dictionaryLayoutProvider, GetPreinitializationManager());

            JitConfigProvider.Initialize(_context.Target, jitFlagBuilder.ToArray(), _ryujitOptions);
            DependencyAnalyzerBase <NodeFactory> graph = CreateDependencyGraph(factory, new ObjectNode.ObjectNodeComparer(new CompilerComparer()));

            return(new RyuJitCompilation(graph, factory, _compilationRoots, _ilProvider, _debugInformationProvider, _logger, _devirtualizationManager, _inliningPolicy ?? _compilationGroup, _instructionSetSupport, _profileDataManager, _methodImportationErrorProvider, options));
        }
Exemplo n.º 4
0
        public override ICompilation ToCompilation()
        {
            ArrayBuilder <CorJitFlag> jitFlagBuilder = new ArrayBuilder <CorJitFlag>();

            switch (_optimizationMode)
            {
            case OptimizationMode.None:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_DEBUG_CODE);
                break;

            case OptimizationMode.PreferSize:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_SIZE_OPT);
                break;

            case OptimizationMode.PreferSpeed:
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_SPEED_OPT);
                break;

            default:
                // Not setting a flag results in BLENDED_CODE.
                break;
            }

            // Do not bother with debug information if the debug info provider never gives anything.
            if (!(_debugInformationProvider is NullDebugInformationProvider))
            {
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_DEBUG_INFO);
            }

            if (_context.Target.MaximumSimdVectorLength != SimdVectorLength.None)
            {
                // TODO: AVX
                Debug.Assert(_context.Target.MaximumSimdVectorLength == SimdVectorLength.Vector128Bit);
                jitFlagBuilder.Add(CorJitFlag.CORJIT_FLAG_FEATURE_SIMD);
            }

            RyuJitCompilationOptions options = 0;

            if (_methodBodyFolding)
            {
                options |= RyuJitCompilationOptions.MethodBodyFolding;
            }

            if (_singleThreaded)
            {
                options |= RyuJitCompilationOptions.SingleThreadedCompilation;
            }

            var factory = new RyuJitNodeFactory(_context, _compilationGroup, _metadataManager, _interopStubManager, _nameMangler, _vtableSliceProvider, _dictionaryLayoutProvider);

            var jitConfig = new JitConfigProvider(jitFlagBuilder.ToArray(), _ryujitOptions);
            DependencyAnalyzerBase <NodeFactory> graph = CreateDependencyGraph(factory, new ObjectNode.ObjectNodeComparer(new CompilerComparer()));

            return(new RyuJitCompilation(graph, factory, _compilationRoots, _ilProvider, _debugInformationProvider, _logger, _devirtualizationManager, jitConfig, options));
        }
Exemplo n.º 5
0
 internal RyuJitCompilation(
     DependencyAnalyzerBase <NodeFactory> dependencyGraph,
     NodeFactory nodeFactory,
     IEnumerable <ICompilationRootProvider> roots,
     ILProvider ilProvider,
     DebugInformationProvider debugInformationProvider,
     Logger logger,
     DevirtualizationManager devirtualizationManager,
     RyuJitCompilationOptions options)
     : base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, devirtualizationManager, logger)
 {
     _compilationOptions     = options;
     _hardwareIntrinsicFlags = new ExternSymbolMappedField(nodeFactory.TypeSystemContext.GetWellKnownType(WellKnownType.Int32), "g_cpuFeatures");
 }
Exemplo n.º 6
0
 internal RyuJitCompilation(
     DependencyAnalyzerBase <NodeFactory> dependencyGraph,
     NodeFactory nodeFactory,
     IEnumerable <ICompilationRootProvider> roots,
     ILProvider ilProvider,
     DebugInformationProvider debugInformationProvider,
     PInvokeILEmitterConfiguration pinvokePolicy,
     Logger logger,
     DevirtualizationManager devirtualizationManager,
     JitConfigProvider configProvider,
     RyuJitCompilationOptions options)
     : base(dependencyGraph, nodeFactory, roots, ilProvider, debugInformationProvider, devirtualizationManager, pinvokePolicy, logger)
 {
     _jitConfigProvider  = configProvider;
     _compilationOptions = options;
 }