Ejemplo n.º 1
0
        private ISymbolNode GenericLookupTypeHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            object helperArgument,
            GenericContext methodContext)
        {
            TypeDesc typeArgument;

            if (helperArgument is MethodWithToken methodWithToken)
            {
                typeArgument = methodWithToken.Method.OwningType;
            }
            else if (helperArgument is FieldDesc fieldDesc)
            {
                typeArgument = fieldDesc.OwningType;
            }
            else
            {
                typeArgument = (TypeDesc)helperArgument;
            }

            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext);

            return(_genericLookupHelpers.GetOrAdd(key));
        }
        private ISymbolNode GenericLookupMethodHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            MethodWithToken methodArgument,
            TypeDesc constrainedType,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, fieldArgument: null, methodContext);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperMethodImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    methodArgument,
                    useInstantiatingStub: false,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, constrainedType, methodArgument, fieldArgument: null, methodContext, signatureContext),
                    signatureContext);
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
Ejemplo n.º 3
0
 public GenericLookupKey(CORINFO_RUNTIME_LOOKUP_KIND lookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, TypeDesc contextType)
 {
     LookupKind     = lookupKind;
     FixupKind      = fixupKind;
     TypeArgument   = typeArgument;
     MethodArgument = methodArgument;
     ContextType    = contextType;
 }
Ejemplo n.º 4
0
        private ISymbolNode GenericLookupMethodHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            MethodWithToken methodArgument,
            GenericContext methodContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, fieldArgument: null, methodContext);

            return(_genericLookupHelpers.GetOrAdd(key));
        }
Ejemplo n.º 5
0
        public ISymbolNode GenericLookupHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunHelperId helperId,
            object helperArgument,
            TypeDesc contextType,
            SignatureContext signatureContext)
        {
            switch (helperId)
            {
            case ReadyToRunHelperId.NecessaryTypeHandle:
            case ReadyToRunHelperId.TypeHandle:
                return(GenericLookupTypeHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.READYTORUN_FIXUP_TypeHandle,
                           (TypeDesc)helperArgument,
                           contextType,
                           signatureContext));

            case ReadyToRunHelperId.MethodHandle:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.READYTORUN_FIXUP_MethodHandle,
                           (MethodWithToken)helperArgument,
                           contextType,
                           signatureContext));

            case ReadyToRunHelperId.MethodEntry:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.READYTORUN_FIXUP_MethodEntry,
                           (MethodWithToken)helperArgument,
                           contextType,
                           signatureContext));

            case ReadyToRunHelperId.MethodDictionary:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.READYTORUN_FIXUP_MethodHandle,
                           (MethodWithToken)helperArgument,
                           contextType,
                           signatureContext));

            case ReadyToRunHelperId.VirtualDispatchCell:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.READYTORUN_FIXUP_VirtualEntry,
                           (MethodWithToken)helperArgument,
                           contextType,
                           signatureContext));

            default:
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 6
0
        private ISymbolNode GenericLookupFieldHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            FieldDesc fieldArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext, signatureContext);

            return(_genericLookupHelpers.GetOrAdd(key));
        }
Ejemplo n.º 7
0
 public GenericLookupKey(
     CORINFO_RUNTIME_LOOKUP_KIND lookupKind,
     ReadyToRunFixupKind fixupKind,
     TypeDesc typeArgument,
     MethodWithToken methodArgument,
     FieldDesc fieldArgument,
     GenericContext methodContext)
 {
     LookupKind     = lookupKind;
     FixupKind      = fixupKind;
     TypeArgument   = typeArgument;
     MethodArgument = methodArgument;
     FieldArgument  = fieldArgument;
     MethodContext  = methodContext;
 }
Ejemplo n.º 8
0
 public GenericLookupSignature(
     CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
     ReadyToRunFixupKind fixupKind,
     TypeDesc typeArgument,
     MethodWithToken methodArgument,
     GenericContext methodContext,
     SignatureContext signatureContext)
 {
     _runtimeLookupKind = runtimeLookupKind;
     _fixupKind         = fixupKind;
     _typeArgument      = typeArgument;
     _methodArgument    = methodArgument;
     _methodContext     = methodContext;
     _signatureContext  = signatureContext;
 }
Ejemplo n.º 9
0
 public GenericLookupSignature(
     CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
     ReadyToRunFixupKind fixupKind,
     TypeDesc typeArgument,
     MethodWithToken methodArgument,
     FieldDesc fieldArgument,
     GenericContext methodContext)
 {
     Debug.Assert(typeArgument != null || methodArgument != null || fieldArgument != null);
     _runtimeLookupKind = runtimeLookupKind;
     _fixupKind         = fixupKind;
     _typeArgument      = typeArgument;
     _methodArgument    = methodArgument;
     _fieldArgument     = fieldArgument;
     _methodContext     = methodContext;
 }
Ejemplo n.º 10
0
        private ISymbolNode GenericLookupTypeHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            TypeDesc typeArgument,
            TypeDesc contextType,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, contextType);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, contextType, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
Ejemplo n.º 11
0
        private ISymbolNode GenericLookupFieldHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            FieldDesc fieldArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.ReadyToRunHelper.DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
        private ISymbolNode GenericLookupTypeHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            object helperArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            TypeDesc typeArgument;

            if (helperArgument is MethodWithToken methodWithToken)
            {
                typeArgument = methodWithToken.Method.OwningType;
            }
            else if (helperArgument is FieldDesc fieldDesc)
            {
                typeArgument = fieldDesc.OwningType;
            }
            else
            {
                typeArgument = (TypeDesc)helperArgument;
            }

            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
Ejemplo n.º 13
0
        public GenericLookupSignature(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            TypeDesc typeArgument,
            MethodWithToken methodArgument,
            FieldDesc fieldArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            Debug.Assert(typeArgument != null || methodArgument != null || fieldArgument != null);
            _runtimeLookupKind = runtimeLookupKind;
            _fixupKind         = fixupKind;
            _typeArgument      = typeArgument;
            _methodArgument    = methodArgument;
            _fieldArgument     = fieldArgument;
            _methodContext     = methodContext;
            _signatureContext  = signatureContext;

            // Ensure types in signature are loadable and resolvable, otherwise we'll fail later while emitting the signature
            if (typeArgument != null)
            {
                signatureContext.Resolver.CompilerContext.EnsureLoadableType(typeArgument);
            }
            if (fieldArgument != null)
            {
                signatureContext.Resolver.CompilerContext.EnsureLoadableType(fieldArgument.OwningType);
            }
            if (methodArgument != null)
            {
                signatureContext.Resolver.CompilerContext.EnsureLoadableMethod(methodArgument.Method);
                if (methodArgument.ConstrainedType != null)
                {
                    signatureContext.Resolver.CompilerContext.EnsureLoadableType(methodArgument.ConstrainedType);
                }
            }
        }
Ejemplo n.º 14
0
        public ISymbolNode GenericLookupHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunHelperId helperId,
            object helperArgument,
            GenericContext methodContext)
        {
            switch (helperId)
            {
            case ReadyToRunHelperId.TypeHandle:
                return(GenericLookupTypeHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.TypeHandle,
                           helperArgument,
                           methodContext));

            case ReadyToRunHelperId.MethodHandle:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.MethodHandle,
                           (MethodWithToken)helperArgument,
                           methodContext));

            case ReadyToRunHelperId.MethodEntry:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.MethodEntry,
                           (MethodWithToken)helperArgument,
                           methodContext));

            case ReadyToRunHelperId.MethodDictionary:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.MethodHandle,
                           (MethodWithToken)helperArgument,
                           methodContext));

            case ReadyToRunHelperId.TypeDictionary:
                return(GenericLookupTypeHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.TypeDictionary,
                           (TypeDesc)helperArgument,
                           methodContext));

            case ReadyToRunHelperId.VirtualDispatchCell:
                return(GenericLookupMethodHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.VirtualEntry,
                           (MethodWithToken)helperArgument,
                           methodContext));

            case ReadyToRunHelperId.FieldHandle:
                return(GenericLookupFieldHelper(
                           runtimeLookupKind,
                           ReadyToRunFixupKind.FieldHandle,
                           (FieldDesc)helperArgument,
                           methodContext));

            default:
                throw new NotImplementedException(helperId.ToString());
            }
        }
Ejemplo n.º 15
0
        private ISymbolNode GetGenericLookupHelper(CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunHelperId helperId, object helperArgument)
        {
            if (runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_THISOBJ
                || runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_CLASSPARAM)
            {
                return _compilation.NodeFactory.ReadyToRunHelperFromTypeLookup(helperId, helperArgument, MethodBeingCompiled.OwningType);
            }

            Debug.Assert(runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_METHODPARAM);
            return _compilation.NodeFactory.ReadyToRunHelperFromDictionaryLookup(helperId, helperArgument, MethodBeingCompiled);
        }