File: Compiler\ReadyToRunTypeMapManager.cs
Web Access
Project: src\src\runtime\src\coreclr\tools\aot\ILCompiler.ReadyToRun\ILCompiler.ReadyToRun.csproj (ILCompiler.ReadyToRun)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using ILCompiler.DependencyAnalysis;
using ILCompiler.DependencyAnalysis.ReadyToRun;
using ILCompiler.DependencyAnalysisFramework;
using Internal.Runtime;
using Internal.TypeSystem;

namespace ILCompiler.ReadyToRun
{
    public sealed class ReadyToRunTypeMapManager(ModuleDesc triggeringModule, TypeMapMetadata assemblyTypeMaps) : TypeMapManager
    {
        private ImportReferenceProvider _importReferenceProvider;

        public override ModuleDesc AssociatedModule => triggeringModule;

        public override void AttachToDependencyGraph(DependencyAnalyzerBase<NodeFactory> graph)
        {
            base.AttachToDependencyGraph(graph);
            foreach (var map in GetExternalTypeMaps())
            {
                graph.AddRoot(map, "External type map");
            }
            foreach (var map in GetProxyTypeMaps())
            {
                graph.AddRoot(map, "Proxy type map");
            }
        }

        protected override bool IsEmpty => assemblyTypeMaps.IsEmpty;

        public override void AddCompilationRoots(IRootingServiceProvider rootProvider)
        {
        }

        internal override IEnumerable<IExternalTypeMapNode> GetExternalTypeMaps()
        {
            foreach (var map in assemblyTypeMaps.Maps)
            {
                yield return new ReadyToRunExternalTypeMapNode(triggeringModule, map.Key, map.Value, _importReferenceProvider);
            }
        }

        internal override IEnumerable<IProxyTypeMapNode> GetProxyTypeMaps()
        {
            foreach (var map in assemblyTypeMaps.Maps)
            {
                yield return new ReadyToRunProxyTypeMapNode(triggeringModule, map.Key, map.Value, _importReferenceProvider);
            }
        }

        public void AddToReadyToRunHeader(ReadyToRunHeaderNode header, NodeFactory nodeFactory, ImportReferenceProvider importReferenceProvider)
        {
            _importReferenceProvider = importReferenceProvider;

            if (IsEmpty)
                return;

            header.Add(ReadyToRunSectionType.ExternalTypeMaps, new ExternalTypeMapObjectNode(this, importReferenceProvider));
            header.Add(ReadyToRunSectionType.ProxyTypeMaps, new ProxyTypeMapObjectNode(this, importReferenceProvider));
            header.Add(ReadyToRunSectionType.TypeMapAssemblyTargets, new TypeMapAssemblyTargetsNode(assemblyTypeMaps, importReferenceProvider));
        }
    }
}