| File: Compiler\DependencyAnalysis\ReadyToRun\Import.cs | Web Access |
| Project: 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; using System.Collections.Generic; using Internal.Text; using Internal.TypeSystem; namespace ILCompiler.DependencyAnalysis.ReadyToRun { /// <summary> /// This class represents a single indirection cell in one of the import tables. /// </summary> public class Import : EmbeddedObjectNode, ISymbolDefinitionNode, ISortableSymbolNode, IObjectNodeWithAlignment { public readonly ImportSectionNode Table; internal readonly SignatureEmbeddedPointerIndirectionNode ImportSignature; internal readonly MethodDesc CallingMethod; public Signature Signature => ImportSignature.Target; public Import(ImportSectionNode tableNode, Signature importSignature, MethodDesc callingMethod = null) { Table = tableNode; CallingMethod = callingMethod; ImportSignature = new SignatureEmbeddedPointerIndirectionNode(this, importSignature); } protected override void OnMarked(NodeFactory factory) { Table.AddImport(factory, this); } protected override string GetName(NodeFactory factory) { Utf8StringBuilder sb = new Utf8StringBuilder(); AppendMangledName(factory.NameMangler, sb); return sb.ToString(); } public override int ClassCode => 667823013; public virtual bool EmitPrecode => Table.EmitPrecode; // Import cells live in a pointer-aligned import section whose entries are 'EntrySize' bytes // each, so every cell is guaranteed to be aligned to 'EntrySize' (the pointer size). Keep // this in sync with the alignment applied by the containing ImportSectionNode. public int GetAlignment(NodeFactory factory) => Table.EntrySize; public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly) { // This needs to be an empty target pointer since it will be filled in with Module* // when loaded by CoreCLR dataBuilder.EmitZeroPointer(); } public virtual void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb) { sb.Append(Table.Name); sb.Append("->"u8); ImportSignature.AppendMangledName(nameMangler, sb); } public override bool StaticDependenciesAreComputed => true; public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory factory) { return new DependencyListEntry[] { new DependencyListEntry(ImportSignature, "Signature for ready-to-run fixup import") }; } public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { Import otherNode = (Import)other; int result = comparer.Compare(CallingMethod, otherNode.CallingMethod); if (result != 0) return result; result = comparer.Compare(ImportSignature.Target, otherNode.ImportSignature.Target); if (result != 0) return result; return Table.CompareToImpl(otherNode.Table, comparer); } public override bool RepresentsIndirectionCell => true; int ISymbolDefinitionNode.Offset => OffsetFromBeginningOfArray; int ISymbolNode.Offset => 0; } }