private void CreateNodeCaches() { _typeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { if (_compilationModuleGroup.ContainsType(type)) { if (type.IsGenericDefinition) { return(new GenericDefinitionEETypeNode(this, type)); } else if (type.IsCanonicalDefinitionType(CanonicalFormKind.Any)) { return(new CanonicalDefinitionEETypeNode(this, type)); } else if (type.IsCanonicalSubtype(CanonicalFormKind.Any)) { return(new CanonicalEETypeNode(this, type)); } else { return(new EETypeNode(this, type)); } } else if (_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new ImportedEETypeSymbolNode(this, type)); } else { return(new ExternEETypeSymbolNode(this, type)); } }); _constructedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { if (_compilationModuleGroup.ContainsType(type)) { if (type.IsCanonicalSubtype(CanonicalFormKind.Any)) { return(new CanonicalEETypeNode(this, type)); } else { return(new ConstructedEETypeNode(this, type)); } } else if (_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new ImportedEETypeSymbolNode(this, type)); } else { return(new ExternEETypeSymbolNode(this, type)); } }); _clonedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { // Only types that reside in other binaries should be cloned Debug.Assert(_compilationModuleGroup.ShouldReferenceThroughImportTable(type)); return(new ClonedConstructedEETypeNode(this, type)); }); _nonGCStatics = new NodeCache <MetadataType, NonGCStaticsNode>((MetadataType type) => { return(new NonGCStaticsNode(type, this)); }); _GCStatics = new NodeCache <MetadataType, GCStaticsNode>((MetadataType type) => { return(new GCStaticsNode(type)); }); _GCStaticIndirectionNodes = new NodeCache <MetadataType, EmbeddedObjectNode>((MetadataType type) => { ISymbolNode gcStaticsNode = TypeGCStaticsSymbol(type); Debug.Assert(gcStaticsNode is GCStaticsNode); return(GCStaticsRegion.NewNode((GCStaticsNode)gcStaticsNode)); }); _threadStatics = new NodeCache <MetadataType, ThreadStaticsNode>((MetadataType type) => { return(new ThreadStaticsNode(type, this)); }); _typeThreadStaticIndices = new NodeCache <MetadataType, TypeThreadStaticIndexNode>(type => { return(new TypeThreadStaticIndexNode(type)); }); _GCStaticEETypes = new NodeCache <GCPointerMap, GCStaticEETypeNode>((GCPointerMap gcMap) => { return(new GCStaticEETypeNode(Target, gcMap)); }); _readOnlyDataBlobs = new NodeCache <Tuple <Utf8String, byte[], int>, BlobNode>((Tuple <Utf8String, byte[], int> key) => { return(new BlobNode(key.Item1, ObjectNodeSection.ReadOnlyDataSection, key.Item2, key.Item3)); }, new BlobTupleEqualityComparer()); _externSymbols = new NodeCache <string, ExternSymbolNode>((string name) => { return(new ExternSymbolNode(name)); }); _pInvokeModuleFixups = new NodeCache <string, PInvokeModuleFixupNode>((string name) => { return(new PInvokeModuleFixupNode(name)); }); _pInvokeMethodFixups = new NodeCache <Tuple <string, string>, PInvokeMethodFixupNode>((Tuple <string, string> key) => { return(new PInvokeMethodFixupNode(key.Item1, key.Item2)); }); _methodEntrypoints = new NodeCache <MethodDesc, IMethodNode>(CreateMethodEntrypointNode); _unboxingStubs = new NodeCache <MethodDesc, IMethodNode>(CreateUnboxingStubNode); _fatFunctionPointers = new NodeCache <MethodDesc, FatFunctionPointerNode>(method => { return(new FatFunctionPointerNode(method)); }); _gvmDependenciesNode = new NodeCache <MethodDesc, GVMDependenciesNode>(method => { return(new GVMDependenciesNode(method)); }); _gvmTableEntries = new NodeCache <TypeDesc, TypeGVMEntriesNode>(type => { return(new TypeGVMEntriesNode(type)); }); _shadowConcreteMethods = new NodeCache <MethodDesc, IMethodNode>(CreateShadowConcreteMethodNode); _runtimeDeterminedMethods = new NodeCache <MethodDesc, IMethodNode>(method => { return(new RuntimeDeterminedMethodNode(method, MethodEntrypoint(method.GetCanonMethodTarget(CanonicalFormKind.Specific)))); }); _virtMethods = new NodeCache <MethodDesc, VirtualMethodUseNode>((MethodDesc method) => { return(new VirtualMethodUseNode(method)); }); _readyToRunHelpers = new NodeCache <Tuple <ReadyToRunHelperId, Object>, ISymbolNode>(CreateReadyToRunHelperNode); _genericReadyToRunHelpersFromDict = new NodeCache <Tuple <ReadyToRunHelperId, object, TypeSystemEntity>, ISymbolNode>(data => { return(new ReadyToRunGenericLookupFromDictionaryNode(this, data.Item1, data.Item2, data.Item3)); }); _genericReadyToRunHelpersFromType = new NodeCache <Tuple <ReadyToRunHelperId, object, TypeSystemEntity>, ISymbolNode>(data => { return(new ReadyToRunGenericLookupFromTypeNode(this, data.Item1, data.Item2, data.Item3)); }); _indirectionNodes = new NodeCache <ISymbolNode, IndirectionNode>(symbol => { return(new IndirectionNode(Target, symbol)); }); _frozenStringNodes = new NodeCache <string, FrozenStringNode>((string data) => { return(new FrozenStringNode(data, Target)); }); _interfaceDispatchCells = new NodeCache <Tuple <MethodDesc, string>, InterfaceDispatchCellNode>((Tuple <MethodDesc, string> callSiteCell) => { return(new InterfaceDispatchCellNode(callSiteCell.Item1, callSiteCell.Item2)); }); _interfaceDispatchMaps = new NodeCache <TypeDesc, InterfaceDispatchMapNode>((TypeDesc type) => { return(new InterfaceDispatchMapNode(type)); }); _runtimeMethodHandles = new NodeCache <MethodDesc, RuntimeMethodHandleNode>((MethodDesc method) => { return(new RuntimeMethodHandleNode(method)); }); _runtimeFieldHandles = new NodeCache <FieldDesc, RuntimeFieldHandleNode>((FieldDesc field) => { return(new RuntimeFieldHandleNode(field)); }); _interfaceDispatchMapIndirectionNodes = new NodeCache <TypeDesc, EmbeddedObjectNode>((TypeDesc type) => { var dispatchMap = InterfaceDispatchMap(type); return(DispatchMapTable.NewNodeWithSymbol(dispatchMap, (indirectionNode) => { dispatchMap.SetDispatchMapIndex(this, DispatchMapTable.IndexOfEmbeddedObject(indirectionNode)); })); }); _genericCompositions = new NodeCache <GenericCompositionDetails, GenericCompositionNode>((GenericCompositionDetails details) => { return(new GenericCompositionNode(details)); }); _eagerCctorIndirectionNodes = new NodeCache <MethodDesc, EmbeddedObjectNode>((MethodDesc method) => { Debug.Assert(method.IsStaticConstructor); Debug.Assert(TypeSystemContext.HasEagerStaticConstructor((MetadataType)method.OwningType)); return(EagerCctorTable.NewNode(MethodEntrypoint(method))); }); _vTableNodes = new NodeCache <TypeDesc, VTableSliceNode>((TypeDesc type ) => { if (CompilationModuleGroup.ShouldProduceFullType(type)) { return(new EagerlyBuiltVTableSliceNode(type)); } else { return(new LazilyBuiltVTableSliceNode(type)); } }); _methodGenericDictionaries = new NodeCache <MethodDesc, GenericDictionaryNode>(method => { return(new MethodGenericDictionaryNode(method)); }); _typeGenericDictionaries = new NodeCache <TypeDesc, GenericDictionaryNode>(type => { return(new TypeGenericDictionaryNode(type)); }); _genericDictionaryLayouts = new NodeCache <TypeSystemEntity, DictionaryLayoutNode>(methodOrType => { return(new DictionaryLayoutNode(methodOrType)); }); _stringAllocators = new NodeCache <MethodDesc, IMethodNode>(constructor => { return(new StringAllocatorMethodNode(constructor)); }); NativeLayout = new NativeLayoutHelper(this); }
public ILScannerBuilder GetILScannerBuilder(CompilationModuleGroup compilationGroup = null) { return(new ILScannerBuilder(_context, compilationGroup ?? _compilationGroup, _nameMangler, GetILProvider())); }
private MethodWithGCInfo CreateMethodEntrypointNodeHelper(MethodWithToken targetMethod) { Debug.Assert(CompilationModuleGroup.ContainsMethodBody(targetMethod.Method, false)); return(_localMethodCache.GetOrAdd(targetMethod.Method)); }
private void CreateNodeCaches() { _typeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { if (_compilationModuleGroup.ContainsType(type)) { if (type.IsGenericDefinition) { return(new GenericDefinitionEETypeNode(this, type)); } else if (type.IsCanonicalDefinitionType(CanonicalFormKind.Any)) { return(new CanonicalDefinitionEETypeNode(this, type)); } else if (type.IsCanonicalSubtype(CanonicalFormKind.Any)) { if (Target.Abi == TargetAbi.CoreRT) { return(new CanonicalEETypeNode(this, type)); } else { // Remove this once we stop using the STS dependency analysis. return(new NecessaryCanonicalEETypeNode(this, type)); } } else { return(new EETypeNode(this, type)); } } else if (_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new ImportedEETypeSymbolNode(this, type)); } else { return(new ExternEETypeSymbolNode(this, type)); } }); _constructedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { // Canonical definition types are *not* constructed types (call NecessaryTypeSymbol to get them) Debug.Assert(!type.IsCanonicalDefinitionType(CanonicalFormKind.Any)); if (_compilationModuleGroup.ContainsType(type)) { if (type.IsCanonicalSubtype(CanonicalFormKind.Any)) { return(new CanonicalEETypeNode(this, type)); } else { return(new ConstructedEETypeNode(this, type)); } } else if (_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new ImportedEETypeSymbolNode(this, type)); } else { return(new ExternEETypeSymbolNode(this, type)); } }); _clonedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { // Only types that reside in other binaries should be cloned Debug.Assert(_compilationModuleGroup.ShouldReferenceThroughImportTable(type)); return(new ClonedConstructedEETypeNode(this, type)); }); _nonGCStatics = new NodeCache <MetadataType, NonGCStaticsNode>((MetadataType type) => { return(new NonGCStaticsNode(type, this)); }); _GCStatics = new NodeCache <MetadataType, GCStaticsNode>((MetadataType type) => { return(new GCStaticsNode(type)); }); _GCStaticIndirectionNodes = new NodeCache <MetadataType, EmbeddedObjectNode>((MetadataType type) => { ISymbolNode gcStaticsNode = TypeGCStaticsSymbol(type); Debug.Assert(gcStaticsNode is GCStaticsNode); return(GCStaticsRegion.NewNode((GCStaticsNode)gcStaticsNode)); }); _threadStatics = new NodeCache <MetadataType, ThreadStaticsNode>((MetadataType type) => { return(new ThreadStaticsNode(type, this)); }); _typeThreadStaticIndices = new NodeCache <MetadataType, TypeThreadStaticIndexNode>(type => { return(new TypeThreadStaticIndexNode(type)); }); _GCStaticEETypes = new NodeCache <GCPointerMap, GCStaticEETypeNode>((GCPointerMap gcMap) => { return(new GCStaticEETypeNode(Target, gcMap)); }); _readOnlyDataBlobs = new NodeCache <ReadOnlyDataBlobKey, BlobNode>(key => { return(new BlobNode(key.Name, ObjectNodeSection.ReadOnlyDataSection, key.Data, key.Alignment)); }); _externSymbols = new NodeCache <string, ExternSymbolNode>((string name) => { return(new ExternSymbolNode(name)); }); _pInvokeModuleFixups = new NodeCache <string, PInvokeModuleFixupNode>((string name) => { return(new PInvokeModuleFixupNode(name)); }); _pInvokeMethodFixups = new NodeCache <Tuple <string, string>, PInvokeMethodFixupNode>((Tuple <string, string> key) => { return(new PInvokeMethodFixupNode(key.Item1, key.Item2)); }); _methodEntrypoints = new NodeCache <MethodDesc, IMethodNode>(CreateMethodEntrypointNode); _unboxingStubs = new NodeCache <MethodDesc, IMethodNode>(CreateUnboxingStubNode); _fatFunctionPointers = new NodeCache <MethodKey, FatFunctionPointerNode>(method => { return(new FatFunctionPointerNode(method.Method, method.IsUnboxingStub)); }); _gvmDependenciesNode = new NodeCache <MethodDesc, GVMDependenciesNode>(method => { return(new GVMDependenciesNode(method)); }); _gvmTableEntries = new NodeCache <TypeDesc, TypeGVMEntriesNode>(type => { return(new TypeGVMEntriesNode(type)); }); _shadowConcreteMethods = new NodeCache <MethodKey, IMethodNode>(methodKey => { MethodDesc canonMethod = methodKey.Method.GetCanonMethodTarget(CanonicalFormKind.Specific); if (methodKey.IsUnboxingStub) { return(new ShadowConcreteUnboxingThunkNode(methodKey.Method, MethodEntrypoint(canonMethod, true))); } else { return(new ShadowConcreteMethodNode(methodKey.Method, MethodEntrypoint(canonMethod))); } }); _runtimeDeterminedMethods = new NodeCache <MethodDesc, IMethodNode>(method => { return(new RuntimeDeterminedMethodNode(method, MethodEntrypoint(method.GetCanonMethodTarget(CanonicalFormKind.Specific)))); }); _virtMethods = new NodeCache <MethodDesc, VirtualMethodUseNode>((MethodDesc method) => { // We don't need to track virtual method uses for types that are producing full vtables. // It's a waste of CPU time and memory. Debug.Assert(!CompilationModuleGroup.ShouldProduceFullVTable(method.OwningType)); return(new VirtualMethodUseNode(method)); }); _readyToRunHelpers = new NodeCache <ReadyToRunHelperKey, ISymbolNode>(CreateReadyToRunHelperNode); _genericReadyToRunHelpersFromDict = new NodeCache <ReadyToRunGenericHelperKey, ISymbolNode>(data => { return(new ReadyToRunGenericLookupFromDictionaryNode(this, data.HelperId, data.Target, data.DictionaryOwner)); }); _genericReadyToRunHelpersFromType = new NodeCache <ReadyToRunGenericHelperKey, ISymbolNode>(data => { return(new ReadyToRunGenericLookupFromTypeNode(this, data.HelperId, data.Target, data.DictionaryOwner)); }); _indirectionNodes = new NodeCache <Tuple <ISymbolNode, int>, IndirectionNode>(indirectionData => { return(new IndirectionNode(Target, indirectionData.Item1, indirectionData.Item2)); }); _frozenStringNodes = new NodeCache <string, FrozenStringNode>((string data) => { return(new FrozenStringNode(data, Target)); }); _interfaceDispatchCells = new NodeCache <DispatchCellKey, InterfaceDispatchCellNode>(callSiteCell => { return(new InterfaceDispatchCellNode(callSiteCell.Target, callSiteCell.CallsiteId)); }); _interfaceDispatchMaps = new NodeCache <TypeDesc, InterfaceDispatchMapNode>((TypeDesc type) => { return(new InterfaceDispatchMapNode(type)); }); _runtimeMethodHandles = new NodeCache <MethodDesc, RuntimeMethodHandleNode>((MethodDesc method) => { return(new RuntimeMethodHandleNode(method)); }); _runtimeFieldHandles = new NodeCache <FieldDesc, RuntimeFieldHandleNode>((FieldDesc field) => { return(new RuntimeFieldHandleNode(field)); }); _interfaceDispatchMapIndirectionNodes = new NodeCache <TypeDesc, EmbeddedObjectNode>((TypeDesc type) => { var dispatchMap = InterfaceDispatchMap(type); return(DispatchMapTable.NewNodeWithSymbol(dispatchMap, (indirectionNode) => { dispatchMap.SetDispatchMapIndex(this, DispatchMapTable.IndexOfEmbeddedObject(indirectionNode)); })); }); _genericCompositions = new NodeCache <GenericCompositionDetails, GenericCompositionNode>((GenericCompositionDetails details) => { return(new GenericCompositionNode(details)); }); _eagerCctorIndirectionNodes = new NodeCache <MethodDesc, EmbeddedObjectNode>((MethodDesc method) => { Debug.Assert(method.IsStaticConstructor); Debug.Assert(TypeSystemContext.HasEagerStaticConstructor((MetadataType)method.OwningType)); return(EagerCctorTable.NewNode(MethodEntrypoint(method))); }); _vTableNodes = new NodeCache <TypeDesc, VTableSliceNode>((TypeDesc type ) => { if (CompilationModuleGroup.ShouldProduceFullVTable(type)) { return(new EagerlyBuiltVTableSliceNode(type)); } else { return(new LazilyBuiltVTableSliceNode(type)); } }); _methodGenericDictionaries = new NodeCache <MethodDesc, ISymbolNode>(method => { if (CompilationModuleGroup.ContainsMethod(method)) { return(new MethodGenericDictionaryNode(method)); } else { return(new ImportedMethodGenericDictionaryNode(this, method)); } }); _typeGenericDictionaries = new NodeCache <TypeDesc, ISymbolNode>(type => { if (CompilationModuleGroup.ContainsType(type)) { return(new TypeGenericDictionaryNode(type)); } else { return(new ImportedTypeGenericDictionaryNode(this, type)); } }); _genericDictionaryLayouts = new NodeCache <TypeSystemEntity, DictionaryLayoutNode>(methodOrType => { return(new DictionaryLayoutNode(methodOrType)); }); _stringAllocators = new NodeCache <MethodDesc, IMethodNode>(constructor => { return(new StringAllocatorMethodNode(constructor)); }); NativeLayout = new NativeLayoutHelper(this); }
public NodeFactory(CompilerTypeSystemContext context, TypeInitialization typeInitManager, CompilationModuleGroup compilationModuleGroup, bool cppCodeGen) { _target = context.Target; _context = context; _cppCodeGen = cppCodeGen; _compilationModuleGroup = compilationModuleGroup; TypeInitializationManager = typeInitManager; CreateNodeCaches(); MetadataManager = new MetadataGeneration(); }
public ILScanNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, NameMangler nameMangler) : base(context, compilationModuleGroup, metadataManager, nameMangler, new LazyGenericsDisabledPolicy(), new LazyVTableSliceProvider()) { }
public ModuleTokenResolver(CompilationModuleGroup compilationModuleGroup, CompilerTypeSystemContext typeSystemContext) { _compilationModuleGroup = compilationModuleGroup; CompilerContext = typeSystemContext; }
public PgoValueEmitter(CompilationModuleGroup compilationGroup, ReadyToRunSymbolNodeFactory factory, bool actuallyCaptureOutput) { _compilationGroup = compilationGroup; _symbolFactory = factory; _actuallyCaptureOutput = actuallyCaptureOutput; }
public ILScanNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, InteropStubManager interopStubManager, NameMangler nameMangler, PreinitializationManager preinitManager) : base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), new LazyVTableSliceProvider(), new LazyDictionaryLayoutProvider(), new ExternSymbolsImportedNodeProvider(), preinitManager) { }
public CppCodegenNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager) : base(context, compilationModuleGroup, metadataManager, new CoreRTNameMangler(new CppNodeMangler(), true)) { }
public CppCodegenNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, NameMangler nameMangler) : base(context, compilationModuleGroup, metadataManager, nameMangler, new LazyGenericsDisabledPolicy()) { }
public CppCodegenNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup) : base(context, compilationModuleGroup, new CompilerGeneratedMetadataManager(compilationModuleGroup, context)) { }
public bool CanInline(MethodDesc callerMethod, MethodDesc calleeMethod) { // By default impose no restrictions on inlining return(CompilationModuleGroup.ContainsMethodBody(calleeMethod, unboxingStub: false)); }
public ReadyToRunILProvider(CompilationModuleGroup compilationModuleGroup) { _compilationModuleGroup = compilationModuleGroup; }
public MethodWithGCInfo CompiledMethodNode(MethodDesc method) { Debug.Assert(CompilationModuleGroup.ContainsMethodBody(method, false)); Debug.Assert(method == method.GetCanonMethodTarget(CanonicalFormKind.Specific)); return(_localMethodCache.GetOrAdd(method)); }
public WebAssemblyCodegenNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, InteropStubManager interopStubManager, NameMangler nameMangler, VTableSliceProvider vtableSliceProvider, DictionaryLayoutProvider dictionaryLayoutProvider) : base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), vtableSliceProvider, dictionaryLayoutProvider) { }
private void CreateNodeCaches() { _typeSymbols = new NodeCache <TypeDesc, IEETypeNode>(CreateNecessaryTypeNode); _constructedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>(CreateConstructedTypeNode); _clonedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { // Only types that reside in other binaries should be cloned Debug.Assert(_compilationModuleGroup.ShouldReferenceThroughImportTable(type)); return(new ClonedConstructedEETypeNode(this, type)); }); _importedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { Debug.Assert(_compilationModuleGroup.ShouldReferenceThroughImportTable(type)); return(_importedNodeProvider.ImportedEETypeNode(this, type)); }); _nonGCStatics = new NodeCache <MetadataType, ISortableSymbolNode>((MetadataType type) => { if (_compilationModuleGroup.ContainsType(type) && !_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new NonGCStaticsNode(type, this)); } else { return(_importedNodeProvider.ImportedNonGCStaticNode(this, type)); } }); _GCStatics = new NodeCache <MetadataType, ISortableSymbolNode>((MetadataType type) => { if (_compilationModuleGroup.ContainsType(type) && !_compilationModuleGroup.ShouldReferenceThroughImportTable(type)) { return(new GCStaticsNode(type)); } else { return(_importedNodeProvider.ImportedGCStaticNode(this, type)); } }); _GCStaticsPreInitDataNodes = new NodeCache <MetadataType, GCStaticsPreInitDataNode>((MetadataType type) => { ISymbolNode gcStaticsNode = TypeGCStaticsSymbol(type); Debug.Assert(gcStaticsNode is GCStaticsNode); return(((GCStaticsNode)gcStaticsNode).NewPreInitDataNode()); }); _GCStaticIndirectionNodes = new NodeCache <MetadataType, EmbeddedObjectNode>((MetadataType type) => { ISymbolNode gcStaticsNode = TypeGCStaticsSymbol(type); Debug.Assert(gcStaticsNode is GCStaticsNode); return(GCStaticsRegion.NewNode((GCStaticsNode)gcStaticsNode)); }); _threadStatics = new NodeCache <MetadataType, ISymbolDefinitionNode>(CreateThreadStaticsNode); _typeThreadStaticIndices = new NodeCache <MetadataType, TypeThreadStaticIndexNode>(type => { return(new TypeThreadStaticIndexNode(type)); }); _GCStaticEETypes = new NodeCache <GCPointerMap, GCStaticEETypeNode>((GCPointerMap gcMap) => { return(new GCStaticEETypeNode(Target, gcMap)); }); _readOnlyDataBlobs = new NodeCache <ReadOnlyDataBlobKey, BlobNode>(key => { return(new BlobNode(key.Name, ObjectNodeSection.ReadOnlyDataSection, key.Data, key.Alignment)); }); _externSymbols = new NodeCache <string, ExternSymbolNode>((string name) => { return(new ExternSymbolNode(name)); }); _pInvokeModuleFixups = new NodeCache <PInvokeModuleData, PInvokeModuleFixupNode>((PInvokeModuleData moduleData) => { return(new PInvokeModuleFixupNode(moduleData)); }); _pInvokeMethodFixups = new NodeCache <Tuple <PInvokeModuleData, string, PInvokeFlags>, PInvokeMethodFixupNode>((Tuple <PInvokeModuleData, string, PInvokeFlags> key) => { return(new PInvokeMethodFixupNode(key.Item1, key.Item2, key.Item3)); }); _methodEntrypoints = new NodeCache <MethodDesc, IMethodNode>(CreateMethodEntrypointNode); _unboxingStubs = new NodeCache <MethodDesc, IMethodNode>(CreateUnboxingStubNode); _methodAssociatedData = new NodeCache <IMethodNode, MethodAssociatedDataNode>(methodNode => { return(new MethodAssociatedDataNode(methodNode)); }); _fatFunctionPointers = new NodeCache <MethodKey, FatFunctionPointerNode>(method => { return(new FatFunctionPointerNode(method.Method, method.IsUnboxingStub)); }); _gvmDependenciesNode = new NodeCache <MethodDesc, GVMDependenciesNode>(method => { return(new GVMDependenciesNode(method)); }); _gvmTableEntries = new NodeCache <TypeDesc, TypeGVMEntriesNode>(type => { return(new TypeGVMEntriesNode(type)); }); _reflectableMethods = new NodeCache <MethodDesc, ReflectableMethodNode>(method => { return(new ReflectableMethodNode(method)); }); _shadowConcreteMethods = new NodeCache <MethodKey, IMethodNode>(methodKey => { MethodDesc canonMethod = methodKey.Method.GetCanonMethodTarget(CanonicalFormKind.Specific); if (methodKey.IsUnboxingStub) { return(new ShadowConcreteUnboxingThunkNode(methodKey.Method, MethodEntrypoint(canonMethod, true))); } else { return(new ShadowConcreteMethodNode(methodKey.Method, MethodEntrypoint(canonMethod))); } }); _virtMethods = new NodeCache <MethodDesc, VirtualMethodUseNode>((MethodDesc method) => { // We don't need to track virtual method uses for types that have a vtable with a known layout. // It's a waste of CPU time and memory. Debug.Assert(!VTable(method.OwningType).HasFixedSlots); return(new VirtualMethodUseNode(method)); }); _readyToRunHelpers = new NodeCache <ReadyToRunHelperKey, ISymbolNode>(CreateReadyToRunHelperNode); _genericReadyToRunHelpersFromDict = new NodeCache <ReadyToRunGenericHelperKey, ISymbolNode>(CreateGenericLookupFromDictionaryNode); _genericReadyToRunHelpersFromType = new NodeCache <ReadyToRunGenericHelperKey, ISymbolNode>(CreateGenericLookupFromTypeNode); _indirectionNodes = new NodeCache <ISortableSymbolNode, ISymbolNode>(indirectedNode => { return(new IndirectionNode(Target, indirectedNode, 0)); }); _frozenStringNodes = new NodeCache <string, FrozenStringNode>((string data) => { return(new FrozenStringNode(data, Target)); }); _frozenArrayNodes = new NodeCache <PreInitFieldInfo, FrozenArrayNode>((PreInitFieldInfo fieldInfo) => { return(new FrozenArrayNode(fieldInfo)); }); _interfaceDispatchCells = new NodeCache <DispatchCellKey, InterfaceDispatchCellNode>(callSiteCell => { return(new InterfaceDispatchCellNode(callSiteCell.Target, callSiteCell.CallsiteId)); }); _interfaceDispatchMaps = new NodeCache <TypeDesc, InterfaceDispatchMapNode>((TypeDesc type) => { return(new InterfaceDispatchMapNode(this, type)); }); _sealedVtableNodes = new NodeCache <TypeDesc, SealedVTableNode>((TypeDesc type) => { return(new SealedVTableNode(type)); }); _runtimeMethodHandles = new NodeCache <MethodDesc, RuntimeMethodHandleNode>((MethodDesc method) => { return(new RuntimeMethodHandleNode(method)); }); _runtimeFieldHandles = new NodeCache <FieldDesc, RuntimeFieldHandleNode>((FieldDesc field) => { return(new RuntimeFieldHandleNode(field)); }); _interfaceDispatchMapIndirectionNodes = new NodeCache <TypeDesc, EmbeddedObjectNode>((TypeDesc type) => { return(DispatchMapTable.NewNodeWithSymbol(InterfaceDispatchMap(type))); }); _genericCompositions = new NodeCache <GenericCompositionDetails, GenericCompositionNode>((GenericCompositionDetails details) => { return(new GenericCompositionNode(details)); }); _eagerCctorIndirectionNodes = new NodeCache <MethodDesc, EmbeddedObjectNode>((MethodDesc method) => { Debug.Assert(method.IsStaticConstructor); Debug.Assert(TypeSystemContext.HasEagerStaticConstructor((MetadataType)method.OwningType)); return(EagerCctorTable.NewNode(MethodEntrypoint(method))); }); _delegateMarshalingDataNodes = new NodeCache <DefType, DelegateMarshallingDataNode>(type => { return(new DelegateMarshallingDataNode(type)); }); _structMarshalingDataNodes = new NodeCache <DefType, StructMarshallingDataNode>(type => { return(new StructMarshallingDataNode(type)); }); _vTableNodes = new NodeCache <TypeDesc, VTableSliceNode>((TypeDesc type ) => { if (CompilationModuleGroup.ShouldProduceFullVTable(type)) { return(new EagerlyBuiltVTableSliceNode(type)); } else { return(_vtableSliceProvider.GetSlice(type)); } }); _methodGenericDictionaries = new NodeCache <MethodDesc, ISortableSymbolNode>(method => { if (CompilationModuleGroup.ContainsMethodDictionary(method)) { return(new MethodGenericDictionaryNode(method, this)); } else { return(_importedNodeProvider.ImportedMethodDictionaryNode(this, method)); } }); _typeGenericDictionaries = new NodeCache <TypeDesc, ISortableSymbolNode>(type => { if (CompilationModuleGroup.ContainsTypeDictionary(type)) { Debug.Assert(!this.LazyGenericsPolicy.UsesLazyGenerics(type)); return(new TypeGenericDictionaryNode(type, this)); } else { return(_importedNodeProvider.ImportedTypeDictionaryNode(this, type)); } }); _typesWithMetadata = new NodeCache <MetadataType, TypeMetadataNode>(type => { return(new TypeMetadataNode(type)); }); _methodsWithMetadata = new NodeCache <MethodDesc, MethodMetadataNode>(method => { return(new MethodMetadataNode(method)); }); _fieldsWithMetadata = new NodeCache <FieldDesc, FieldMetadataNode>(field => { return(new FieldMetadataNode(field)); }); _modulesWithMetadata = new NodeCache <ModuleDesc, ModuleMetadataNode>(module => { return(new ModuleMetadataNode(module)); }); _genericDictionaryLayouts = new NodeCache <TypeSystemEntity, DictionaryLayoutNode>(_dictionaryLayoutProvider.GetLayout); _stringAllocators = new NodeCache <MethodDesc, IMethodNode>(constructor => { return(new StringAllocatorMethodNode(constructor)); }); NativeLayout = new NativeLayoutHelper(this); WindowsDebugData = new WindowsDebugDataHelper(this); }
private void CreateNodeCaches() { _typeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { if (_compilationModuleGroup.ContainsType(type)) { if (type.IsGenericDefinition) { return(new GenericDefinitionEETypeNode(type)); } else { return(new EETypeNode(type)); } } else { return(new ExternEETypeSymbolNode(type)); } }); _constructedTypeSymbols = new NodeCache <TypeDesc, IEETypeNode>((TypeDesc type) => { if (_compilationModuleGroup.ContainsType(type)) { return(new ConstructedEETypeNode(type)); } else { return(new ExternEETypeSymbolNode(type)); } }); _nonGCStatics = new NodeCache <MetadataType, NonGCStaticsNode>((MetadataType type) => { return(new NonGCStaticsNode(type, this)); }); _GCStatics = new NodeCache <MetadataType, GCStaticsNode>((MetadataType type) => { return(new GCStaticsNode(type)); }); _GCStaticIndirectionNodes = new NodeCache <MetadataType, EmbeddedObjectNode>((MetadataType type) => { ISymbolNode gcStaticsNode = TypeGCStaticsSymbol(type); Debug.Assert(gcStaticsNode is GCStaticsNode); return(GCStaticsRegion.NewNode((GCStaticsNode)gcStaticsNode)); }); _threadStatics = new NodeCache <MetadataType, ThreadStaticsNode>((MetadataType type) => { return(new ThreadStaticsNode(type, this)); }); _GCStaticEETypes = new NodeCache <GCPointerMap, GCStaticEETypeNode>((GCPointerMap gcMap) => { return(new GCStaticEETypeNode(Target, gcMap)); }); _readOnlyDataBlobs = new NodeCache <Tuple <string, byte[], int>, BlobNode>((Tuple <string, byte[], int> key) => { return(new BlobNode(key.Item1, ObjectNodeSection.ReadOnlyDataSection, key.Item2, key.Item3)); }, new BlobTupleEqualityComparer()); _externSymbols = new NodeCache <string, ExternSymbolNode>((string name) => { return(new ExternSymbolNode(name)); }); _pInvokeModuleFixups = new NodeCache <string, PInvokeModuleFixupNode>((string name) => { return(new PInvokeModuleFixupNode(name)); }); _pInvokeMethodFixups = new NodeCache <Tuple <string, string>, PInvokeMethodFixupNode>((Tuple <string, string> key) => { return(new PInvokeMethodFixupNode(key.Item1, key.Item2)); }); _internalSymbols = new NodeCache <Tuple <ObjectNode, int, string>, ObjectAndOffsetSymbolNode>( (Tuple <ObjectNode, int, string> key) => { return(new ObjectAndOffsetSymbolNode(key.Item1, key.Item2, key.Item3)); }); _methodEntrypoints = new NodeCache <MethodDesc, IMethodNode>(CreateMethodEntrypointNode); _unboxingStubs = new NodeCache <MethodDesc, IMethodNode>(CreateUnboxingStubNode); _virtMethods = new NodeCache <MethodDesc, VirtualMethodUseNode>((MethodDesc method) => { return(new VirtualMethodUseNode(method)); }); _readyToRunHelpers = new NodeCache <Tuple <ReadyToRunHelperId, Object>, ISymbolNode>(CreateReadyToRunHelperNode); _stringDataNodes = new NodeCache <string, StringDataNode>((string data) => { return(new StringDataNode(data)); }); _stringIndirectionNodes = new NodeCache <string, StringIndirectionNode>((string data) => { return(new StringIndirectionNode(data)); }); _typeOptionalFields = new NodeCache <EETypeOptionalFieldsBuilder, EETypeOptionalFieldsNode>((EETypeOptionalFieldsBuilder fieldBuilder) => { return(new EETypeOptionalFieldsNode(fieldBuilder, this.Target)); }); _interfaceDispatchCells = new NodeCache <MethodDesc, InterfaceDispatchCellNode>((MethodDesc method) => { return(new InterfaceDispatchCellNode(method)); }); _interfaceDispatchMaps = new NodeCache <TypeDesc, InterfaceDispatchMapNode>((TypeDesc type) => { return(new InterfaceDispatchMapNode(type)); }); _interfaceDispatchMapIndirectionNodes = new NodeCache <TypeDesc, EmbeddedObjectNode>((TypeDesc type) => { var dispatchMap = InterfaceDispatchMap(type); return(DispatchMapTable.NewNodeWithSymbol(dispatchMap, (indirectionNode) => { dispatchMap.SetDispatchMapIndex(this, DispatchMapTable.IndexOfEmbeddedObject(indirectionNode)); })); }); _genericCompositions = new NodeCache <GenericCompositionDetails, GenericCompositionNode>((GenericCompositionDetails details) => { return(new GenericCompositionNode(details)); }); _eagerCctorIndirectionNodes = new NodeCache <MethodDesc, EmbeddedObjectNode>((MethodDesc method) => { Debug.Assert(method.IsStaticConstructor); Debug.Assert(TypeSystemContext.HasEagerStaticConstructor((MetadataType)method.OwningType)); return(EagerCctorTable.NewNode(MethodEntrypoint(method))); }); _vTableNodes = new NodeCache <TypeDesc, VTableSliceNode>((TypeDesc type ) => { if (CompilationModuleGroup.ShouldProduceFullType(type)) { return(new EagerlyBuiltVTableSliceNode(type)); } else { return(new LazilyBuiltVTableSliceNode(type)); } }); }
public RyuJitNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, InteropStubManager interopStubManager, NameMangler nameMangler, VTableSliceProvider vtableSliceProvider, DictionaryLayoutProvider dictionaryLayoutProvider) : base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), vtableSliceProvider, dictionaryLayoutProvider, new ExternSymbolsImportedNodeProvider()) { }
public CppCodegenNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup) : base(context, compilationModuleGroup) { }
public DevirtualizationManager(CompilationModuleGroup compilationModuleGroup) { _compilationModuleGroup = compilationModuleGroup; }
public RyuJitNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup) : base(context, compilationModuleGroup, new CompilerGeneratedMetadataManager(compilationModuleGroup, context), new CoreRTNameMangler(false)) { }
public RyuJitNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup) : base(context, compilationModuleGroup) { }
public RyuJitNodeFactory(CompilerTypeSystemContext context, CompilationModuleGroup compilationModuleGroup, MetadataManager metadataManager, InteropStubManager interopStubManager, NameMangler nameMangler, VTableSliceProvider vtableSliceProvider) : base(context, compilationModuleGroup, metadataManager, interopStubManager, nameMangler, new LazyGenericsDisabledPolicy(), vtableSliceProvider) { }