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

using ILCompiler.DependencyAnalysis;
using ILCompiler.Win32Resources;

using Internal.Text;
using Internal.TypeSystem.Ecma;

namespace ILCompiler
{
    public class Win32ResourcesRootProvider : ICompilationRootProvider
    {
        private readonly EcmaModule _resourceModule;

        public Win32ResourcesRootProvider(EcmaModule resourceModule)
            => _resourceModule = resourceModule;

        void ICompilationRootProvider.AddCompilationRoots(IRootingServiceProvider rootProvider)
        {
            var resData = new ResourceData(_resourceModule);
            if (!resData.IsEmpty)
            {
                var rsrc1 = new ObjectDataNode("_rsrc1", new ObjectNodeSection(".rsrc$01", SectionType.ReadOnly));
                var rsrc2 = new ObjectDataNode("_rsrc2", new ObjectNodeSection(".rsrc$02", SectionType.ReadOnly));

                var rsrc1data = new ObjectDataBuilder(_resourceModule.Context.Target, relocsOnly: true);
                rsrc1data.AddSymbol(rsrc1);
                var rsrc2data = new ObjectDataBuilder(_resourceModule.Context.Target, relocsOnly: true);
                rsrc2data.AddSymbol(rsrc2);

                resData.WriteResources(rsrc2, ref rsrc1data, ref rsrc2data);

                rsrc1.SetData(rsrc1data.ToObjectData());
                rsrc2.SetData(rsrc2data.ToObjectData());

                rootProvider.AddCompilationRoot(rsrc1, "Resource section from input module");
            }
        }

        private sealed class ObjectDataNode : ObjectNode, ISymbolDefinitionNode
        {
            private readonly string _name;
            private readonly ObjectNodeSection _section;
            private ObjectData _data;

            public ObjectDataNode(string name, ObjectNodeSection section)
                => (_name, _section) = (name, section);

            public int Offset => 0;

            public override bool IsShareable => false;

            public override int ClassCode => -45678932;

            public override bool StaticDependenciesAreComputed => true;

            public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb) => sb.Append(_name);

            public override ObjectNodeSection GetSection(NodeFactory factory) => _section;

            protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);

            public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) => _data;

            public override int CompareToImpl(ISortableNode other, CompilerComparer comparer)
                => _name.CompareTo(((ObjectDataNode)other)._name);

            public void SetData(ObjectData data) => _data = data;
        }
    }
}