From e85d3f77ccc1c9f7495dc72acf5809fa5df2a4f2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:37:34 +0000 Subject: [PATCH 01/10] Disable FEATURE_SVR_GC for WebAssembly CoreCLR builds Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/ef405ab1-bc2a-472f-b797-52d49c5d8409 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- src/coreclr/clrdefinitions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index 60b79850f53ffd..91a8f7353eb248 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -173,10 +173,10 @@ endif (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX) if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) -if (NOT CLR_CMAKE_HOST_ANDROID) +if (NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM) set(FEATURE_SVR_GC 1) add_definitions(-DFEATURE_SVR_GC) -endif(NOT CLR_CMAKE_HOST_ANDROID) +endif(NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM) add_definitions(-DFEATURE_SYMDIFF) if (FEATURE_TIERED_COMPILATION) From b5b5b6d377bd000c841b03b5cea150d8582938f7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:19:37 +0000 Subject: [PATCH 02/10] Stub unused JIT interface methods for interpreter-only WASM builds Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/05b0c780-4d5e-4177-b5ec-c07a31e050a7 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- src/coreclr/vm/jitinterface.cpp | 435 ++++++++++++++++++++++++++++++++ 1 file changed, 435 insertions(+) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index c95768ddae09f5..6821a351145d50 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -597,6 +597,10 @@ int CEEInfo::getStringLiteral ( int bufferSize, int startIndex) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -646,6 +650,7 @@ int CEEInfo::getStringLiteral ( EE_TO_JIT_TRANSITION(); return result; +#endif } size_t CEEInfo::printObjectDescription ( @@ -654,6 +659,10 @@ size_t CEEInfo::printObjectDescription ( size_t bufferSize, size_t* pRequiredBufferSize) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -702,6 +711,7 @@ size_t CEEInfo::printObjectDescription ( EE_TO_JIT_TRANSITION(); return bytesWritten; +#endif } /* static */ @@ -1320,6 +1330,10 @@ uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field, bool isG void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1329,6 +1343,7 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* JIT_TO_EE_TRANSITION(); GetThreadLocalStaticBlocksInfo(pInfo); EE_TO_JIT_TRANSITION(); +#endif } /*********************************************************************/ @@ -1629,6 +1644,10 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, // bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1641,10 +1660,15 @@ bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) res = (field->IsStatic() != 0); EE_TO_JIT_TRANSITION_LEAF(); return res; +#endif } int CEEInfo::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1671,6 +1695,7 @@ int CEEInfo::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) EE_TO_JIT_TRANSITION(); return arrLen; +#endif } //--------------------------------------------------------------------------------------- @@ -1682,6 +1707,10 @@ CEEInfo::findCallSiteSig( CORINFO_CONTEXT_HANDLE context, CORINFO_SIG_INFO * sigRet) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1750,6 +1779,7 @@ CEEInfo::findCallSiteSig( CONV_TO_JITSIG_FLAGS_NONE, sigRet); EE_TO_JIT_TRANSITION(); +#endif } // CEEInfo::findCallSiteSig //--------------------------------------------------------------------------------------- @@ -1835,6 +1865,10 @@ unsigned CEEInfo::getHeapClassSize( CORINFO_CLASS_HANDLE clsHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -1856,6 +1890,7 @@ CEEInfo::getHeapClassSize( EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } //--------------------------------------------------------------------------------------- @@ -1863,6 +1898,10 @@ CEEInfo::getHeapClassSize( // Return TRUE if an object of this type can be allocated on the stack. bool CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -1885,6 +1924,7 @@ bool CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } unsigned CEEInfo::getClassAlignmentRequirement(CORINFO_CLASS_HANDLE type, bool fDoubleAlignHint) @@ -1974,6 +2014,10 @@ unsigned CEEInfo::getClassAlignmentRequirementStatic(TypeHandle clsHnd) CORINFO_FIELD_HANDLE CEEInfo::getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -1993,6 +2037,7 @@ CEEInfo::getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } static GetTypeLayoutResult GetTypeLayoutHelper( @@ -2136,6 +2181,10 @@ GetTypeLayoutResult CEEInfo::getTypeLayout( CORINFO_TYPE_LAYOUT_NODE* treeNodes, size_t* numTreeNodes) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else STANDARD_VM_CONTRACT; GetTypeLayoutResult result = GetTypeLayoutResult::Failure; @@ -2176,11 +2225,16 @@ GetTypeLayoutResult CEEInfo::getTypeLayout( EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } mdMethodDef CEEInfo::getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -2206,12 +2260,17 @@ CEEInfo::getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } bool CEEInfo::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, bool fOptional) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -2233,6 +2292,7 @@ bool CEEInfo::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, EE_TO_JIT_TRANSITION(); return result; +#endif } static unsigned MarkGCField(BYTE* gcPtrs, CorInfoGCType type) @@ -2411,6 +2471,10 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( /*IN*/ CORINFO_CLASS_HANDLE structHnd, /*OUT*/ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -2511,10 +2575,15 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( #else // !defined(UNIX_AMD64_ABI_ITF) return false; #endif // !defined(UNIX_AMD64_ABI_ITF) +#endif } void CEEInfo::getSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOWERING* pLowering) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -2542,6 +2611,7 @@ void CEEInfo::getSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOW methodTablePtr->GetNativeSwiftPhysicalLowering(pLowering, useNativeLayout); EE_TO_JIT_TRANSITION(); +#endif } CorInfoWasmType CEEInfo::getWasmLowering(CORINFO_CLASS_HANDLE structHnd) @@ -2555,6 +2625,10 @@ CorInfoWasmType CEEInfo::getWasmLowering(CORINFO_CLASS_HANDLE structHnd) /*********************************************************************/ unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -2580,6 +2654,7 @@ unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } @@ -3565,6 +3640,10 @@ const char* CEEInfo::getClassAssemblyName(CORINFO_CLASS_HANDLE clsHnd) /*********************************************************************/ void* CEEInfo::LongLifetimeMalloc(size_t sz) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3578,11 +3657,16 @@ void* CEEInfo::LongLifetimeMalloc(size_t sz) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ void CEEInfo::LongLifetimeFree(void* obj) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3592,12 +3676,17 @@ void CEEInfo::LongLifetimeFree(void* obj) JIT_TO_EE_TRANSITION_LEAF(); (operator delete)(obj); EE_TO_JIT_TRANSITION_LEAF(); +#endif } /*********************************************************************/ bool CEEInfo::getIsClassInitedFlagAddress(CORINFO_CLASS_HANDLE cls, CORINFO_CONST_LOOKUP* addr, int* offset) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3627,11 +3716,16 @@ bool CEEInfo::getIsClassInitedFlagAddress(CORINFO_CLASS_HANDLE cls, CORINFO_CONS EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ bool CEEInfo::getStaticBaseAddress(CORINFO_CLASS_HANDLE cls, bool isGc, CORINFO_CONST_LOOKUP* addr) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -3662,6 +3756,7 @@ bool CEEInfo::getStaticBaseAddress(CORINFO_CLASS_HANDLE cls, bool isGc, CORINFO_ EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -3964,6 +4059,10 @@ exit: ; void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3978,11 +4077,16 @@ void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadH _ASSERTE(th.IsFullyLoaded()); EE_TO_JIT_TRANSITION_LEAF(); +#endif } /*********************************************************************/ void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3997,6 +4101,7 @@ void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) _ASSERTE(pMD->GetMethodTable()->IsFullyLoaded()); EE_TO_JIT_TRANSITION_LEAF(); +#endif } /*********************************************************************/ @@ -4081,6 +4186,10 @@ CorInfoType CEEInfo::getTypeForPrimitiveValueClass( CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( CORINFO_CLASS_HANDLE clsHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -4142,11 +4251,16 @@ CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( JIT_TO_EE_TRANSITION_LEAF(); return result; +#endif } void CEEInfo::getGSCookie(GSCookie * pCookieVal, GSCookie ** ppCookieVal) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4166,6 +4280,7 @@ void CEEInfo::getGSCookie(GSCookie * pCookieVal, GSCookie ** ppCookieVal) } EE_TO_JIT_TRANSITION(); +#endif } @@ -4176,6 +4291,10 @@ bool CEEInfo::canCast( CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4191,6 +4310,7 @@ bool CEEInfo::canCast( EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -4414,6 +4534,10 @@ bool CEEInfo::isMoreSpecificType( CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4428,6 +4552,7 @@ bool CEEInfo::isMoreSpecificType( EE_TO_JIT_TRANSITION(); return result; +#endif } static bool isExactTypeHelper(TypeHandle th) @@ -4475,6 +4600,10 @@ static bool isExactTypeHelper(TypeHandle th) // Returns true if a class handle can only describe values of exactly one type. bool CEEInfo::isExactType(CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4489,11 +4618,16 @@ bool CEEInfo::isExactType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; +#endif } // Returns whether a class handle represents a generic type, if that can be statically determined. TypeCompareState CEEInfo::isGenericType(CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4513,11 +4647,16 @@ TypeCompareState CEEInfo::isGenericType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } // Returns whether a class handle represents a Nullable type, if that can be statically determined. TypeCompareState CEEInfo::isNullableType(CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4534,6 +4673,7 @@ TypeCompareState CEEInfo::isNullableType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -4546,6 +4686,10 @@ TypeCompareState CEEInfo::isEnum( CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE* underlyingType) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4585,6 +4729,7 @@ TypeCompareState CEEInfo::isEnum( EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -4594,6 +4739,10 @@ TypeCompareState CEEInfo::isEnum( CORINFO_CLASS_HANDLE CEEInfo::getParentType( CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4628,6 +4777,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getParentType( EE_TO_JIT_TRANSITION(); return result; +#endif } @@ -4641,6 +4791,10 @@ CorInfoType CEEInfo::getChildType ( CORINFO_CLASS_HANDLE *clsRet ) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4673,12 +4827,17 @@ CorInfoType CEEInfo::getChildType ( EE_TO_JIT_TRANSITION(); return ret; +#endif } /*********************************************************************/ // Check if this is a single dimensional, zero based array type bool CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4704,12 +4863,17 @@ bool CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ // Get the number of dimensions in an array unsigned CEEInfo::getArrayRank(CORINFO_CLASS_HANDLE cls) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4735,12 +4899,17 @@ unsigned CEEInfo::getArrayRank(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ // Get the index of runtime provided array method CorInfoArrayIntrinsic CEEInfo::getArrayIntrinsicID(CORINFO_METHOD_HANDLE ftn) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4773,6 +4942,7 @@ CorInfoArrayIntrinsic CEEInfo::getArrayIntrinsicID(CORINFO_METHOD_HANDLE ftn) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -4785,6 +4955,10 @@ void * CEEInfo::getArrayInitializationData( uint32_t size ) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4811,6 +4985,7 @@ void * CEEInfo::getArrayInitializationData( EE_TO_JIT_TRANSITION(); return result; +#endif } CorInfoIsAccessAllowedResult CEEInfo::canAccessClass( @@ -5940,6 +6115,10 @@ CorInfoHelpFunc CEEInfo::getCastingHelperStatic(TypeHandle clsHnd, bool fThrowin /***********************************************************************/ CorInfoHelpFunc CEEInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -5962,6 +6141,7 @@ CorInfoHelpFunc CEEInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd) result = CORINFO_HELP_INITCLASS; return result; +#endif } /***********************************************************************/ @@ -6009,6 +6189,10 @@ CORINFO_OBJECT_HANDLE CEEInfo::getRuntimeTypePointer(CORINFO_CLASS_HANDLE clsHnd /***********************************************************************/ bool CEEInfo::isObjectImmutable(CORINFO_OBJECT_HANDLE objHandle) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6044,11 +6228,16 @@ bool CEEInfo::isObjectImmutable(CORINFO_OBJECT_HANDLE objHandle) EE_TO_JIT_TRANSITION(); return isImmutable; +#endif } /***********************************************************************/ bool CEEInfo::getStringChar(CORINFO_OBJECT_HANDLE obj, int index, uint16_t* value) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6077,11 +6266,16 @@ bool CEEInfo::getStringChar(CORINFO_OBJECT_HANDLE obj, int index, uint16_t* valu EE_TO_JIT_TRANSITION(); return result; +#endif } /***********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getObjectType(CORINFO_OBJECT_HANDLE objHandle) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6101,6 +6295,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getObjectType(CORINFO_OBJECT_HANDLE objHandle) EE_TO_JIT_TRANSITION(); return handle; +#endif } /***********************************************************************/ @@ -6186,6 +6381,10 @@ CORINFO_VARARGS_HANDLE CEEInfo::getVarArgsHandle(CORINFO_SIG_INFO *sig, CORINFO_METHOD_HANDLE methHnd, void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6210,11 +6409,16 @@ CORINFO_VARARGS_HANDLE CEEInfo::getVarArgsHandle(CORINFO_SIG_INFO *sig, EE_TO_JIT_TRANSITION(); return result; +#endif } /***********************************************************************/ unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6232,11 +6436,16 @@ unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) EE_TO_JIT_TRANSITION(); return result; +#endif } /***********************************************************************/ size_t CEEInfo::printMethodName(CORINFO_METHOD_HANDLE ftnHnd, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_NOTRIGGER; @@ -6266,6 +6475,7 @@ size_t CEEInfo::printMethodName(CORINFO_METHOD_HANDLE ftnHnd, char* buffer, size EE_TO_JIT_TRANSITION(); return bytesWritten; +#endif } const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName, const char** enclosingClassNames, size_t maxEnclosingClassNames) @@ -6335,6 +6545,10 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con /*********************************************************************/ const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const char** namespaceName) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6360,11 +6574,16 @@ const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const ch EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, unsigned index) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -6383,10 +6602,15 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } CORINFO_CLASS_HANDLE CEEInfo::getMethodInstantiationArgument(CORINFO_METHOD_HANDLE ftn, unsigned index) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -6407,6 +6631,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getMethodInstantiationArgument(CORINFO_METHOD_HAND EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -6434,6 +6659,10 @@ bool CEEInfo::isIntrinsic(CORINFO_METHOD_HANDLE ftn) bool CEEInfo::notifyMethodInfoUsage(CORINFO_METHOD_HANDLE ftn) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6453,6 +6682,7 @@ bool CEEInfo::notifyMethodInfoUsage(CORINFO_METHOD_HANDLE ftn) EE_TO_JIT_TRANSITION(); return true; +#endif } /*********************************************************************/ @@ -6600,6 +6830,10 @@ void CEEInfo::setMethodAttribs ( CORINFO_METHOD_HANDLE ftnHnd, CorInfoMethodRuntimeFlags attribs) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6636,6 +6870,7 @@ void CEEInfo::setMethodAttribs ( } EE_TO_JIT_TRANSITION(); +#endif } /*********************************************************************/ @@ -7722,6 +7957,10 @@ CEEInfo::getMethodInfo( CORINFO_METHOD_INFO * methInfo, CORINFO_CONTEXT_HANDLE context) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -7757,12 +7996,17 @@ CEEInfo::getMethodInfo( EE_TO_JIT_TRANSITION(); return result; +#endif } bool CEEInfo::haveSameMethodDefinition( CORINFO_METHOD_HANDLE meth1Hnd, CORINFO_METHOD_HANDLE meth2Hnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -7780,10 +8024,15 @@ bool CEEInfo::haveSameMethodDefinition( EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -7814,6 +8063,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) _ASSERTE(result != NULL); return result; +#endif } /************************************************************* @@ -7824,6 +8074,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) CorInfoInline CEEInfo::canInline (CORINFO_METHOD_HANDLE hCaller, CORINFO_METHOD_HANDLE hCallee) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8020,6 +8274,7 @@ exit: ; } return result; +#endif } void CEEInfo::beginInlining(CORINFO_METHOD_HANDLE inlinerHnd, @@ -8033,6 +8288,10 @@ void CEEInfo::reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd, CorInfoInline inlineResult, const char * reason) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -8192,6 +8451,7 @@ void CEEInfo::reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd, #endif // defined FEATURE_REJIT && !defined(DACCESS_COMPILE) EE_TO_JIT_TRANSITION(); +#endif } @@ -8298,6 +8558,10 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd, CorInfoTailCall tailCallResult, const char * reason) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -8416,6 +8680,7 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd, EE_TO_JIT_TRANSITION(); +#endif } static void getEHinfoHelper( @@ -8547,6 +8812,10 @@ CEEInfo::getMethodClass( /*********************************************************************/ bool CEEInfo::isIntrinsicType(CORINFO_CLASS_HANDLE classHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -8562,6 +8831,7 @@ bool CEEInfo::isIntrinsicType(CORINFO_CLASS_HANDLE classHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -8570,6 +8840,10 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd, unsigned * pOffsetAfterIndirection, bool * isRelative) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8594,6 +8868,7 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd, *isRelative = false; EE_TO_JIT_TRANSITION(); +#endif } /*********************************************************************/ @@ -8897,6 +9172,10 @@ bool CEEInfo::resolveVirtualMethodHelper(CORINFO_DEVIRTUALIZATION_INFO * info) bool CEEInfo::resolveVirtualMethod(CORINFO_DEVIRTUALIZATION_INFO * info) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8912,6 +9191,7 @@ bool CEEInfo::resolveVirtualMethod(CORINFO_DEVIRTUALIZATION_INFO * info) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -8919,6 +9199,10 @@ CORINFO_METHOD_HANDLE CEEInfo::getUnboxedEntry( CORINFO_METHOD_HANDLE ftn, bool* requiresInstMethodTableArg) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8946,6 +9230,7 @@ CORINFO_METHOD_HANDLE CEEInfo::getUnboxedEntry( EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -8954,6 +9239,10 @@ CORINFO_METHOD_HANDLE CEEInfo::getInstantiatedEntry( CORINFO_METHOD_HANDLE* methodArg, CORINFO_CLASS_HANDLE* classArg) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8987,6 +9276,7 @@ CORINFO_METHOD_HANDLE CEEInfo::getInstantiatedEntry( EE_TO_JIT_TRANSITION(); return result; +#endif } CORINFO_METHOD_HANDLE CEEInfo::getAsyncOtherVariant( @@ -9036,6 +9326,10 @@ void CEEInfo::expandRawHandleIntrinsic( /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClass(CORINFO_CLASS_HANDLE elemType) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9051,6 +9345,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClass(CORINFO_CLASS_HANDLE elemT EE_TO_JIT_TRANSITION(); return result; +#endif } CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9104,6 +9399,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClassHelper(CORINFO_CLASS_HANDLE /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HANDLE elemType) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9119,6 +9418,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HAND EE_TO_JIT_TRANSITION(); return result; +#endif } CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9180,6 +9480,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClassHelper(CORINFO_CLAS /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClass(CORINFO_CLASS_HANDLE elemType) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9195,6 +9499,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClass(CORINFO_CLASS_HAND EE_TO_JIT_TRANSITION(); return result; +#endif } CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9220,6 +9525,10 @@ void CEEInfo::getFunctionEntryPoint(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CONST_LOOKUP * pResult, CORINFO_ACCESS_FLAGS accessFlags) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9287,6 +9596,7 @@ void CEEInfo::getFunctionEntryPoint(CORINFO_METHOD_HANDLE ftnHnd, pResult->accessType = accessType; pResult->addr = ret; +#endif } /*********************************************************************/ @@ -9316,6 +9626,10 @@ void CEEInfo::getFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, /*********************************************************************/ size_t CEEInfo::printFieldName(CORINFO_FIELD_HANDLE fieldHnd, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_NOTRIGGER; @@ -9344,12 +9658,17 @@ size_t CEEInfo::printFieldName(CORINFO_FIELD_HANDLE fieldHnd, char* buffer, size EE_TO_JIT_TRANSITION(); return bytesWritten; +#endif } /*********************************************************************/ // Get the type that declares the field CORINFO_CLASS_HANDLE CEEInfo::getFieldClass (CORINFO_FIELD_HANDLE fieldHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -9366,6 +9685,7 @@ CORINFO_CLASS_HANDLE CEEInfo::getFieldClass (CORINFO_FIELD_HANDLE fieldHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -9379,6 +9699,10 @@ CorInfoType CEEInfo::getFieldType (CORINFO_FIELD_HANDLE fieldHnd, CORINFO_CLASS_HANDLE* pTypeHnd, CORINFO_CLASS_HANDLE fieldOwnerHint) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9394,6 +9718,7 @@ CorInfoType CEEInfo::getFieldType (CORINFO_FIELD_HANDLE fieldHnd, EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -9466,6 +9791,10 @@ CorInfoType CEEInfo::getFieldTypeInternal (CORINFO_FIELD_HANDLE fieldHnd, /*********************************************************************/ unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9498,11 +9827,16 @@ unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ uint32_t CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9527,6 +9861,7 @@ uint32_t CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void EE_TO_JIT_TRANSITION(); return result; +#endif } void *CEEInfo::allocateArray(size_t cBytes) @@ -9578,6 +9913,10 @@ void CEEInfo::getBoundaries(CORINFO_METHOD_HANDLE ftn, unsigned int *cILOffsets, uint32_t **pILOffsets, ICorDebugInfo::BoundaryTypes *implicitBoundaries) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9601,11 +9940,16 @@ void CEEInfo::getBoundaries(CORINFO_METHOD_HANDLE ftn, #endif // DEBUGGING_SUPPORTED EE_TO_JIT_TRANSITION(); +#endif } void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo::ILVarInfo **vars, bool *extendOthers) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9630,6 +9974,7 @@ void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo:: #endif // DEBUGGING_SUPPORTED EE_TO_JIT_TRANSITION(); +#endif } /*********************************************************************/ @@ -9785,6 +10130,10 @@ CorInfoTypeWithMod CEEInfo::getArgType ( // see the struct `CORINFO_FPSTRUCT_LOWERING`. void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRUCT_LOWERING* pLowering) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -9828,6 +10177,7 @@ void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRU #endif // TARGET_RISCV64 || TARGET_LOONGARCH64 EE_TO_JIT_TRANSITION(); +#endif } /*********************************************************************/ @@ -9838,6 +10188,10 @@ int CEEInfo::getExactClasses ( CORINFO_CLASS_HANDLE* exactClsRet ) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -9852,6 +10206,7 @@ int CEEInfo::getExactClasses ( EE_TO_JIT_TRANSITION(); return -1; +#endif } /*********************************************************************/ @@ -9861,6 +10216,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( CORINFO_ARG_LIST_HANDLE args ) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9900,12 +10259,17 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ CorInfoHFAElemType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9923,6 +10287,7 @@ CorInfoHFAElemType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) EE_TO_JIT_TRANSITION(); return result; +#endif } namespace @@ -10137,9 +10502,14 @@ bool CEEInfo::pInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SI LPVOID CEEInfo::GetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig, void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else WRAPPER_NO_CONTRACT; return getVarArgsHandle(szMetaSig, NULL, ppIndirection); +#endif } // Check any constraints on method type arguments @@ -10147,6 +10517,10 @@ bool CEEInfo::satisfiesMethodConstraints( CORINFO_CLASS_HANDLE parent, CORINFO_METHOD_HANDLE method) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10164,6 +10538,7 @@ bool CEEInfo::satisfiesMethodConstraints( EE_TO_JIT_TRANSITION(); return result; +#endif } @@ -10209,6 +10584,10 @@ CORINFO_WASM_TYPE_SYMBOL_HANDLE CEEInfo::getWasmTypeSymbol( CORINFO_METHOD_HANDLE CEEInfo::getSpecialCopyHelper(CORINFO_CLASS_HANDLE type) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10243,6 +10622,7 @@ CORINFO_METHOD_HANDLE CEEInfo::getSpecialCopyHelper(CORINFO_CLASS_HANDLE type) EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -10250,6 +10630,10 @@ CORINFO_JUST_MY_CODE_HANDLE CEEInfo::getJustMyCodeHandle( CORINFO_METHOD_HANDLE method, CORINFO_JUST_MY_CODE_HANDLE**ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10277,6 +10661,7 @@ CORINFO_JUST_MY_CODE_HANDLE CEEInfo::getJustMyCodeHandle( EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } /*********************************************************************/ @@ -10313,6 +10698,10 @@ CORINFO_OS getClrVmOs() // Return details about EE internal data structures void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10357,6 +10746,7 @@ void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) pEEInfoOut->osType = getClrVmOs(); EE_TO_JIT_TRANSITION(); +#endif } void CEEInfo::getAsyncInfo(CORINFO_ASYNC_INFO* pAsyncInfoOut) @@ -10436,6 +10826,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getContinuationType( // Return details about EE internal data structures uint32_t CEEInfo::getThreadTLSIndex(void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10448,11 +10842,16 @@ uint32_t CEEInfo::getThreadTLSIndex(void **ppIndirection) *ppIndirection = NULL; return result; +#endif } int32_t * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10471,6 +10870,7 @@ int32_t * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) EE_TO_JIT_TRANSITION_LEAF(); return result; +#endif } // This code is called if FilterException chose to handle the exception. @@ -10553,6 +10953,10 @@ void CEEInfo::HandleException(struct _EXCEPTION_POINTERS *pExceptionPointers) CORINFO_MODULE_HANDLE CEEInfo::embedModuleHandle(CORINFO_MODULE_HANDLE handle, void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10569,6 +10973,7 @@ CORINFO_MODULE_HANDLE CEEInfo::embedModuleHandle(CORINFO_MODULE_HANDLE handle, EE_TO_JIT_TRANSITION_LEAF(); return handle; +#endif } CORINFO_CLASS_HANDLE CEEInfo::embedClassHandle(CORINFO_CLASS_HANDLE handle, @@ -10594,6 +10999,10 @@ CORINFO_CLASS_HANDLE CEEInfo::embedClassHandle(CORINFO_CLASS_HANDLE handle, CORINFO_FIELD_HANDLE CEEInfo::embedFieldHandle(CORINFO_FIELD_HANDLE handle, void **ppIndirection) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10609,6 +11018,7 @@ CORINFO_FIELD_HANDLE CEEInfo::embedFieldHandle(CORINFO_FIELD_HANDLE handle, EE_TO_JIT_TRANSITION_LEAF(); return handle; +#endif } CORINFO_METHOD_HANDLE CEEInfo::embedMethodHandle(CORINFO_METHOD_HANDLE handle, @@ -10654,6 +11064,10 @@ uint32_t CEEInfo::getJitFlags(CORJIT_FLAGS* jitFlags, uint32_t sizeInBytes) bool CEEInfo::runWithSPMIErrorTrap(void (*function)(void*), void* param) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else // No dynamic contract here because SEH is used STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -10667,10 +11081,15 @@ bool CEEInfo::runWithSPMIErrorTrap(void (*function)(void*), void* param) function(param); return true; +#endif } bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10702,6 +11121,7 @@ bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) catchFrame.Pop(); return success; +#endif } /*********************************************************************/ @@ -12408,6 +12828,10 @@ bool CEEInfo::getStaticObjRefContent(OBJECTREF obj, uint8_t* buffer, bool ignore bool CEEInfo::getStaticFieldContent(CORINFO_FIELD_HANDLE fieldHnd, uint8_t* buffer, int bufferSize, int valueOffset, bool ignoreMovableObjects) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -12532,10 +12956,15 @@ bool CEEInfo::getStaticFieldContent(CORINFO_FIELD_HANDLE fieldHnd, uint8_t* buff EE_TO_JIT_TRANSITION(); return result; +#endif } bool CEEInfo::getObjectContent(CORINFO_OBJECT_HANDLE handle, uint8_t* buffer, int bufferSize, int valueOffset) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -12580,6 +13009,7 @@ bool CEEInfo::getObjectContent(CORINFO_OBJECT_HANDLE handle, uint8_t* buffer, in EE_TO_JIT_TRANSITION(); return result; +#endif } /*********************************************************************/ @@ -14777,6 +15207,10 @@ bool CEEInfo::getTailCallHelpers(CORINFO_RESOLVED_TOKEN* callToken, CORINFO_GET_TAILCALL_HELPERS_FLAGS flags, CORINFO_TAILCALL_HELPERS* pResult) { +#ifndef FEATURE_DYNAMIC_CODE_COMPILED + LIMITED_METHOD_CONTRACT; + UNREACHABLE_MSG("Not needed in interpreter-only builds"); +#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -14792,6 +15226,7 @@ bool CEEInfo::getTailCallHelpers(CORINFO_RESOLVED_TOKEN* callToken, EE_TO_JIT_TRANSITION(); return success; +#endif } static Signature AllocateSignature(LoaderAllocator* alloc, SigBuilder& sigBuilder, AllocMemTracker* pamTracker) From 806547fe9e255bf3c908c1f2ad9fceb15ca7794c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:37:28 +0000 Subject: [PATCH 03/10] Fix incorrectly stubbed classMustBeLoadedBeforeCodeIsRun, methodMustBeLoadedBeforeCodeIsRun, and reportTailCallDecision Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/05b0c780-4d5e-4177-b5ec-c07a31e050a7 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- src/coreclr/vm/jitinterface.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 6821a351145d50..5dfe8145037ba9 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -4059,10 +4059,6 @@ exit: ; void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4077,16 +4073,11 @@ void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadH _ASSERTE(th.IsFullyLoaded()); EE_TO_JIT_TRANSITION_LEAF(); -#endif } /*********************************************************************/ void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4101,7 +4092,6 @@ void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) _ASSERTE(pMD->GetMethodTable()->IsFullyLoaded()); EE_TO_JIT_TRANSITION_LEAF(); -#endif } /*********************************************************************/ @@ -8558,10 +8548,6 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd, CorInfoTailCall tailCallResult, const char * reason) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -8680,7 +8666,6 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd, EE_TO_JIT_TRANSITION(); -#endif } static void getEHinfoHelper( From dc7b9f99973ea88db0b31f3daaa11e25055c8e21 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:55:58 +0000 Subject: [PATCH 04/10] Disable background GC for WASM builds (#ifndef TARGET_WASM in gcpriv.h) Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/7f661e48-3027-488a-8ca9-5fc83d287082 Co-authored-by: janvorli <10758568+janvorli@users.noreply.github.com> --- src/coreclr/gc/datadescriptor/datadescriptor.h | 6 ++++-- src/coreclr/gc/datadescriptor/datadescriptor.inc | 6 ++++-- src/coreclr/gc/gcpriv.h | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/coreclr/gc/datadescriptor/datadescriptor.h b/src/coreclr/gc/datadescriptor/datadescriptor.h index d9589fedb0e056..ad38175f80bcd5 100644 --- a/src/coreclr/gc/datadescriptor/datadescriptor.h +++ b/src/coreclr/gc/datadescriptor/datadescriptor.h @@ -52,19 +52,21 @@ struct cdac_data GC_HEAP_FIELD(OomData, oom_info) /* For use in GCHeapDetails APIs */ +#ifdef BACKGROUND_GC GC_HEAP_FIELD(MarkArray, mark_array) GC_HEAP_FIELD(NextSweepObj, next_sweep_obj) GC_HEAP_FIELD(BackgroundMinSavedAddr, background_saved_lowest_address) GC_HEAP_FIELD(BackgroundMaxSavedAddr, background_saved_highest_address) +#endif // BACKGROUND_GC GC_HEAP_FIELD(AllocAllocated, alloc_allocated) GC_HEAP_FIELD(EphemeralHeapSegment, ephemeral_heap_segment) GC_HEAP_FIELD(CardTable, card_table) GC_HEAP_FIELD(FinalizeQueue, finalize_queue) GC_HEAP_FIELD(GenerationTable, generation_table) -#ifndef USE_REGIONS +#if !defined(USE_REGIONS) && defined(BACKGROUND_GC) GC_HEAP_FIELD(SavedSweepEphemeralSeg, saved_sweep_ephemeral_seg) GC_HEAP_FIELD(SavedSweepEphemeralStart, saved_sweep_ephemeral_start) -#endif // !USE_REGIONS +#endif // !USE_REGIONS && BACKGROUND_GC /* For use in GCHeapAnalyzeData APIs */ GC_HEAP_FIELD(InternalRootArray, internal_root_array) diff --git a/src/coreclr/gc/datadescriptor/datadescriptor.inc b/src/coreclr/gc/datadescriptor/datadescriptor.inc index 49243687f13f4b..07e2d01c884a4f 100644 --- a/src/coreclr/gc/datadescriptor/datadescriptor.inc +++ b/src/coreclr/gc/datadescriptor/datadescriptor.inc @@ -152,19 +152,21 @@ CDAC_GLOBAL(CountFreeRegionKinds, T_UINT32, (uint32_t)FREE_REGION_KINDS) #ifndef SERVER_GC +#ifdef BACKGROUND_GC CDAC_GLOBAL_POINTER(GCHeapMarkArray, cdac_data::MarkArray) CDAC_GLOBAL_POINTER(GCHeapNextSweepObj, cdac_data::NextSweepObj) CDAC_GLOBAL_POINTER(GCHeapBackgroundMinSavedAddr, cdac_data::BackgroundMinSavedAddr) CDAC_GLOBAL_POINTER(GCHeapBackgroundMaxSavedAddr, cdac_data::BackgroundMaxSavedAddr) +#endif // BACKGROUND_GC CDAC_GLOBAL_POINTER(GCHeapAllocAllocated, cdac_data::AllocAllocated) CDAC_GLOBAL_POINTER(GCHeapEphemeralHeapSegment, cdac_data::EphemeralHeapSegment) CDAC_GLOBAL_POINTER(GCHeapCardTable, cdac_data::CardTable) CDAC_GLOBAL_POINTER(GCHeapFinalizeQueue, cdac_data::FinalizeQueue) CDAC_GLOBAL_POINTER(GCHeapGenerationTable, cdac_data::GenerationTable) -#ifndef USE_REGIONS +#if !defined(USE_REGIONS) && defined(BACKGROUND_GC) CDAC_GLOBAL_POINTER(GCHeapSavedSweepEphemeralSeg, cdac_data::SavedSweepEphemeralSeg) CDAC_GLOBAL_POINTER(GCHeapSavedSweepEphemeralStart, cdac_data::SavedSweepEphemeralStart) -#endif // !USE_REGIONS +#endif // !USE_REGIONS && BACKGROUND_GC CDAC_GLOBAL_POINTER(GCHeapOomData, cdac_data::OomData) CDAC_GLOBAL_POINTER(GCHeapInternalRootArray, cdac_data::InternalRootArray) CDAC_GLOBAL_POINTER(GCHeapInternalRootArrayIndex, cdac_data::InternalRootArrayIndex) diff --git a/src/coreclr/gc/gcpriv.h b/src/coreclr/gc/gcpriv.h index 501c93d154ad23..705fa92897d87f 100644 --- a/src/coreclr/gc/gcpriv.h +++ b/src/coreclr/gc/gcpriv.h @@ -190,7 +190,9 @@ inline void FATAL_GC_ERROR() #define FEATURE_PREMORTEM_FINALIZATION #define GC_HISTORY +#ifndef TARGET_WASM #define BACKGROUND_GC //concurrent background GC (requires WRITE_WATCH) +#endif //!TARGET_WASM // We need the lower 3 bits in the MT to do our bookkeeping so doubly linked free list is only for 64-bit #if defined(BACKGROUND_GC) && defined(HOST_64BIT) From c6d22cbb4160a9b3916ec737ff66ecc8d5f91d8c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:11:28 +0000 Subject: [PATCH 05/10] Revert jitinterface.cpp changes (JIT interface stubs are out of scope) Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/b8ad1421-bfb6-48e3-8387-923a7d1cc0dc Co-authored-by: janvorli <10758568+janvorli@users.noreply.github.com> --- src/coreclr/vm/jitinterface.cpp | 420 -------------------------------- 1 file changed, 420 deletions(-) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 5dfe8145037ba9..c95768ddae09f5 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -597,10 +597,6 @@ int CEEInfo::getStringLiteral ( int bufferSize, int startIndex) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -650,7 +646,6 @@ int CEEInfo::getStringLiteral ( EE_TO_JIT_TRANSITION(); return result; -#endif } size_t CEEInfo::printObjectDescription ( @@ -659,10 +654,6 @@ size_t CEEInfo::printObjectDescription ( size_t bufferSize, size_t* pRequiredBufferSize) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -711,7 +702,6 @@ size_t CEEInfo::printObjectDescription ( EE_TO_JIT_TRANSITION(); return bytesWritten; -#endif } /* static */ @@ -1330,10 +1320,6 @@ uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field, bool isG void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1343,7 +1329,6 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* JIT_TO_EE_TRANSITION(); GetThreadLocalStaticBlocksInfo(pInfo); EE_TO_JIT_TRANSITION(); -#endif } /*********************************************************************/ @@ -1644,10 +1629,6 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, // bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1660,15 +1641,10 @@ bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) res = (field->IsStatic() != 0); EE_TO_JIT_TRANSITION_LEAF(); return res; -#endif } int CEEInfo::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1695,7 +1671,6 @@ int CEEInfo::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) EE_TO_JIT_TRANSITION(); return arrLen; -#endif } //--------------------------------------------------------------------------------------- @@ -1707,10 +1682,6 @@ CEEInfo::findCallSiteSig( CORINFO_CONTEXT_HANDLE context, CORINFO_SIG_INFO * sigRet) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -1779,7 +1750,6 @@ CEEInfo::findCallSiteSig( CONV_TO_JITSIG_FLAGS_NONE, sigRet); EE_TO_JIT_TRANSITION(); -#endif } // CEEInfo::findCallSiteSig //--------------------------------------------------------------------------------------- @@ -1865,10 +1835,6 @@ unsigned CEEInfo::getHeapClassSize( CORINFO_CLASS_HANDLE clsHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -1890,7 +1856,6 @@ CEEInfo::getHeapClassSize( EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } //--------------------------------------------------------------------------------------- @@ -1898,10 +1863,6 @@ CEEInfo::getHeapClassSize( // Return TRUE if an object of this type can be allocated on the stack. bool CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -1924,7 +1885,6 @@ bool CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } unsigned CEEInfo::getClassAlignmentRequirement(CORINFO_CLASS_HANDLE type, bool fDoubleAlignHint) @@ -2014,10 +1974,6 @@ unsigned CEEInfo::getClassAlignmentRequirementStatic(TypeHandle clsHnd) CORINFO_FIELD_HANDLE CEEInfo::getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -2037,7 +1993,6 @@ CEEInfo::getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } static GetTypeLayoutResult GetTypeLayoutHelper( @@ -2181,10 +2136,6 @@ GetTypeLayoutResult CEEInfo::getTypeLayout( CORINFO_TYPE_LAYOUT_NODE* treeNodes, size_t* numTreeNodes) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else STANDARD_VM_CONTRACT; GetTypeLayoutResult result = GetTypeLayoutResult::Failure; @@ -2225,16 +2176,11 @@ GetTypeLayoutResult CEEInfo::getTypeLayout( EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } mdMethodDef CEEInfo::getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -2260,17 +2206,12 @@ CEEInfo::getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } bool CEEInfo::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, bool fOptional) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -2292,7 +2233,6 @@ bool CEEInfo::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, EE_TO_JIT_TRANSITION(); return result; -#endif } static unsigned MarkGCField(BYTE* gcPtrs, CorInfoGCType type) @@ -2471,10 +2411,6 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( /*IN*/ CORINFO_CLASS_HANDLE structHnd, /*OUT*/ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -2575,15 +2511,10 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( #else // !defined(UNIX_AMD64_ABI_ITF) return false; #endif // !defined(UNIX_AMD64_ABI_ITF) -#endif } void CEEInfo::getSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOWERING* pLowering) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -2611,7 +2542,6 @@ void CEEInfo::getSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOW methodTablePtr->GetNativeSwiftPhysicalLowering(pLowering, useNativeLayout); EE_TO_JIT_TRANSITION(); -#endif } CorInfoWasmType CEEInfo::getWasmLowering(CORINFO_CLASS_HANDLE structHnd) @@ -2625,10 +2555,6 @@ CorInfoWasmType CEEInfo::getWasmLowering(CORINFO_CLASS_HANDLE structHnd) /*********************************************************************/ unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -2654,7 +2580,6 @@ unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } @@ -3640,10 +3565,6 @@ const char* CEEInfo::getClassAssemblyName(CORINFO_CLASS_HANDLE clsHnd) /*********************************************************************/ void* CEEInfo::LongLifetimeMalloc(size_t sz) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3657,16 +3578,11 @@ void* CEEInfo::LongLifetimeMalloc(size_t sz) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ void CEEInfo::LongLifetimeFree(void* obj) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3676,17 +3592,12 @@ void CEEInfo::LongLifetimeFree(void* obj) JIT_TO_EE_TRANSITION_LEAF(); (operator delete)(obj); EE_TO_JIT_TRANSITION_LEAF(); -#endif } /*********************************************************************/ bool CEEInfo::getIsClassInitedFlagAddress(CORINFO_CLASS_HANDLE cls, CORINFO_CONST_LOOKUP* addr, int* offset) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -3716,16 +3627,11 @@ bool CEEInfo::getIsClassInitedFlagAddress(CORINFO_CLASS_HANDLE cls, CORINFO_CONS EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ bool CEEInfo::getStaticBaseAddress(CORINFO_CLASS_HANDLE cls, bool isGc, CORINFO_CONST_LOOKUP* addr) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -3756,7 +3662,6 @@ bool CEEInfo::getStaticBaseAddress(CORINFO_CLASS_HANDLE cls, bool isGc, CORINFO_ EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -4176,10 +4081,6 @@ CorInfoType CEEInfo::getTypeForPrimitiveValueClass( CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( CORINFO_CLASS_HANDLE clsHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ NOTHROW; GC_NOTRIGGER; @@ -4241,16 +4142,11 @@ CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( JIT_TO_EE_TRANSITION_LEAF(); return result; -#endif } void CEEInfo::getGSCookie(GSCookie * pCookieVal, GSCookie ** ppCookieVal) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4270,7 +4166,6 @@ void CEEInfo::getGSCookie(GSCookie * pCookieVal, GSCookie ** ppCookieVal) } EE_TO_JIT_TRANSITION(); -#endif } @@ -4281,10 +4176,6 @@ bool CEEInfo::canCast( CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4300,7 +4191,6 @@ bool CEEInfo::canCast( EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -4524,10 +4414,6 @@ bool CEEInfo::isMoreSpecificType( CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4542,7 +4428,6 @@ bool CEEInfo::isMoreSpecificType( EE_TO_JIT_TRANSITION(); return result; -#endif } static bool isExactTypeHelper(TypeHandle th) @@ -4590,10 +4475,6 @@ static bool isExactTypeHelper(TypeHandle th) // Returns true if a class handle can only describe values of exactly one type. bool CEEInfo::isExactType(CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4608,16 +4489,11 @@ bool CEEInfo::isExactType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; -#endif } // Returns whether a class handle represents a generic type, if that can be statically determined. TypeCompareState CEEInfo::isGenericType(CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4637,16 +4513,11 @@ TypeCompareState CEEInfo::isGenericType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } // Returns whether a class handle represents a Nullable type, if that can be statically determined. TypeCompareState CEEInfo::isNullableType(CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -4663,7 +4534,6 @@ TypeCompareState CEEInfo::isNullableType(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -4676,10 +4546,6 @@ TypeCompareState CEEInfo::isEnum( CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE* underlyingType) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4719,7 +4585,6 @@ TypeCompareState CEEInfo::isEnum( EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -4729,10 +4594,6 @@ TypeCompareState CEEInfo::isEnum( CORINFO_CLASS_HANDLE CEEInfo::getParentType( CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4767,7 +4628,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getParentType( EE_TO_JIT_TRANSITION(); return result; -#endif } @@ -4781,10 +4641,6 @@ CorInfoType CEEInfo::getChildType ( CORINFO_CLASS_HANDLE *clsRet ) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4817,17 +4673,12 @@ CorInfoType CEEInfo::getChildType ( EE_TO_JIT_TRANSITION(); return ret; -#endif } /*********************************************************************/ // Check if this is a single dimensional, zero based array type bool CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4853,17 +4704,12 @@ bool CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ // Get the number of dimensions in an array unsigned CEEInfo::getArrayRank(CORINFO_CLASS_HANDLE cls) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4889,17 +4735,12 @@ unsigned CEEInfo::getArrayRank(CORINFO_CLASS_HANDLE cls) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ // Get the index of runtime provided array method CorInfoArrayIntrinsic CEEInfo::getArrayIntrinsicID(CORINFO_METHOD_HANDLE ftn) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4932,7 +4773,6 @@ CorInfoArrayIntrinsic CEEInfo::getArrayIntrinsicID(CORINFO_METHOD_HANDLE ftn) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -4945,10 +4785,6 @@ void * CEEInfo::getArrayInitializationData( uint32_t size ) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -4975,7 +4811,6 @@ void * CEEInfo::getArrayInitializationData( EE_TO_JIT_TRANSITION(); return result; -#endif } CorInfoIsAccessAllowedResult CEEInfo::canAccessClass( @@ -6105,10 +5940,6 @@ CorInfoHelpFunc CEEInfo::getCastingHelperStatic(TypeHandle clsHnd, bool fThrowin /***********************************************************************/ CorInfoHelpFunc CEEInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -6131,7 +5962,6 @@ CorInfoHelpFunc CEEInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd) result = CORINFO_HELP_INITCLASS; return result; -#endif } /***********************************************************************/ @@ -6179,10 +6009,6 @@ CORINFO_OBJECT_HANDLE CEEInfo::getRuntimeTypePointer(CORINFO_CLASS_HANDLE clsHnd /***********************************************************************/ bool CEEInfo::isObjectImmutable(CORINFO_OBJECT_HANDLE objHandle) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6218,16 +6044,11 @@ bool CEEInfo::isObjectImmutable(CORINFO_OBJECT_HANDLE objHandle) EE_TO_JIT_TRANSITION(); return isImmutable; -#endif } /***********************************************************************/ bool CEEInfo::getStringChar(CORINFO_OBJECT_HANDLE obj, int index, uint16_t* value) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6256,16 +6077,11 @@ bool CEEInfo::getStringChar(CORINFO_OBJECT_HANDLE obj, int index, uint16_t* valu EE_TO_JIT_TRANSITION(); return result; -#endif } /***********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getObjectType(CORINFO_OBJECT_HANDLE objHandle) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL{ THROWS; GC_TRIGGERS; @@ -6285,7 +6101,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getObjectType(CORINFO_OBJECT_HANDLE objHandle) EE_TO_JIT_TRANSITION(); return handle; -#endif } /***********************************************************************/ @@ -6371,10 +6186,6 @@ CORINFO_VARARGS_HANDLE CEEInfo::getVarArgsHandle(CORINFO_SIG_INFO *sig, CORINFO_METHOD_HANDLE methHnd, void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6399,16 +6210,11 @@ CORINFO_VARARGS_HANDLE CEEInfo::getVarArgsHandle(CORINFO_SIG_INFO *sig, EE_TO_JIT_TRANSITION(); return result; -#endif } /***********************************************************************/ unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6426,16 +6232,11 @@ unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) EE_TO_JIT_TRANSITION(); return result; -#endif } /***********************************************************************/ size_t CEEInfo::printMethodName(CORINFO_METHOD_HANDLE ftnHnd, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_NOTRIGGER; @@ -6465,7 +6266,6 @@ size_t CEEInfo::printMethodName(CORINFO_METHOD_HANDLE ftnHnd, char* buffer, size EE_TO_JIT_TRANSITION(); return bytesWritten; -#endif } const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName, const char** enclosingClassNames, size_t maxEnclosingClassNames) @@ -6535,10 +6335,6 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con /*********************************************************************/ const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const char** namespaceName) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6564,16 +6360,11 @@ const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const ch EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, unsigned index) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -6592,15 +6383,10 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } CORINFO_CLASS_HANDLE CEEInfo::getMethodInstantiationArgument(CORINFO_METHOD_HANDLE ftn, unsigned index) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -6621,7 +6407,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getMethodInstantiationArgument(CORINFO_METHOD_HAND EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -6649,10 +6434,6 @@ bool CEEInfo::isIntrinsic(CORINFO_METHOD_HANDLE ftn) bool CEEInfo::notifyMethodInfoUsage(CORINFO_METHOD_HANDLE ftn) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6672,7 +6453,6 @@ bool CEEInfo::notifyMethodInfoUsage(CORINFO_METHOD_HANDLE ftn) EE_TO_JIT_TRANSITION(); return true; -#endif } /*********************************************************************/ @@ -6820,10 +6600,6 @@ void CEEInfo::setMethodAttribs ( CORINFO_METHOD_HANDLE ftnHnd, CorInfoMethodRuntimeFlags attribs) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -6860,7 +6636,6 @@ void CEEInfo::setMethodAttribs ( } EE_TO_JIT_TRANSITION(); -#endif } /*********************************************************************/ @@ -7947,10 +7722,6 @@ CEEInfo::getMethodInfo( CORINFO_METHOD_INFO * methInfo, CORINFO_CONTEXT_HANDLE context) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -7986,17 +7757,12 @@ CEEInfo::getMethodInfo( EE_TO_JIT_TRANSITION(); return result; -#endif } bool CEEInfo::haveSameMethodDefinition( CORINFO_METHOD_HANDLE meth1Hnd, CORINFO_METHOD_HANDLE meth2Hnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -8014,15 +7780,10 @@ bool CEEInfo::haveSameMethodDefinition( EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8053,7 +7814,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) _ASSERTE(result != NULL); return result; -#endif } /************************************************************* @@ -8064,10 +7824,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeDefinition(CORINFO_CLASS_HANDLE type) CorInfoInline CEEInfo::canInline (CORINFO_METHOD_HANDLE hCaller, CORINFO_METHOD_HANDLE hCallee) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8264,7 +8020,6 @@ exit: ; } return result; -#endif } void CEEInfo::beginInlining(CORINFO_METHOD_HANDLE inlinerHnd, @@ -8278,10 +8033,6 @@ void CEEInfo::reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd, CorInfoInline inlineResult, const char * reason) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -8441,7 +8192,6 @@ void CEEInfo::reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd, #endif // defined FEATURE_REJIT && !defined(DACCESS_COMPILE) EE_TO_JIT_TRANSITION(); -#endif } @@ -8797,10 +8547,6 @@ CEEInfo::getMethodClass( /*********************************************************************/ bool CEEInfo::isIntrinsicType(CORINFO_CLASS_HANDLE classHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -8816,7 +8562,6 @@ bool CEEInfo::isIntrinsicType(CORINFO_CLASS_HANDLE classHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -8825,10 +8570,6 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd, unsigned * pOffsetAfterIndirection, bool * isRelative) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -8853,7 +8594,6 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd, *isRelative = false; EE_TO_JIT_TRANSITION(); -#endif } /*********************************************************************/ @@ -9157,10 +8897,6 @@ bool CEEInfo::resolveVirtualMethodHelper(CORINFO_DEVIRTUALIZATION_INFO * info) bool CEEInfo::resolveVirtualMethod(CORINFO_DEVIRTUALIZATION_INFO * info) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9176,7 +8912,6 @@ bool CEEInfo::resolveVirtualMethod(CORINFO_DEVIRTUALIZATION_INFO * info) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -9184,10 +8919,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getUnboxedEntry( CORINFO_METHOD_HANDLE ftn, bool* requiresInstMethodTableArg) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9215,7 +8946,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getUnboxedEntry( EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -9224,10 +8954,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getInstantiatedEntry( CORINFO_METHOD_HANDLE* methodArg, CORINFO_CLASS_HANDLE* classArg) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9261,7 +8987,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getInstantiatedEntry( EE_TO_JIT_TRANSITION(); return result; -#endif } CORINFO_METHOD_HANDLE CEEInfo::getAsyncOtherVariant( @@ -9311,10 +9036,6 @@ void CEEInfo::expandRawHandleIntrinsic( /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClass(CORINFO_CLASS_HANDLE elemType) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9330,7 +9051,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClass(CORINFO_CLASS_HANDLE elemT EE_TO_JIT_TRANSITION(); return result; -#endif } CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9384,10 +9104,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultComparerClassHelper(CORINFO_CLASS_HANDLE /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HANDLE elemType) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9403,7 +9119,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HAND EE_TO_JIT_TRANSITION(); return result; -#endif } CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9465,10 +9180,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClassHelper(CORINFO_CLAS /*********************************************************************/ CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClass(CORINFO_CLASS_HANDLE elemType) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9484,7 +9195,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClass(CORINFO_CLASS_HAND EE_TO_JIT_TRANSITION(); return result; -#endif } CORINFO_CLASS_HANDLE CEEInfo::getSZArrayHelperEnumeratorClassHelper(CORINFO_CLASS_HANDLE elemType) @@ -9510,10 +9220,6 @@ void CEEInfo::getFunctionEntryPoint(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_CONST_LOOKUP * pResult, CORINFO_ACCESS_FLAGS accessFlags) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9581,7 +9287,6 @@ void CEEInfo::getFunctionEntryPoint(CORINFO_METHOD_HANDLE ftnHnd, pResult->accessType = accessType; pResult->addr = ret; -#endif } /*********************************************************************/ @@ -9611,10 +9316,6 @@ void CEEInfo::getFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, /*********************************************************************/ size_t CEEInfo::printFieldName(CORINFO_FIELD_HANDLE fieldHnd, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_NOTRIGGER; @@ -9643,17 +9344,12 @@ size_t CEEInfo::printFieldName(CORINFO_FIELD_HANDLE fieldHnd, char* buffer, size EE_TO_JIT_TRANSITION(); return bytesWritten; -#endif } /*********************************************************************/ // Get the type that declares the field CORINFO_CLASS_HANDLE CEEInfo::getFieldClass (CORINFO_FIELD_HANDLE fieldHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -9670,7 +9366,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getFieldClass (CORINFO_FIELD_HANDLE fieldHnd) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -9684,10 +9379,6 @@ CorInfoType CEEInfo::getFieldType (CORINFO_FIELD_HANDLE fieldHnd, CORINFO_CLASS_HANDLE* pTypeHnd, CORINFO_CLASS_HANDLE fieldOwnerHint) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9703,7 +9394,6 @@ CorInfoType CEEInfo::getFieldType (CORINFO_FIELD_HANDLE fieldHnd, EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -9776,10 +9466,6 @@ CorInfoType CEEInfo::getFieldTypeInternal (CORINFO_FIELD_HANDLE fieldHnd, /*********************************************************************/ unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9812,16 +9498,11 @@ unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ uint32_t CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9846,7 +9527,6 @@ uint32_t CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void EE_TO_JIT_TRANSITION(); return result; -#endif } void *CEEInfo::allocateArray(size_t cBytes) @@ -9898,10 +9578,6 @@ void CEEInfo::getBoundaries(CORINFO_METHOD_HANDLE ftn, unsigned int *cILOffsets, uint32_t **pILOffsets, ICorDebugInfo::BoundaryTypes *implicitBoundaries) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9925,16 +9601,11 @@ void CEEInfo::getBoundaries(CORINFO_METHOD_HANDLE ftn, #endif // DEBUGGING_SUPPORTED EE_TO_JIT_TRANSITION(); -#endif } void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo::ILVarInfo **vars, bool *extendOthers) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -9959,7 +9630,6 @@ void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo:: #endif // DEBUGGING_SUPPORTED EE_TO_JIT_TRANSITION(); -#endif } /*********************************************************************/ @@ -10115,10 +9785,6 @@ CorInfoTypeWithMod CEEInfo::getArgType ( // see the struct `CORINFO_FPSTRUCT_LOWERING`. void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRUCT_LOWERING* pLowering) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10162,7 +9828,6 @@ void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRU #endif // TARGET_RISCV64 || TARGET_LOONGARCH64 EE_TO_JIT_TRANSITION(); -#endif } /*********************************************************************/ @@ -10173,10 +9838,6 @@ int CEEInfo::getExactClasses ( CORINFO_CLASS_HANDLE* exactClsRet ) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10191,7 +9852,6 @@ int CEEInfo::getExactClasses ( EE_TO_JIT_TRANSITION(); return -1; -#endif } /*********************************************************************/ @@ -10201,10 +9861,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( CORINFO_ARG_LIST_HANDLE args ) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10244,17 +9900,12 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ CorInfoHFAElemType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10272,7 +9923,6 @@ CorInfoHFAElemType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) EE_TO_JIT_TRANSITION(); return result; -#endif } namespace @@ -10487,14 +10137,9 @@ bool CEEInfo::pInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SI LPVOID CEEInfo::GetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig, void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else WRAPPER_NO_CONTRACT; return getVarArgsHandle(szMetaSig, NULL, ppIndirection); -#endif } // Check any constraints on method type arguments @@ -10502,10 +10147,6 @@ bool CEEInfo::satisfiesMethodConstraints( CORINFO_CLASS_HANDLE parent, CORINFO_METHOD_HANDLE method) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10523,7 +10164,6 @@ bool CEEInfo::satisfiesMethodConstraints( EE_TO_JIT_TRANSITION(); return result; -#endif } @@ -10569,10 +10209,6 @@ CORINFO_WASM_TYPE_SYMBOL_HANDLE CEEInfo::getWasmTypeSymbol( CORINFO_METHOD_HANDLE CEEInfo::getSpecialCopyHelper(CORINFO_CLASS_HANDLE type) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10607,7 +10243,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getSpecialCopyHelper(CORINFO_CLASS_HANDLE type) EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -10615,10 +10250,6 @@ CORINFO_JUST_MY_CODE_HANDLE CEEInfo::getJustMyCodeHandle( CORINFO_METHOD_HANDLE method, CORINFO_JUST_MY_CODE_HANDLE**ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10646,7 +10277,6 @@ CORINFO_JUST_MY_CODE_HANDLE CEEInfo::getJustMyCodeHandle( EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } /*********************************************************************/ @@ -10683,10 +10313,6 @@ CORINFO_OS getClrVmOs() // Return details about EE internal data structures void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10731,7 +10357,6 @@ void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) pEEInfoOut->osType = getClrVmOs(); EE_TO_JIT_TRANSITION(); -#endif } void CEEInfo::getAsyncInfo(CORINFO_ASYNC_INFO* pAsyncInfoOut) @@ -10811,10 +10436,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getContinuationType( // Return details about EE internal data structures uint32_t CEEInfo::getThreadTLSIndex(void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -10827,16 +10448,11 @@ uint32_t CEEInfo::getThreadTLSIndex(void **ppIndirection) *ppIndirection = NULL; return result; -#endif } int32_t * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10855,7 +10471,6 @@ int32_t * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) EE_TO_JIT_TRANSITION_LEAF(); return result; -#endif } // This code is called if FilterException chose to handle the exception. @@ -10938,10 +10553,6 @@ void CEEInfo::HandleException(struct _EXCEPTION_POINTERS *pExceptionPointers) CORINFO_MODULE_HANDLE CEEInfo::embedModuleHandle(CORINFO_MODULE_HANDLE handle, void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -10958,7 +10569,6 @@ CORINFO_MODULE_HANDLE CEEInfo::embedModuleHandle(CORINFO_MODULE_HANDLE handle, EE_TO_JIT_TRANSITION_LEAF(); return handle; -#endif } CORINFO_CLASS_HANDLE CEEInfo::embedClassHandle(CORINFO_CLASS_HANDLE handle, @@ -10984,10 +10594,6 @@ CORINFO_CLASS_HANDLE CEEInfo::embedClassHandle(CORINFO_CLASS_HANDLE handle, CORINFO_FIELD_HANDLE CEEInfo::embedFieldHandle(CORINFO_FIELD_HANDLE handle, void **ppIndirection) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { NOTHROW; GC_NOTRIGGER; @@ -11003,7 +10609,6 @@ CORINFO_FIELD_HANDLE CEEInfo::embedFieldHandle(CORINFO_FIELD_HANDLE handle, EE_TO_JIT_TRANSITION_LEAF(); return handle; -#endif } CORINFO_METHOD_HANDLE CEEInfo::embedMethodHandle(CORINFO_METHOD_HANDLE handle, @@ -11049,10 +10654,6 @@ uint32_t CEEInfo::getJitFlags(CORJIT_FLAGS* jitFlags, uint32_t sizeInBytes) bool CEEInfo::runWithSPMIErrorTrap(void (*function)(void*), void* param) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else // No dynamic contract here because SEH is used STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -11066,15 +10667,10 @@ bool CEEInfo::runWithSPMIErrorTrap(void (*function)(void*), void* param) function(param); return true; -#endif } bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -11106,7 +10702,6 @@ bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) catchFrame.Pop(); return success; -#endif } /*********************************************************************/ @@ -12813,10 +12408,6 @@ bool CEEInfo::getStaticObjRefContent(OBJECTREF obj, uint8_t* buffer, bool ignore bool CEEInfo::getStaticFieldContent(CORINFO_FIELD_HANDLE fieldHnd, uint8_t* buffer, int bufferSize, int valueOffset, bool ignoreMovableObjects) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -12941,15 +12532,10 @@ bool CEEInfo::getStaticFieldContent(CORINFO_FIELD_HANDLE fieldHnd, uint8_t* buff EE_TO_JIT_TRANSITION(); return result; -#endif } bool CEEInfo::getObjectContent(CORINFO_OBJECT_HANDLE handle, uint8_t* buffer, int bufferSize, int valueOffset) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -12994,7 +12580,6 @@ bool CEEInfo::getObjectContent(CORINFO_OBJECT_HANDLE handle, uint8_t* buffer, in EE_TO_JIT_TRANSITION(); return result; -#endif } /*********************************************************************/ @@ -15192,10 +14777,6 @@ bool CEEInfo::getTailCallHelpers(CORINFO_RESOLVED_TOKEN* callToken, CORINFO_GET_TAILCALL_HELPERS_FLAGS flags, CORINFO_TAILCALL_HELPERS* pResult) { -#ifndef FEATURE_DYNAMIC_CODE_COMPILED - LIMITED_METHOD_CONTRACT; - UNREACHABLE_MSG("Not needed in interpreter-only builds"); -#else CONTRACTL { THROWS; GC_TRIGGERS; @@ -15211,7 +14792,6 @@ bool CEEInfo::getTailCallHelpers(CORINFO_RESOLVED_TOKEN* callToken, EE_TO_JIT_TRANSITION(); return success; -#endif } static Signature AllocateSignature(LoaderAllocator* alloc, SigBuilder& sigBuilder, AllocMemTracker* pamTracker) From ce4977d869e4339299ba3d45d53a081fdd117dca Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Tue, 21 Apr 2026 19:46:03 +0200 Subject: [PATCH 06/10] Feedback Also disable server GC on iOS and tvOS. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/coreclr/clrdefinitions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake index 91a8f7353eb248..6ad026ec0254a5 100644 --- a/src/coreclr/clrdefinitions.cmake +++ b/src/coreclr/clrdefinitions.cmake @@ -173,10 +173,10 @@ endif (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX) if (FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) add_definitions(-DFEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) endif(FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION) -if (NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM) +if (NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS) set(FEATURE_SVR_GC 1) add_definitions(-DFEATURE_SVR_GC) -endif(NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM) +endif(NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_ARCH_WASM AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS) add_definitions(-DFEATURE_SYMDIFF) if (FEATURE_TIERED_COMPILATION) From dbf2e936d8a390e36b12bf30aae083907bb1c7fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 17:31:09 +0000 Subject: [PATCH 07/10] Handle optional background GC fields in cDAC contract reader Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/1e26f7c7-3b3e-4cd7-a48d-366fafe10a91 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- docs/design/datacontracts/GC.md | 17 ++++++++------- .../gc/datadescriptor/datadescriptor.inc | 4 ++++ .../Constants.cs | 1 + .../Contracts/GC/GCHeapWKS.cs | 20 +++++++++++------- .../Contracts/GC/GC_1.cs | 8 +++---- .../Contracts/GC/IGCHeap.cs | 8 +++---- .../Data/GC/GCHeapSVR.cs | 21 ++++++++++++------- 7 files changed, 47 insertions(+), 32 deletions(-) diff --git a/docs/design/datacontracts/GC.md b/docs/design/datacontracts/GC.md index ad5d135b3b97dc..22c0e2e66df743 100644 --- a/docs/design/datacontracts/GC.md +++ b/docs/design/datacontracts/GC.md @@ -152,10 +152,10 @@ public readonly struct GCMemoryRegionData Data descriptors used: | Data Descriptor Name | Field | Source | Meaning | | --- | --- | --- | --- | -| `GCHeap` | MarkArray | GC | Pointer to the heap's MarkArray (in sever builds) | -| `GCHeap` | NextSweepObj | GC | Pointer to the heap's NextSweepObj (in sever builds) | -| `GCHeap` | BackgroundMinSavedAddr | GC | Heap's background saved lowest address (in sever builds) | -| `GCHeap` | BackgroundMaxSavedAddr | GC | Heap's background saved highest address (in sever builds) | +| `GCHeap` | MarkArray | GC | Pointer to the heap's MarkArray (only in server builds with background GC) | +| `GCHeap` | NextSweepObj | GC | Pointer to the heap's NextSweepObj (only in server builds with background GC) | +| `GCHeap` | BackgroundMinSavedAddr | GC | Heap's background saved lowest address (only in server builds with background GC) | +| `GCHeap` | BackgroundMaxSavedAddr | GC | Heap's background saved highest address (only in server builds with background GC) | | `GCHeap` | AllocAllocated | GC | Heap's highest address allocated by Alloc (in sever builds) | | `GCHeap` | EphemeralHeapSegment | GC | Pointer to the heap's ephemeral heap segment (in sever builds) | | `GCHeap` | CardTable | GC | Pointer to the heap's bookkeeping GC data structure (in sever builds) | @@ -229,10 +229,10 @@ Global variables used: | `CompactReasonsLength` | uint | GC | The number of elements in the `CompactReasons` array | | `ExpandMechanismsLength` | uint | GC | The number of elements in the `ExpandMechanisms` array | | `InterestingMechanismBitsLength` | uint | GC | The number of elements in the `InterestingMechanismBits` array | -| `GCHeapMarkArray` | TargetPointer | GC | Pointer to the static heap's MarkArray (in workstation builds) | -| `GCHeapNextSweepObj` | TargetPointer | GC | Pointer to the static heap's NextSweepObj (in workstation builds) | -| `GCHeapBackgroundMinSavedAddr` | TargetPointer | GC | Background saved lowest address (in workstation builds) | -| `GCHeapBackgroundMaxSavedAddr` | TargetPointer | GC | Background saved highest address (in workstation builds) | +| `GCHeapMarkArray` | TargetPointer | GC | Pointer to the static heap's MarkArray (in workstation builds with background GC) | +| `GCHeapNextSweepObj` | TargetPointer | GC | Pointer to the static heap's NextSweepObj (in workstation builds with background GC) | +| `GCHeapBackgroundMinSavedAddr` | TargetPointer | GC | Background saved lowest address (in workstation builds with background GC) | +| `GCHeapBackgroundMaxSavedAddr` | TargetPointer | GC | Background saved highest address (in workstation builds with background GC) | | `GCHeapAllocAllocated` | TargetPointer | GC | Highest address allocated by Alloc (in workstation builds) | | `GCHeapEphemeralHeapSegment` | TargetPointer | GC | Pointer to an ephemeral heap segment (in workstation builds) | | `GCHeapCardTable` | TargetPointer | GC | Pointer to the static heap's bookkeeping GC data structure (in workstation builds) | @@ -250,6 +250,7 @@ Global variables used: | `GCHeapInterestingMechanismBits` | TargetPointer | GC | Data array stored per heap (in workstation builds) | | `CurrentGCState` | uint | GC | `c_gc_state` enum value. Only available when `GCIdentifiers` contains `background`. | | `DynamicAdaptationMode` | int | GC | GC heap dynamic adaptation mode. Only available when `GCIdentifiers` contains `dynamic_heap`. | +| `FeatureBackgroundGc` | byte | GC | Non-zero when background (concurrent) GC is enabled. If this global does not exist or is set to 0, the `MarkArray`, `NextSweepObj`, `BackgroundMinSavedAddr`, and `BackgroundMaxSavedAddr` fields and globals are not present and are assumed to have the value 0. | | `GCLowestAddress` | TargetPointer | VM | Lowest GC address as recorded by the VM/GC interface | | `GCHighestAddress` | TargetPointer | VM | Highest GC address as recorded by the VM/GC interface | | `HandleTableMap` | TargetPointer | GC | Pointer to the head of the handle table map linked list | diff --git a/src/coreclr/gc/datadescriptor/datadescriptor.inc b/src/coreclr/gc/datadescriptor/datadescriptor.inc index 07e2d01c884a4f..6c6ec690ffa5eb 100644 --- a/src/coreclr/gc/datadescriptor/datadescriptor.inc +++ b/src/coreclr/gc/datadescriptor/datadescriptor.inc @@ -13,10 +13,12 @@ CDAC_TYPES_BEGIN() #ifdef SERVER_GC CDAC_TYPE_BEGIN(GCHeap) CDAC_TYPE_INDETERMINATE(GCHeap) +#ifdef BACKGROUND_GC CDAC_TYPE_FIELD(GCHeap, T_POINTER, MarkArray, cdac_data::MarkArray) CDAC_TYPE_FIELD(GCHeap, T_POINTER, NextSweepObj, cdac_data::NextSweepObj) CDAC_TYPE_FIELD(GCHeap, T_POINTER, BackgroundMinSavedAddr, cdac_data::BackgroundMinSavedAddr) CDAC_TYPE_FIELD(GCHeap, T_POINTER, BackgroundMaxSavedAddr, cdac_data::BackgroundMaxSavedAddr) +#endif // BACKGROUND_GC CDAC_TYPE_FIELD(GCHeap, T_POINTER, AllocAllocated, cdac_data::AllocAllocated) CDAC_TYPE_FIELD(GCHeap, T_POINTER, EphemeralHeapSegment, cdac_data::EphemeralHeapSegment) CDAC_TYPE_FIELD(GCHeap, T_POINTER, CardTable, cdac_data::CardTable) @@ -205,8 +207,10 @@ CDAC_GLOBAL_POINTER(GlobalRegionsToDecommit, cdac_data::G #ifdef BACKGROUND_GC #define BACKGROUND_TYPE background +CDAC_GLOBAL(FeatureBackgroundGc, T_UINT8, 1) #else // BACKGROUND_GC #define BACKGROUND_TYPE +CDAC_GLOBAL(FeatureBackgroundGc, T_UINT8, 0) #endif // BACKGROUND_GC #ifdef DYNAMIC_HEAP_COUNT diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs index 41eccea4c65d96..e117c6a4b5f8ff 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs @@ -114,6 +114,7 @@ public static class Globals // Globals found on GCDescriptor // see src/coreclr/gc/datadescriptors/datadescriptor.inc public const string GCIdentifiers = nameof(GCIdentifiers); + public const string FeatureBackgroundGc = nameof(FeatureBackgroundGc); public const string MaxGeneration = nameof(MaxGeneration); public const string StructureInvalidCount = nameof(StructureInvalidCount); public const string NumHeaps = nameof(NumHeaps); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GCHeapWKS.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GCHeapWKS.cs index 99e9ee879cdd4a..355331f61cea28 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GCHeapWKS.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GCHeapWKS.cs @@ -7,10 +7,14 @@ internal sealed class GCHeapWKS : IGCHeap { public GCHeapWKS(Target target) { - MarkArray = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapMarkArray)); - NextSweepObj = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapNextSweepObj)); - BackgroundMinSavedAddr = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapBackgroundMinSavedAddr)); - BackgroundMaxSavedAddr = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapBackgroundMaxSavedAddr)); + if (target.TryReadGlobalPointer(Constants.Globals.GCHeapMarkArray, out TargetPointer? markArrayPtr)) + MarkArray = target.ReadPointer(markArrayPtr.Value); + if (target.TryReadGlobalPointer(Constants.Globals.GCHeapNextSweepObj, out TargetPointer? nextSweepObjPtr)) + NextSweepObj = target.ReadPointer(nextSweepObjPtr.Value); + if (target.TryReadGlobalPointer(Constants.Globals.GCHeapBackgroundMinSavedAddr, out TargetPointer? bgMinPtr)) + BackgroundMinSavedAddr = target.ReadPointer(bgMinPtr.Value); + if (target.TryReadGlobalPointer(Constants.Globals.GCHeapBackgroundMaxSavedAddr, out TargetPointer? bgMaxPtr)) + BackgroundMaxSavedAddr = target.ReadPointer(bgMaxPtr.Value); AllocAllocated = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapAllocAllocated)); EphemeralHeapSegment = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapEphemeralHeapSegment)); CardTable = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapCardTable)); @@ -41,10 +45,10 @@ public GCHeapWKS(Target target) FreeRegions = freeRegionsPtr.Value; } - public TargetPointer MarkArray { get; } - public TargetPointer NextSweepObj { get; } - public TargetPointer BackgroundMinSavedAddr { get; } - public TargetPointer BackgroundMaxSavedAddr { get; } + public TargetPointer? MarkArray { get; } + public TargetPointer? NextSweepObj { get; } + public TargetPointer? BackgroundMinSavedAddr { get; } + public TargetPointer? BackgroundMaxSavedAddr { get; } public TargetPointer AllocAllocated { get; } public TargetPointer EphemeralHeapSegment { get; } public TargetPointer CardTable { get; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs index 9fd8ced2e9ed2d..932a31af52e3e2 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs @@ -170,10 +170,10 @@ private GCHeapData GetGCHeapDataFromHeap(IGCHeap heap) return new GCHeapData() { - MarkArray = heap.MarkArray, - NextSweepObject = heap.NextSweepObj, - BackGroundSavedMinAddress = heap.BackgroundMinSavedAddr, - BackGroundSavedMaxAddress = heap.BackgroundMaxSavedAddr, + MarkArray = heap.MarkArray ?? TargetPointer.Null, + NextSweepObject = heap.NextSweepObj ?? TargetPointer.Null, + BackGroundSavedMinAddress = heap.BackgroundMinSavedAddr ?? TargetPointer.Null, + BackGroundSavedMaxAddress = heap.BackgroundMaxSavedAddr ?? TargetPointer.Null, AllocAllocated = heap.AllocAllocated, EphemeralHeapSegment = heap.EphemeralHeapSegment, CardTable = heap.CardTable, diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/IGCHeap.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/IGCHeap.cs index f7e6dc1cc9ac77..4264e9611db325 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/IGCHeap.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/IGCHeap.cs @@ -5,10 +5,10 @@ namespace Microsoft.Diagnostics.DataContractReader.Contracts.GCHelpers; internal interface IGCHeap { - TargetPointer MarkArray { get; } - TargetPointer NextSweepObj { get; } - TargetPointer BackgroundMinSavedAddr { get; } - TargetPointer BackgroundMaxSavedAddr { get; } + TargetPointer? MarkArray { get; } + TargetPointer? NextSweepObj { get; } + TargetPointer? BackgroundMinSavedAddr { get; } + TargetPointer? BackgroundMaxSavedAddr { get; } TargetPointer AllocAllocated { get; } TargetPointer EphemeralHeapSegment { get; } TargetPointer CardTable { get; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/GCHeapSVR.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/GCHeapSVR.cs index 7acf5d75459357..0cd297968c8b6f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/GCHeapSVR.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/GCHeapSVR.cs @@ -14,10 +14,15 @@ public GCHeapSVR(Target target, TargetPointer address) { Target.TypeInfo type = target.GetTypeInfo(DataType.GCHeap); - MarkArray = target.ReadPointerField(address, type, nameof(MarkArray)); - NextSweepObj = target.ReadPointerField(address, type, nameof(NextSweepObj)); - BackgroundMinSavedAddr = target.ReadPointerField(address, type, nameof(BackgroundMinSavedAddr)); - BackgroundMaxSavedAddr = target.ReadPointerField(address, type, nameof(BackgroundMaxSavedAddr)); + // Fields only exist in background GC builds + if (type.Fields.ContainsKey(nameof(MarkArray))) + MarkArray = target.ReadPointerField(address, type, nameof(MarkArray)); + if (type.Fields.ContainsKey(nameof(NextSweepObj))) + NextSweepObj = target.ReadPointerField(address, type, nameof(NextSweepObj)); + if (type.Fields.ContainsKey(nameof(BackgroundMinSavedAddr))) + BackgroundMinSavedAddr = target.ReadPointerField(address, type, nameof(BackgroundMinSavedAddr)); + if (type.Fields.ContainsKey(nameof(BackgroundMaxSavedAddr))) + BackgroundMaxSavedAddr = target.ReadPointerField(address, type, nameof(BackgroundMaxSavedAddr)); AllocAllocated = target.ReadPointerField(address, type, nameof(AllocAllocated)); EphemeralHeapSegment = target.ReadPointerField(address, type, nameof(EphemeralHeapSegment)); CardTable = target.ReadPointerField(address, type, nameof(CardTable)); @@ -49,10 +54,10 @@ public GCHeapSVR(Target target, TargetPointer address) FreeRegions = address + (ulong)type.Fields[nameof(FreeRegions)].Offset; } - public TargetPointer MarkArray { get; } - public TargetPointer NextSweepObj { get; } - public TargetPointer BackgroundMinSavedAddr { get; } - public TargetPointer BackgroundMaxSavedAddr { get; } + public TargetPointer? MarkArray { get; } + public TargetPointer? NextSweepObj { get; } + public TargetPointer? BackgroundMinSavedAddr { get; } + public TargetPointer? BackgroundMaxSavedAddr { get; } public TargetPointer AllocAllocated { get; } public TargetPointer EphemeralHeapSegment { get; } public TargetPointer CardTable { get; } From d4d8bf3db7283c94313613e9bffa487523179a3f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 17:40:50 +0000 Subject: [PATCH 08/10] Update GC.md pseudocode to use optional pattern for background GC fields Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/1e26f7c7-3b3e-4cd7-a48d-366fafe10a91 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- docs/design/datacontracts/GC.md | 72 +++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/docs/design/datacontracts/GC.md b/docs/design/datacontracts/GC.md index 22c0e2e66df743..393d3f710f5e2c 100644 --- a/docs/design/datacontracts/GC.md +++ b/docs/design/datacontracts/GC.md @@ -456,10 +456,38 @@ GCHeapData IGC.GetHeapData() GCHeapData data; // Read fields directly from globals - data.MarkArray = target.ReadPointer(target.ReadGlobalPointer("GCHeapMarkArray")); - data.NextSweepObj = target.ReadPointer(target.ReadGlobalPointer("GCHeapNextSweepObj")); - data.BackgroundMinSavedAddr = target.ReadPointer(target.ReadGlobalPointer("GCHeapBackgroundMinSavedAddr")); - data.BackgroundMaxSavedAddr = target.ReadPointer(target.ReadGlobalPointer("GCHeapBackgroundMaxSavedAddr")); + if (target.TryReadGlobalPointer("GCHeapMarkArray", out TargetPointer? markArrayPtr)) + { + data.MarkArray = target.ReadPointer(markArrayPtr.Value); + } + else + { + data.MarkArray = 0; + } + if (target.TryReadGlobalPointer("GCHeapNextSweepObj", out TargetPointer? nextSweepObjPtr)) + { + data.NextSweepObj = target.ReadPointer(nextSweepObjPtr.Value); + } + else + { + data.NextSweepObj = 0; + } + if (target.TryReadGlobalPointer("GCHeapBackgroundMinSavedAddr", out TargetPointer? bgMinPtr)) + { + data.BackgroundMinSavedAddr = target.ReadPointer(bgMinPtr.Value); + } + else + { + data.BackgroundMinSavedAddr = 0; + } + if (target.TryReadGlobalPointer("GCHeapBackgroundMaxSavedAddr", out TargetPointer? bgMaxPtr)) + { + data.BackgroundMaxSavedAddr = target.ReadPointer(bgMaxPtr.Value); + } + else + { + data.BackgroundMaxSavedAddr = 0; + } data.AllocAllocated = target.ReadPointer(target.ReadGlobalPointer("GCHeapAllocAllocated")); data.EphemeralHeapSegment = target.ReadPointer(target.ReadGlobalPointer("GCHeapEphemeralHeapSegment")); data.CardTable = target.ReadPointer(target.ReadGlobalPointer("GCHeapCardTable")); @@ -523,10 +551,38 @@ GCHeapData IGC.GetHeapData(TargetPointer heapAddress) GCHeapData data; // Read fields directly from heap - data.MarkArray = target.ReadPointer(heapAddress + /* GCHeap::MarkArray offset */); - data.NextSweepObj = target.ReadPointer(heapAddress + /* GCHeap::NextSweepObj offset */); - data.BackgroundMinSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMinSavedAddr offset */); - data.BackgroundMaxSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMaxSavedAddr offset */); + if (/* GCHeap::MarkArray is present */) + { + data.MarkArray = target.ReadPointer(heapAddress + /* GCHeap::MarkArray offset */); + } + else + { + data.MarkArray = 0; + } + if (/* GCHeap::NextSweepObj is present */) + { + data.NextSweepObj = target.ReadPointer(heapAddress + /* GCHeap::NextSweepObj offset */); + } + else + { + data.NextSweepObj = 0; + } + if (/* GCHeap::BackgroundMinSavedAddr is present */) + { + data.BackgroundMinSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMinSavedAddr offset */); + } + else + { + data.BackgroundMinSavedAddr = 0; + } + if (/* GCHeap::BackgroundMaxSavedAddr is present */) + { + data.BackgroundMaxSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMaxSavedAddr offset */); + } + else + { + data.BackgroundMaxSavedAddr = 0; + } data.AllocAllocated = target.ReadPointer(heapAddress + /* GCHeap::AllocAllocated offset */); data.EphemeralHeapSegment = target.ReadPointer(heapAddress + /* GCHeap::EphemeralHeapSegment offset */); data.CardTable = target.ReadPointer(heapAddress + /* GCHeap::CardTable offset */); From b0d22b5a01478bdb951c50807e06a1eaa351724c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 17:42:28 +0000 Subject: [PATCH 09/10] Improve GC.md documentation comments for optional background GC fields Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/1e26f7c7-3b3e-4cd7-a48d-366fafe10a91 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- docs/design/datacontracts/GC.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/design/datacontracts/GC.md b/docs/design/datacontracts/GC.md index 393d3f710f5e2c..3c6cb588049ae6 100644 --- a/docs/design/datacontracts/GC.md +++ b/docs/design/datacontracts/GC.md @@ -455,7 +455,8 @@ GCHeapData IGC.GetHeapData() GCHeapData data; - // Read fields directly from globals + // Read background GC globals - these are absent when background GC is disabled (e.g., on WebAssembly). + // FeatureBackgroundGc will be 0 or absent in that case; read with TryReadGlobalPointer and default to 0. if (target.TryReadGlobalPointer("GCHeapMarkArray", out TargetPointer? markArrayPtr)) { data.MarkArray = target.ReadPointer(markArrayPtr.Value); @@ -550,8 +551,10 @@ GCHeapData IGC.GetHeapData(TargetPointer heapAddress) GCHeapData data; - // Read fields directly from heap - if (/* GCHeap::MarkArray is present */) + // Read background GC heap fields - these fields are absent when background GC is disabled (e.g., on WebAssembly). + // Check whether the field exists in the type layout before reading; default to 0 if not present. + Target.TypeInfo gcHeapType = target.GetTypeInfo(DataType.GCHeap); + if (gcHeapType.Fields.ContainsKey("MarkArray")) { data.MarkArray = target.ReadPointer(heapAddress + /* GCHeap::MarkArray offset */); } @@ -559,7 +562,7 @@ GCHeapData IGC.GetHeapData(TargetPointer heapAddress) { data.MarkArray = 0; } - if (/* GCHeap::NextSweepObj is present */) + if (gcHeapType.Fields.ContainsKey("NextSweepObj")) { data.NextSweepObj = target.ReadPointer(heapAddress + /* GCHeap::NextSweepObj offset */); } @@ -567,7 +570,7 @@ GCHeapData IGC.GetHeapData(TargetPointer heapAddress) { data.NextSweepObj = 0; } - if (/* GCHeap::BackgroundMinSavedAddr is present */) + if (gcHeapType.Fields.ContainsKey("BackgroundMinSavedAddr")) { data.BackgroundMinSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMinSavedAddr offset */); } @@ -575,7 +578,7 @@ GCHeapData IGC.GetHeapData(TargetPointer heapAddress) { data.BackgroundMinSavedAddr = 0; } - if (/* GCHeap::BackgroundMaxSavedAddr is present */) + if (gcHeapType.Fields.ContainsKey("BackgroundMaxSavedAddr")) { data.BackgroundMaxSavedAddr = target.ReadPointer(heapAddress + /* GCHeap::BackgroundMaxSavedAddr offset */); } From 0bb61e6f96b8ee02cd9f43baffc3f88ad6bbd77e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:06:46 +0000 Subject: [PATCH 10/10] Remove FeatureBackgroundGc global and references Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/f2b3bc16-9cd9-4a56-a401-ad3a56525764 Co-authored-by: davidwrighton <10779849+davidwrighton@users.noreply.github.com> --- docs/design/datacontracts/GC.md | 2 -- src/coreclr/gc/datadescriptor/datadescriptor.inc | 2 -- .../Constants.cs | 1 - 3 files changed, 5 deletions(-) diff --git a/docs/design/datacontracts/GC.md b/docs/design/datacontracts/GC.md index 3c6cb588049ae6..517c116c000621 100644 --- a/docs/design/datacontracts/GC.md +++ b/docs/design/datacontracts/GC.md @@ -250,7 +250,6 @@ Global variables used: | `GCHeapInterestingMechanismBits` | TargetPointer | GC | Data array stored per heap (in workstation builds) | | `CurrentGCState` | uint | GC | `c_gc_state` enum value. Only available when `GCIdentifiers` contains `background`. | | `DynamicAdaptationMode` | int | GC | GC heap dynamic adaptation mode. Only available when `GCIdentifiers` contains `dynamic_heap`. | -| `FeatureBackgroundGc` | byte | GC | Non-zero when background (concurrent) GC is enabled. If this global does not exist or is set to 0, the `MarkArray`, `NextSweepObj`, `BackgroundMinSavedAddr`, and `BackgroundMaxSavedAddr` fields and globals are not present and are assumed to have the value 0. | | `GCLowestAddress` | TargetPointer | VM | Lowest GC address as recorded by the VM/GC interface | | `GCHighestAddress` | TargetPointer | VM | Highest GC address as recorded by the VM/GC interface | | `HandleTableMap` | TargetPointer | GC | Pointer to the head of the handle table map linked list | @@ -456,7 +455,6 @@ GCHeapData IGC.GetHeapData() GCHeapData data; // Read background GC globals - these are absent when background GC is disabled (e.g., on WebAssembly). - // FeatureBackgroundGc will be 0 or absent in that case; read with TryReadGlobalPointer and default to 0. if (target.TryReadGlobalPointer("GCHeapMarkArray", out TargetPointer? markArrayPtr)) { data.MarkArray = target.ReadPointer(markArrayPtr.Value); diff --git a/src/coreclr/gc/datadescriptor/datadescriptor.inc b/src/coreclr/gc/datadescriptor/datadescriptor.inc index 6c6ec690ffa5eb..4377522f869d98 100644 --- a/src/coreclr/gc/datadescriptor/datadescriptor.inc +++ b/src/coreclr/gc/datadescriptor/datadescriptor.inc @@ -207,10 +207,8 @@ CDAC_GLOBAL_POINTER(GlobalRegionsToDecommit, cdac_data::G #ifdef BACKGROUND_GC #define BACKGROUND_TYPE background -CDAC_GLOBAL(FeatureBackgroundGc, T_UINT8, 1) #else // BACKGROUND_GC #define BACKGROUND_TYPE -CDAC_GLOBAL(FeatureBackgroundGc, T_UINT8, 0) #endif // BACKGROUND_GC #ifdef DYNAMIC_HEAP_COUNT diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs index e117c6a4b5f8ff..41eccea4c65d96 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs @@ -114,7 +114,6 @@ public static class Globals // Globals found on GCDescriptor // see src/coreclr/gc/datadescriptors/datadescriptor.inc public const string GCIdentifiers = nameof(GCIdentifiers); - public const string FeatureBackgroundGc = nameof(FeatureBackgroundGc); public const string MaxGeneration = nameof(MaxGeneration); public const string StructureInvalidCount = nameof(StructureInvalidCount); public const string NumHeaps = nameof(NumHeaps);