| File: Compiler\CompilationModuleGroup.ReadyToRun.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 Internal.TypeSystem; using ILCompiler.DependencyAnalysis.ReadyToRun; using Internal.ReadyToRunConstants; using Internal.TypeSystem.Ecma; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace ILCompiler { partial class CompilationModuleGroup { /// <summary> /// If true, the type is fully contained in the current compilation group. /// </summary> public virtual bool ContainsTypeLayout(TypeDesc type) => ContainsType(type); /// <summary> /// Returns true when a given type belongs to the same version bubble as the compilation module group. /// By default return the same outcome as ContainsType. /// </summary> /// <param name="typeDesc">Type to check</param> /// <returns>True if the given type versions with the current compilation module group</returns> public virtual bool VersionsWithType(TypeDesc typeDesc) => ContainsType(typeDesc); /// <summary> /// Returns true when all of the tokens necessary to refer to a given type belong to the same version /// bubble as the compilation module group. By default return the same outcome as VersionsWithType. /// </summary> /// <param name="typeDesc">Type to check</param> /// <returns>True if the given type can safely be referred to within the current compilation module group</returns> public virtual bool VersionsWithTypeReference(TypeDesc typeDesc) => VersionsWithType(typeDesc); /// <summary> /// Returns true when a given method belongs to the same version bubble as the compilation module group. /// By default return the same outcome as ContainsMethodBody. /// </summary> /// <param name="methodDesc">Method to check</param> /// <returns>True if the given method versions with the current compilation module group</returns> public virtual bool VersionsWithMethodBody(MethodDesc methodDesc) => ContainsMethodBody(methodDesc, unboxingStub: false); /// <summary> /// Returns true when a given method does not belong to the same version bubble as the compilation module group, /// but we can support inlining it into other modules. /// </summary> /// <param name="methodDesc">Method to check</param> /// <returns>True if the given method versions with the current compilation module group</returns> public virtual bool CrossModuleInlineable(MethodDesc methodDesc) => false; /// <summary> /// Returns true when a given method does not belong to the same version bubble as the compilation module group, /// but we can support compiling it into the modules being compiled /// </summary> /// <param name="methodDesc">Method to check</param> /// <returns>True if the given method versions with the current compilation module group</returns> public virtual bool CrossModuleCompileable(MethodDesc methodDesc) => false; /// <summary> /// Returns true when a given module belongs to the same version bubble as the compilation module group. /// </summary> /// <param name="module">Module to check</param> /// <returns>True if the given module versions with the current compilation module group</returns> public abstract bool VersionsWithModule(ModuleDesc module); /// <summary> /// Checks if the given PInvoke method can produce a PInvoke stub in the current compilation, depending on the method's /// signature and the compilation policy. /// </summary> /// <param name="method">PInvoke method to check</param> /// <returns>Returns true if the given PInvoke method can produce a PInvoke stub in the current compilation</returns> public abstract bool GeneratesPInvoke(MethodDesc method); /// <summary> /// Retrieve the module-based token for a type that is not part of the version bubble of the current compilation. /// </summary> /// <param name="type">Type to get a module token for</param> /// <param name="token">Module-based token for the type</param> /// <returns>Returns true when the type was referenced by any of the input modules in the current compilation</returns> public abstract bool TryGetModuleTokenForExternalType(TypeDesc type, out ModuleToken token); /// <summary> /// Gets the flags to be stored in the generated ReadyToRun module header. /// </summary> public abstract ReadyToRunFlags GetReadyToRunFlags(); /// <summary> /// When set to true, unconditionally add module overrides to all signatures. This is needed in composite /// build mode so that import cells and instance entry point table are caller module-agnostic. /// </summary> public bool EnforceOwningType(IEcmaModule module) { Debug.Assert(VersionsWithModule((ModuleDesc)module) || module is MutableModule); return IsCompositeBuildMode || module != CompilationModuleSet.Single(); } /// <summary> /// Returns true when the compiler is running in composite build mode i.e. building an arbitrary number of /// input MSIL assemblies into a single output R2R binary. /// </summary> public abstract bool IsCompositeBuildMode { get; } /// <summary> /// Returns true when the compiler is running in large version bubble mode /// </summary> public abstract bool IsInputBubble { get; } /// <summary> /// Returns true when the base type and derived type don't reside in the same version bubble /// in which case the runtime aligns the field base offset. /// </summary> public abstract bool NeedsAlignmentBetweenBaseTypeAndDerived(MetadataType baseType, MetadataType derivedType); /// <summary> /// List of input modules to use for the compilation. /// </summary> public abstract IEnumerable<EcmaModule> CompilationModuleSet { get; } } }