From 937f6e5d8c622cfd52fe6338463d7d9c5f3c6759 Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Wed, 1 Jul 2020 19:14:59 -0700 Subject: [PATCH] Fix interpreter build (#38673) Fix interpreter build --- src/coreclr/src/vm/callingconvention.h | 33 +++++++++++++++----------- src/coreclr/src/vm/interpreter.cpp | 25 ++++++++++++------- src/coreclr/src/vm/interpreter.h | 12 ++++++---- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/coreclr/src/vm/callingconvention.h b/src/coreclr/src/vm/callingconvention.h index f57232ccb97db..6687ea11c50d6 100644 --- a/src/coreclr/src/vm/callingconvention.h +++ b/src/coreclr/src/vm/callingconvention.h @@ -743,6 +743,9 @@ class ArgIteratorTemplate : public ARGITERATOR_BASE #ifdef TARGET_X86 int m_curOfs; // Current position of the stack iterator int m_numRegistersUsed; +#ifdef FEATURE_INTERPRETER + bool m_fUnmanagedCallConv; +#endif #endif #ifdef TARGET_AMD64 @@ -988,6 +991,7 @@ int ArgIteratorTemplate::GetNextOffset() m_fUnmanagedCallConv = false; m_numRegistersUsed = numRegistersUsed; m_curOfs = TransitionBlock::GetOffsetOfArgs() + SizeOfArgStack(); + break; } #else m_numRegistersUsed = numRegistersUsed; @@ -1601,20 +1605,21 @@ void ArgIteratorTemplate::ForceSigWalk() } #ifdef FEATURE_INTERPRETER - BYTE callconv = CallConv(); - switch (callconv) - { - case IMAGE_CEE_CS_CALLCONV_C: - case IMAGE_CEE_CS_CALLCONV_STDCALL: - numRegistersUsed = NUM_ARGUMENT_REGISTERS; - nSizeOfArgStack = TransitionBlock::GetOffsetOfArgs() + numRegistersUsed * sizeof(void *); - break; - - case IMAGE_CEE_CS_CALLCONV_THISCALL: - case IMAGE_CEE_CS_CALLCONV_FASTCALL: - _ASSERTE_MSG(false, "Unsupported calling convention."); - default: - } + BYTE callconv = CallConv(); + switch (callconv) + { + case IMAGE_CEE_CS_CALLCONV_C: + case IMAGE_CEE_CS_CALLCONV_STDCALL: + numRegistersUsed = NUM_ARGUMENT_REGISTERS; + nSizeOfArgStack = TransitionBlock::GetOffsetOfArgs() + numRegistersUsed * sizeof(void *); + break; + + case IMAGE_CEE_CS_CALLCONV_THISCALL: + case IMAGE_CEE_CS_CALLCONV_FASTCALL: + _ASSERTE_MSG(false, "Unsupported calling convention."); + default: + break; + } #endif // FEATURE_INTERPRETER DWORD nArgs = this->NumFixedArgs(); diff --git a/src/coreclr/src/vm/interpreter.cpp b/src/coreclr/src/vm/interpreter.cpp index 07922a4bfb0c3..6aad6741cddeb 100644 --- a/src/coreclr/src/vm/interpreter.cpp +++ b/src/coreclr/src/vm/interpreter.cpp @@ -1112,6 +1112,7 @@ CorJitResult Interpreter::GenerateInterpreterStub(CEEInfo* comp, #elif defined(HOST_AMD64) argState.AddArg(k, static_cast(szSlots)); #elif defined(HOST_ARM) || defined(HOST_ARM64) + // TODO: handle Vector64, Vector128 types CorInfoHFAElemType hfaType = comp->getHFAType(vcTypeRet); if (CorInfoTypeIsFloatingPoint(hfaType)) { @@ -1827,12 +1828,16 @@ AwareLock* Interpreter::GetMonitorForStaticMethod() { case CORINFO_LOOKUP_CLASSPARAM: { - classHnd = (CORINFO_CLASS_HANDLE) GetPreciseGenericsContext(); + CORINFO_CONTEXT_HANDLE ctxHnd = GetPreciseGenericsContext(); + _ASSERTE_MSG((((size_t)ctxHnd & CORINFO_CONTEXTFLAGS_MASK) == CORINFO_CONTEXTFLAGS_CLASS), "Precise context not class context"); + classHnd = (CORINFO_CLASS_HANDLE) ((size_t)ctxHnd & ~CORINFO_CONTEXTFLAGS_CLASS); } break; case CORINFO_LOOKUP_METHODPARAM: { - MethodDesc* pMD = (MethodDesc*) GetPreciseGenericsContext(); + CORINFO_CONTEXT_HANDLE ctxHnd = GetPreciseGenericsContext(); + _ASSERTE_MSG((((size_t)ctxHnd & CORINFO_CONTEXTFLAGS_MASK) == CORINFO_CONTEXTFLAGS_METHOD), "Precise context not method context"); + MethodDesc* pMD = (MethodDesc*) (CORINFO_METHOD_HANDLE) ((size_t)ctxHnd & ~CORINFO_CONTEXTFLAGS_METHOD); classHnd = (CORINFO_CLASS_HANDLE) pMD->GetMethodTable(); } break; @@ -2249,8 +2254,8 @@ void Interpreter::ExecuteMethod(ARG_SLOT* retVal, __out bool* pDoJmpCall, __out #if defined(FEATURE_HFA) // Is it an HFA? else if (m_methInfo->m_returnType == CORINFO_TYPE_VALUECLASS - && (cit != CORINFO_HFA_ELEM_NONE)) - && (MetaSig(reinterpret_cast(m_methInfo->m_method)).GetCallingConventionInfo() & CORINFO_CALLCONV_VARARG) == 0) + && (cit != CORINFO_HFA_ELEM_NONE) + && (MetaSig(reinterpret_cast(m_methInfo->m_method)).GetCallingConventionInfo() & CORINFO_CALLCONV_VARARG) == 0) { if (retValIt.IsLargeStruct(&m_interpCeeInfo)) { @@ -4012,6 +4017,10 @@ bool CorInfoTypeIsFloatingPoint(CorInfoType cit) return cit == CORINFO_TYPE_FLOAT || cit == CORINFO_TYPE_DOUBLE; } +bool CorInfoTypeIsFloatingPoint(CorInfoHFAElemType cihet) +{ + return cihet == CORINFO_HFA_ELEM_FLOAT || cihet == CORINFO_HFA_ELEM_DOUBLE; +} bool CorElemTypeIsUnsigned(CorElementType cet) { @@ -9073,25 +9082,25 @@ void Interpreter::DoCallWork(bool virtualCall, void* thisArg, CORINFO_RESOLVED_T didIntrinsic = true; } -// TODO: The following check for hardware intrinsics is not a production-level -// solution and may produce incorrect results. -#ifdef FEATURE_INTERPRETER + // TODO: The following check for hardware intrinsics is not a production-level + // solution and may produce incorrect results. static ConfigDWORD s_InterpreterHWIntrinsicsIsSupportedFalse; if (s_InterpreterHWIntrinsicsIsSupportedFalse.val(CLRConfig::INTERNAL_InterpreterHWIntrinsicsIsSupportedFalse) != 0) { if (strcmp(methToCall->GetModule()->GetSimpleName(), "System.Private.CoreLib") == 0 && +#ifdef _DEBUG // GetDebugClassName() is only available in _DEBUG builds #if defined(TARGET_X86) || defined(TARGET_AMD64) strncmp(methToCall->GetClass()->GetDebugClassName(), "System.Runtime.Intrinsics.X86", 29) == 0 && #elif defined(TARGET_ARM64) strncmp(methToCall->GetClass()->GetDebugClassName(), "System.Runtime.Intrinsics.Arm", 29) == 0 && #endif // defined(TARGET_X86) || defined(TARGET_AMD64) +#endif // _DEBUG strcmp(methToCall->GetName(), "get_IsSupported") == 0) { DoGetIsSupported(); didIntrinsic = true; } } -#endif // FEATURE_INTERPRETER #if FEATURE_SIMD if (fFeatureSIMD.val(CLRConfig::EXTERNAL_FeatureSIMD) != 0) diff --git a/src/coreclr/src/vm/interpreter.h b/src/coreclr/src/vm/interpreter.h index 424f36c9dfcfa..f4e33680032e6 100644 --- a/src/coreclr/src/vm/interpreter.h +++ b/src/coreclr/src/vm/interpreter.h @@ -90,9 +90,13 @@ bool CorInfoTypeIsIntegral(CorInfoType cit); // Returns true iff "cet" is an unsigned integral type. bool CorElemTypeIsUnsigned(CorElementType cet); -// Returns true iff "cit" is an integral type. +// Returns true iff "cit" is a floating-point type. bool CorInfoTypeIsFloatingPoint(CorInfoType cit); +// Returns true iff "cihet" is a floating-point type (float or double). +// TODO: Handle Vector64, Vector128? +bool CorInfoTypeIsFloatingPoint(CorInfoHFAElemType cihet); + // Returns true iff "cit" is a pointer type (mgd/unmgd pointer, or native int). bool CorInfoTypeIsPointer(CorInfoType cit); @@ -702,7 +706,7 @@ struct InterpreterMethodInfo void SetPinningBit(unsigned locNum); bool GetPinningBit(unsigned locNum); - CORINFO_METHOD_HANDLE GetPreciseGenericsContext(Object* thisArg, void* genericsCtxtArg); + CORINFO_CONTEXT_HANDLE GetPreciseGenericsContext(Object* thisArg, void* genericsCtxtArg); #ifndef DACCESS_COMPILE // Gets the proper cache for a call to a method with the current InterpreterMethodInfo, with the given @@ -1773,9 +1777,9 @@ class Interpreter // Returns the proper generics context for use in resolving tokens ("precise" in the sense of including generic instantiation // information). - CORINFO_METHOD_HANDLE m_preciseGenericsContext; + CORINFO_CONTEXT_HANDLE m_preciseGenericsContext; - CORINFO_METHOD_HANDLE GetPreciseGenericsContext() + CORINFO_CONTEXT_HANDLE GetPreciseGenericsContext() { if (m_preciseGenericsContext == NULL) {