private void getFunctionEntryPoint(CORINFO_METHOD_STRUCT_ *ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { throw new RequiresRuntimeJitException(HandleToObject(ftn).ToString()); }
private void getFieldInfo(IntPtr _this, ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_METHOD_STRUCT_* callerHandle, CORINFO_ACCESS_FLAGS flags, ref CORINFO_FIELD_INFO pResult) { #if DEBUG // In debug, write some bogus data to the struct to ensure we have filled everything // properly. fixed (CORINFO_FIELD_INFO* tmp = &pResult) MemoryHelper.FillMemory((byte*)tmp, 0xcc, Marshal.SizeOf<CORINFO_FIELD_INFO>()); #endif Debug.Assert(((int)flags & ((int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_GET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_SET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_ADDRESS | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_INIT_ARRAY)) != 0); var field = HandleToObject(pResolvedToken.hField); CORINFO_FIELD_ACCESSOR fieldAccessor; CORINFO_FIELD_FLAGS fieldFlags = (CORINFO_FIELD_FLAGS)0; if (field.IsStatic) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_STATIC; if (field.HasRva) { throw new NotSupportedException("getFieldInfo for RVA mapped field"); } fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_SHARED_STATIC_HELPER; pResult.helper = CorInfoHelpFunc.CORINFO_HELP_READYTORUN_STATIC_BASE; ReadyToRunHelperId helperId; if (field.IsThreadStatic) { helperId = ReadyToRunHelperId.GetThreadStaticBase; } else if (field.HasGCStaticBase) { helperId = ReadyToRunHelperId.GetGCStaticBase; } else { helperId = ReadyToRunHelperId.GetNonGCStaticBase; } pResult.fieldLookup.addr = (void*)ObjectToHandle(_compilation.NodeFactory.ReadyToRunHelper(helperId, field.OwningType)); pResult.fieldLookup.accessType = InfoAccessType.IAT_VALUE; } else { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INSTANCE; } if (field.IsInitOnly) fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_FINAL; pResult.fieldAccessor = fieldAccessor; pResult.fieldFlags = fieldFlags; pResult.fieldType = getFieldType(_this, pResolvedToken.hField, ref pResult.structType, pResolvedToken.hClass); pResult.accessAllowed = CorInfoIsAccessAllowedResult.CORINFO_ACCESS_ALLOWED; pResult.offset = (uint)field.Offset; // TODO: We need to implement access checks for fields and methods. See JitInterface.cpp in mrtjit // and STS::AccessCheck::CanAccess. }
private void getFunctionEntryPoint(IntPtr _this, CORINFO_METHOD_STRUCT_* ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { throw new NotImplementedException("getFunctionEntryPoint"); }
private void getFunctionEntryPoint(CORINFO_METHOD_STRUCT_* ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { MethodDesc method = HandleToObject(ftn); // TODO: Implement MapMethodDeclToMethodImpl from CoreCLR if (method.IsVirtual) throw new NotImplementedException("getFunctionEntryPoint"); pResult.accessType = InfoAccessType.IAT_VALUE; pResult.addr = (void*)ObjectToHandle(_compilation.NodeFactory.MethodEntrypoint(method)); }
private void getFunctionEntryPoint(CORINFO_METHOD_STRUCT_ *ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { MethodDesc method = HandleToObject(ftn); // TODO: Implement MapMethodDeclToMethodImpl from CoreCLR if (method.IsVirtual) { throw new NotImplementedException("getFunctionEntryPoint"); } pResult = CreateConstLookupToSymbol(_compilation.NodeFactory.MethodEntrypoint( method, constrainedType: null, originalMethod: null, methodToken: default(ModuleToken), // TODO!!!! _signatureContext)); }
public virtual void getFunctionEntryPoint_wrapper(IntPtr _this, out IntPtr exception, CORINFO_METHOD_STRUCT_* ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { exception = IntPtr.Zero; try { getFunctionEntryPoint(ftn, ref pResult, accessFlags); return; } catch (Exception ex) { exception = AllocException(ex); } }
private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_METHOD_STRUCT_* callerHandle, CORINFO_ACCESS_FLAGS flags, ref CORINFO_FIELD_INFO pResult) { #if DEBUG // In debug, write some bogus data to the struct to ensure we have filled everything // properly. fixed (CORINFO_FIELD_INFO* tmp = &pResult) MemoryHelper.FillMemory((byte*)tmp, 0xcc, Marshal.SizeOf<CORINFO_FIELD_INFO>()); #endif Debug.Assert(((int)flags & ((int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_GET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_SET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_ADDRESS | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_INIT_ARRAY)) != 0); var field = HandleToObject(pResolvedToken.hField); CORINFO_FIELD_ACCESSOR fieldAccessor; CORINFO_FIELD_FLAGS fieldFlags = (CORINFO_FIELD_FLAGS)0; if (field.IsStatic) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_STATIC; if (field.HasRva) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_UNMANAGED; // TODO: Handle the case when the RVA is in the TLS range fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_RVA_ADDRESS; // We are not going through a helper. The constructor has to be triggered explicitly. if (_compilation.HasLazyStaticConstructor(field.OwningType)) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_INITCLASS; } } else { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_SHARED_STATIC_HELPER; pResult.helper = CorInfoHelpFunc.CORINFO_HELP_READYTORUN_STATIC_BASE; ReadyToRunHelperId helperId = ReadyToRunHelperId.Invalid; if (field.IsThreadStatic) { helperId = ReadyToRunHelperId.GetThreadStaticBase; } else if (field.HasGCStaticBase) { helperId = ReadyToRunHelperId.GetGCStaticBase; } else { var owningType = field.OwningType; if ((owningType.IsWellKnownType(WellKnownType.IntPtr) || owningType.IsWellKnownType(WellKnownType.UIntPtr)) && field.Name == "Zero") { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INTRINSIC_ZERO; } else { helperId = ReadyToRunHelperId.GetNonGCStaticBase; } } if (helperId != ReadyToRunHelperId.Invalid) { pResult.fieldLookup.addr = (void*)ObjectToHandle(_compilation.NodeFactory.ReadyToRunHelper(helperId, field.OwningType)); pResult.fieldLookup.accessType = InfoAccessType.IAT_VALUE; } } } else { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INSTANCE; } if (field.IsInitOnly) fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_FINAL; pResult.fieldAccessor = fieldAccessor; pResult.fieldFlags = fieldFlags; pResult.fieldType = getFieldType(pResolvedToken.hField, ref pResult.structType, pResolvedToken.hClass); pResult.accessAllowed = CorInfoIsAccessAllowedResult.CORINFO_ACCESS_ALLOWED; if (!field.IsStatic || !field.HasRva) pResult.offset = (uint)field.Offset; else pResult.offset = 0xBAADF00D; // TODO: We need to implement access checks for fields and methods. See JitInterface.cpp in mrtjit // and STS::AccessCheck::CanAccess. }
public virtual void getFieldInfo_wrapper(IntPtr _this, out IntPtr exception, ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_METHOD_STRUCT_* callerHandle, CORINFO_ACCESS_FLAGS flags, ref CORINFO_FIELD_INFO pResult) { exception = IntPtr.Zero; try { getFieldInfo(ref pResolvedToken, callerHandle, flags, ref pResult); return; } catch (Exception ex) { exception = AllocException(ex); } }
private void getFunctionEntryPoint(CORINFO_METHOD_STRUCT_* ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { MethodDesc method = HandleToObject(ftn); // TODO: Implement MapMethodDeclToMethodImpl from CoreCLR if (method.IsVirtual) throw new NotImplementedException("getFunctionEntryPoint"); pResult = CreateConstLookupToSymbol(_compilation.NodeFactory.MethodEntrypoint(method)); }
static void _getFunctionEntryPoint(IntPtr thisHandle, IntPtr* ppException, CORINFO_METHOD_STRUCT_* ftn, ref CORINFO_CONST_LOOKUP pResult, CORINFO_ACCESS_FLAGS accessFlags) { var _this = GetThis(thisHandle); try { _this.getFunctionEntryPoint(ftn, ref pResult, accessFlags); } catch (Exception ex) { *ppException = _this.AllocException(ex); } }
static void _getFieldInfo(IntPtr thisHandle, IntPtr* ppException, ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_METHOD_STRUCT_* callerHandle, CORINFO_ACCESS_FLAGS flags, ref CORINFO_FIELD_INFO pResult) { var _this = GetThis(thisHandle); try { _this.getFieldInfo(ref pResolvedToken, callerHandle, flags, ref pResult); } catch (Exception ex) { *ppException = _this.AllocException(ex); } }
private void getFieldInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_METHOD_STRUCT_* callerHandle, CORINFO_ACCESS_FLAGS flags, ref CORINFO_FIELD_INFO pResult) { #if DEBUG // In debug, write some bogus data to the struct to ensure we have filled everything // properly. fixed (CORINFO_FIELD_INFO* tmp = &pResult) MemoryHelper.FillMemory((byte*)tmp, 0xcc, Marshal.SizeOf<CORINFO_FIELD_INFO>()); #endif Debug.Assert(((int)flags & ((int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_GET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_SET | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_ADDRESS | (int)CORINFO_ACCESS_FLAGS.CORINFO_ACCESS_INIT_ARRAY)) != 0); var field = HandleToObject(pResolvedToken.hField); CORINFO_FIELD_ACCESSOR fieldAccessor; CORINFO_FIELD_FLAGS fieldFlags = (CORINFO_FIELD_FLAGS)0; if (field.IsStatic) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_STATIC; if (field.HasRva) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_UNMANAGED; // TODO: Handle the case when the RVA is in the TLS range fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_RVA_ADDRESS; // We are not going through a helper. The constructor has to be triggered explicitly. if (_compilation.HasLazyStaticConstructor(field.OwningType)) { fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_INITCLASS; } } else if (field.OwningType.IsCanonicalSubtype(CanonicalFormKind.Any)) { // The JIT wants to know how to access a static field on a generic type. We need a runtime lookup. fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_READYTORUN_HELPER; pResult.helper = CorInfoHelpFunc.CORINFO_HELP_READYTORUN_GENERIC_STATIC_BASE; // Don't try to compute the runtime lookup if we're inlining. The JIT is going to abort the inlining // attempt anyway. MethodDesc contextMethod = methodFromContext(pResolvedToken.tokenContext); if (contextMethod == MethodBeingCompiled) { FieldDesc runtimeDeterminedField = (FieldDesc)GetRuntimeDeterminedObjectForToken(ref pResolvedToken); ReadyToRunHelperId helperId; // Find out what kind of base do we need to look up. if (field.IsThreadStatic) { throw new NotImplementedException(); } else if (field.HasGCStaticBase) { helperId = ReadyToRunHelperId.GetGCStaticBase; } else { helperId = ReadyToRunHelperId.GetNonGCStaticBase; } // What generic context do we look up the base from. ISymbolNode helper; if (contextMethod.AcquiresInstMethodTableFromThis() || contextMethod.RequiresInstMethodTableArg()) { helper = _compilation.NodeFactory.ReadyToRunHelperFromTypeLookup( helperId, runtimeDeterminedField.OwningType, contextMethod.OwningType); } else { Debug.Assert(contextMethod.RequiresInstMethodDescArg()); helper = _compilation.NodeFactory.ReadyToRunHelperFromDictionaryLookup( helperId, runtimeDeterminedField.OwningType, contextMethod); } pResult.fieldLookup.addr = (void*)ObjectToHandle(helper); pResult.fieldLookup.accessType = InfoAccessType.IAT_VALUE; } } else { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_STATIC_SHARED_STATIC_HELPER; pResult.helper = CorInfoHelpFunc.CORINFO_HELP_READYTORUN_STATIC_BASE; ReadyToRunHelperId helperId = ReadyToRunHelperId.Invalid; if (field.IsThreadStatic) { helperId = ReadyToRunHelperId.GetThreadStaticBase; } else if (field.HasGCStaticBase) { helperId = ReadyToRunHelperId.GetGCStaticBase; } else { var owningType = field.OwningType; if ((owningType.IsWellKnownType(WellKnownType.IntPtr) || owningType.IsWellKnownType(WellKnownType.UIntPtr)) && field.Name == "Zero") { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INTRINSIC_ZERO; } else { helperId = ReadyToRunHelperId.GetNonGCStaticBase; } } if (helperId != ReadyToRunHelperId.Invalid) { pResult.fieldLookup.addr = (void*)ObjectToHandle(_compilation.NodeFactory.ReadyToRunHelper(helperId, field.OwningType)); pResult.fieldLookup.accessType = InfoAccessType.IAT_VALUE; } } } else { fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INSTANCE; } if (field.IsInitOnly) fieldFlags |= CORINFO_FIELD_FLAGS.CORINFO_FLG_FIELD_FINAL; pResult.fieldAccessor = fieldAccessor; pResult.fieldFlags = fieldFlags; pResult.fieldType = getFieldType(pResolvedToken.hField, ref pResult.structType, pResolvedToken.hClass); pResult.accessAllowed = CorInfoIsAccessAllowedResult.CORINFO_ACCESS_ALLOWED; if (!field.IsStatic || !field.HasRva) pResult.offset = (uint)field.Offset; else pResult.offset = 0xBAADF00D; // TODO: We need to implement access checks for fields and methods. See JitInterface.cpp in mrtjit // and STS::AccessCheck::CanAccess. }