| File: Compiler\DependencyAnalysis\ClassConstructorContextMap.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 System; using Internal.NativeFormat; using Internal.Text; using Internal.TypeSystem; using Debug = System.Diagnostics.Debug; namespace ILCompiler.DependencyAnalysis { internal sealed class ClassConstructorContextMap : ObjectNode, ISymbolDefinitionNode { private ExternalReferencesTableNode _externalReferences; public ClassConstructorContextMap(ExternalReferencesTableNode externalReferences) { _externalReferences = externalReferences; } public void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb) { sb.Append(nameMangler.CompilationUnitPrefix).Append("__type_to_cctorContext_map"u8); } public int Offset => 0; public override ObjectNodeSection GetSection(NodeFactory factory) => _externalReferences.GetSection(factory); public override bool IsShareable => false; public override bool StaticDependenciesAreComputed => true; protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler); public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) { // This node does not trigger generation of other nodes. if (relocsOnly) return new ObjectData(Array.Empty<byte>(), Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this }); var writer = new NativeWriter(); var typeMapHashTable = new VertexHashtable(); Section hashTableSection = writer.NewSection(); hashTableSection.Place(typeMapHashTable); foreach (var node in factory.MetadataManager.GetCctorContextMapping()) { MetadataType type = node.Type; Debug.Assert(factory.PreinitializationManager.HasLazyStaticConstructor(type)); // If this type doesn't generate an MethodTable in the current compilation, don't report it in the table. // If nobody can get to the MethodTable, they can't ask to run the cctor. We don't need to force generate it. if (!factory.MetadataManager.TypeGeneratesEEType(type)) continue; // Hash table is hashed by the hashcode of the owning type. // Each entry has: the MethodTable of the type, followed by the non-GC static base. // The non-GC static base is prefixed by the class constructor context. Vertex vertex = writer.GetTuple( writer.GetUnsignedConstant(_externalReferences.GetIndex(factory.NecessaryTypeSymbol(type))), writer.GetUnsignedConstant(_externalReferences.GetIndex(node)) ); int hashCode = type.GetHashCode(); typeMapHashTable.Append((uint)hashCode, hashTableSection.Place(vertex)); } byte[] hashTableBytes = writer.Save(); return new ObjectData(hashTableBytes, Array.Empty<Relocation>(), 1, new ISymbolDefinitionNode[] { this }); } protected internal override int Phase => (int)ObjectNodePhase.Ordered; public override int ClassCode => (int)ObjectNodeOrder.ClassConstructorContextMap; } }