| File: Compiler\Win32ResourcesRootProvider.cs | Web Access |
| Project: 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; } } }