public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory context) { // TODO: https://github.com/dotnet/corert/issues/3224 // Reflection invoke stub handling is here because in the current reflection model we reflection-enable // all methods that are compiled. Ideally the list of reflection enabled methods should be known before // we even start the compilation process (with the invocation stubs being compilation roots like any other). // The existing model has it's problems: e.g. the invocability of the method depends on inliner decisions. if (context.MetadataManager.IsReflectionInvokable(_method) && _method.IsAbstract) { DependencyList dependencies = new DependencyList(); if (context.MetadataManager.HasReflectionInvokeStubForInvokableMethod(_method) && !_method.IsCanonicalMethod(CanonicalFormKind.Any)) { MethodDesc invokeStub = context.MetadataManager.GetReflectionInvokeStub(_method); MethodDesc canonInvokeStub = invokeStub.GetCanonMethodTarget(CanonicalFormKind.Specific); if (invokeStub != canonInvokeStub) { dependencies.Add(new DependencyListEntry(context.MetadataManager.DynamicInvokeTemplateData, "Reflection invoke template data")); context.MetadataManager.DynamicInvokeTemplateData.AddDependenciesDueToInvokeTemplatePresence(ref dependencies, context, canonInvokeStub); } else { dependencies.Add(new DependencyListEntry(context.MethodEntrypoint(invokeStub), "Reflection invoke")); } } dependencies.AddRange(ReflectionVirtualInvokeMapNode.GetVirtualInvokeMapDependencies(context, _method)); return(dependencies); } return(Array.Empty <DependencyListEntry>()); }
public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory) { DependencyList dependencies = new DependencyList(); // Make sure the canonical body gets generated dependencies.Add(new DependencyListEntry(CanonicalMethodNode, "Canonical body")); // Instantiate the runtime determined dependencies of the canonical method body // with the concrete instantiation of the method to get concrete dependencies. Instantiation typeInst = Method.OwningType.Instantiation; Instantiation methodInst = Method.Instantiation; IEnumerable <DependencyListEntry> staticDependencies = CanonicalMethodNode.GetStaticDependencies(factory); if (staticDependencies != null) { foreach (DependencyListEntry canonDep in staticDependencies) { var runtimeDep = canonDep.Node as INodeWithRuntimeDeterminedDependencies; if (runtimeDep != null) { dependencies.AddRange(runtimeDep.InstantiateDependencies(factory, typeInst, methodInst)); } } } if (factory.Target.Abi == TargetAbi.CoreRT) { // TODO: https://github.com/dotnet/corert/issues/3224 // Reflection invoke stub handling is here because in the current reflection model we reflection-enable // all methods that are compiled. Ideally the list of reflection enabled methods should be known before // we even start the compilation process (with the invocation stubs being compilation roots like any other). // The existing model has it's problems: e.g. the invocability of the method depends on inliner decisions. if (factory.MetadataManager.HasReflectionInvokeStub(Method)) { MethodDesc canonInvokeStub = factory.MetadataManager.GetCanonicalReflectionInvokeStub(Method); if (canonInvokeStub.IsSharedByGenericInstantiations) { dependencies.Add(new DependencyListEntry(factory.MetadataManager.DynamicInvokeTemplateData, "Reflection invoke template data")); factory.MetadataManager.DynamicInvokeTemplateData.AddDependenciesDueToInvokeTemplatePresence(ref dependencies, factory, canonInvokeStub); } else { dependencies.Add(new DependencyListEntry(factory.MethodEntrypoint(canonInvokeStub), "Reflection invoke")); } } } if (Method.HasInstantiation) { if (Method.IsVirtual) { dependencies.Add(new DependencyListEntry(factory.GVMDependencies(Method), "GVM Dependencies Support for method dictionary")); } // Dictionary dependency dependencies.Add(new DependencyListEntry(factory.MethodGenericDictionary(Method), "Method dictionary")); } return(dependencies); }
public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory) { DependencyList dependencies = new DependencyList(); // Make sure the canonical body gets generated dependencies.Add(new DependencyListEntry(CanonicalMethodNode, "Canonical body")); // Instantiate the runtime determined dependencies of the canonical method body // with the concrete instantiation of the method to get concrete dependencies. Instantiation typeInst = Method.OwningType.Instantiation; Instantiation methodInst = Method.Instantiation; IEnumerable <DependencyListEntry> staticDependencies = CanonicalMethodNode.GetStaticDependencies(factory); if (staticDependencies != null) { foreach (DependencyListEntry canonDep in staticDependencies) { var runtimeDep = canonDep.Node as INodeWithRuntimeDeterminedDependencies; if (runtimeDep != null) { dependencies.AddRange(runtimeDep.InstantiateDependencies(factory, typeInst, methodInst)); } } } return(dependencies); }
public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory context) { if (_staticDependencies == null) { _staticDependencies = new DependencyList(); foreach (var entry in ScanForGenericVirtualMethodEntries()) { _staticDependencies.AddRange(GenericVirtualMethodTableNode.GetGenericVirtualMethodImplementationDependencies(context, entry.CallingMethod, entry.ImplementationMethod)); } foreach (var entry in ScanForInterfaceGenericVirtualMethodEntries()) { _staticDependencies.AddRange(InterfaceGenericVirtualMethodTableNode.GetGenericVirtualMethodImplementationDependencies(context, entry.CallingMethod, entry.ImplementationType, entry.ImplementationMethod)); } } return(_staticDependencies); }
public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory) { _dependenciesQueried = true; DependencyList dependencies = null; CodeBasedDependencyAlgorithm.AddDependenciesDueToMethodCodePresence(ref dependencies, factory, _method); if (_compilationDiscoveredDependencies != null) { dependencies.AddRange(_compilationDiscoveredDependencies); } return(dependencies); }
public override IEnumerable <DependencyListEntry> GetStaticDependencies(NodeFactory factory) { _dependenciesQueried = true; DependencyList dependencies = null; CodeBasedDependencyAlgorithm.AddDependenciesDueToMethodCodePresence(ref dependencies, factory, _method); if (_compilationDiscoveredDependencies != null) { dependencies = dependencies ?? new DependencyList(); dependencies.AddRange(_compilationDiscoveredDependencies); } if (MethodAssociatedDataNode.MethodHasAssociatedData(factory, this)) { dependencies = dependencies ?? new DependencyList(); dependencies.Add(new DependencyListEntry(factory.MethodAssociatedData(this), "Method associated data")); } return(dependencies); }