Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
0fe7042
Initial impl of Jan's suggestions
EgorBo Oct 29, 2022
e428363
Address part of the feedback
EgorBo Oct 29, 2022
774af69
Address feedback
EgorBo Oct 29, 2022
28b9be3
Remove "is frozen" check from jit
EgorBo Oct 29, 2022
9f92bfb
NativeAOT support
EgorBo Oct 29, 2022
687d5cb
Use CORINFO_OBJECT_HANDLE in more places
EgorBo Oct 29, 2022
872058d
Free jit handles upon exit
EgorBo Oct 29, 2022
860d706
Update src/coreclr/vm/jitinterface.cpp
EgorBo Oct 29, 2022
bffb8e6
Clean up
EgorBo Oct 29, 2022
f0a35cc
clean up in getArrayLength
EgorBo Oct 29, 2022
bfaf6ee
Update jitinterface.h
EgorBo Oct 29, 2022
a3ccc91
Remove unnecessary DestroyHandle
EgorBo Oct 29, 2022
7e041c1
Rename to getArrayOrStringLength, free jit handles in destructor
EgorBo Oct 29, 2022
1bba1ec
fix compilation
EgorBo Oct 29, 2022
ee0117e
Use IND instead of LoadVector
EgorBo Oct 30, 2022
b20f1fb
Update hwintrinsicxarch.cpp
EgorBo Oct 30, 2022
2a12b10
Update hwintrinsicxarch.cpp
EgorBo Oct 30, 2022
504acf3
Apply suggestions from code review
EgorBo Oct 30, 2022
b56a67f
Address feedback
EgorBo Oct 30, 2022
15a39a6
Address feedback
EgorBo Oct 30, 2022
1683f29
Address feedback
EgorBo Oct 30, 2022
43a32c9
Move "Is frozen" check to getJitHandleForObject
EgorBo Oct 30, 2022
d10f4eb
Update src/coreclr/vm/jitinterface.cpp
EgorBo Oct 30, 2022
4443383
Update src/coreclr/vm/jitinterface.cpp
EgorBo Oct 30, 2022
429b4d1
use OBJECTREF everywhere
EgorBo Oct 30, 2022
49c32c4
fix bad merge
EgorBo Oct 30, 2022
5dbbef4
Cannonize more loads
EgorBo Oct 30, 2022
62f5cbb
check ISAs
EgorBo Oct 30, 2022
a096211
Fix comments
EgorBo Oct 30, 2022
efd71e9
Handle stores
EgorBo Oct 31, 2022
27a2619
Fix compilation & address feedback around redundant IsFrozenSegment call
EgorBo Oct 31, 2022
1f95212
Merge branch 'use-ind-for-loads' of github.com:EgorBo/runtime-1 into …
EgorBo Oct 31, 2022
d5c3cab
DescriptionDescription -> Description
EgorBo Oct 31, 2022
7621045
Merge branch 'main' of github.com:dotnet/runtime into fold-static-rea…
EgorBo Oct 31, 2022
96397b1
Update valuenum.cpp
EgorBo Oct 31, 2022
076d4cd
Add comments
EgorBo Oct 31, 2022
1ecceca
Merge branch 'main' of github.com:dotnet/runtime into fold-static-rea…
EgorBo Oct 31, 2022
752c840
Revert unrelated SIMD changes (accidentally pushed)
EgorBo Oct 31, 2022
ea8e369
Use Exception sets
EgorBo Oct 31, 2022
2fab46b
Address feedback
EgorBo Oct 31, 2022
07d42e5
Address feedback
EgorBo Oct 31, 2022
8c2ec20
Update src/coreclr/jit/valuenum.cpp
EgorBo Oct 31, 2022
93c11c9
Address feedback
EgorBo Oct 31, 2022
19df3e6
Apply suggestions from code review
EgorBo Oct 31, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Rename to getArrayOrStringLength, free jit handles in destructor
  • Loading branch information
EgorBo committed Oct 29, 2022
commit 7e041c1efb4ffbbd5de4b358c295055b5d74c5a9
2 changes: 1 addition & 1 deletion src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -2730,7 +2730,7 @@ class ICorStaticInfo
// Returns true iff "fldHnd" represents a static field.
virtual bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) = 0;

virtual int getArrayLength(CORINFO_OBJECT_HANDLE objHnd) = 0;
virtual int getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) = 0;

/*********************************************************************************/
//
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/inc/icorjitinfoimpl_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ void getFieldInfo(
bool isFieldStatic(
CORINFO_FIELD_HANDLE fldHnd) override;

int getArrayLength(
int getArrayOrStringLength(
CORINFO_OBJECT_HANDLE objHnd) override;

void getBoundaries(
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/ICorJitInfo_names_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ DEF_CLR_API(getFieldType)
DEF_CLR_API(getFieldOffset)
DEF_CLR_API(getFieldInfo)
DEF_CLR_API(isFieldStatic)
DEF_CLR_API(getArrayLength)
DEF_CLR_API(getArrayOrStringLength)
DEF_CLR_API(getBoundaries)
DEF_CLR_API(setBoundaries)
DEF_CLR_API(getVars)
Expand Down
8 changes: 4 additions & 4 deletions src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -965,12 +965,12 @@ bool WrapICorJitInfo::isFieldStatic(
return temp;
}

int WrapICorJitInfo::getArrayLength(
int WrapICorJitInfo::getArrayOrStringLength(
CORINFO_OBJECT_HANDLE objHnd)
{
API_ENTER(getArrayLength);
int temp = wrapHnd->getArrayLength(objHnd);
API_LEAVE(getArrayLength);
API_ENTER(getArrayOrStringLength);
int temp = wrapHnd->getArrayOrStringLength(objHnd);
API_LEAVE(getArrayOrStringLength);
return temp;
}

Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/valuenum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8796,7 +8796,7 @@ void Compiler::fgValueNumberTree(GenTree* tree)
if (vnStore->IsVNHandle(addressVN) && (vnStore->GetHandleFlags(addressVN) == GTF_ICON_OBJ_HDL))
{
size_t handle = vnStore->CoercedConstantValue<size_t>(addressVN);
int len = this->info.compCompHnd->getArrayLength((CORINFO_OBJECT_HANDLE)handle);
int len = this->info.compCompHnd->getArrayOrStringLength((CORINFO_OBJECT_HANDLE)handle);
if (len >= 0)
{
tree->gtVNPair.SetBoth(vnStore->VNForIntCon(len));
Expand All @@ -8823,7 +8823,7 @@ void Compiler::fgValueNumberTree(GenTree* tree)
{
CORINFO_OBJECT_HANDLE objHandle;
memcpy(&objHandle, buffer, TARGET_POINTER_SIZE);
int len = this->info.compCompHnd->getArrayLength(objHandle);
int len = this->info.compCompHnd->getArrayOrStringLength(objHandle);
if (len >= 0)
{
tree->gtVNPair.SetBoth(vnStore->VNForIntCon(len));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1465,12 +1465,12 @@ private static byte _isFieldStatic(IntPtr thisHandle, IntPtr* ppException, CORIN
}

[UnmanagedCallersOnly]
private static int _getArrayLength(IntPtr thisHandle, IntPtr* ppException, CORINFO_OBJECT_STRUCT_* objHnd)
private static int _getArrayOrStringLength(IntPtr thisHandle, IntPtr* ppException, CORINFO_OBJECT_STRUCT_* objHnd)
{
var _this = GetThis(thisHandle);
try
{
return _this.getArrayLength(objHnd);
return _this.getArrayOrStringLength(objHnd);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -2785,7 +2785,7 @@ private static IntPtr GetUnmanagedCallbacks()
callbacks[95] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_FIELD_STRUCT_*, uint>)&_getFieldOffset;
callbacks[96] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_RESOLVED_TOKEN*, CORINFO_METHOD_STRUCT_*, CORINFO_ACCESS_FLAGS, CORINFO_FIELD_INFO*, void>)&_getFieldInfo;
callbacks[97] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_FIELD_STRUCT_*, byte>)&_isFieldStatic;
callbacks[98] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_OBJECT_STRUCT_*, int>)&_getArrayLength;
callbacks[98] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_OBJECT_STRUCT_*, int>)&_getArrayOrStringLength;
callbacks[99] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_METHOD_STRUCT_*, uint*, uint**, BoundaryTypes*, void>)&_getBoundaries;
callbacks[100] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_METHOD_STRUCT_*, uint, OffsetMapping*, void>)&_setBoundaries;
callbacks[101] = (delegate* unmanaged<IntPtr, IntPtr*, CORINFO_METHOD_STRUCT_*, uint*, ILVarInfo**, bool*, void>)&_getVars;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ FUNCTIONS
unsigned getFieldOffset(CORINFO_FIELD_HANDLE field)
void getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult)
bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd)
int getArrayLength(CORINFO_OBJECT_HANDLE objHnd)
int getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd)
void getBoundaries(CORINFO_METHOD_HANDLE ftn, unsigned int* cILOffsets, uint32_t** pILOffsets, ICorDebugInfo::BoundaryTypes* implicitBoundaries)
void setBoundaries(CORINFO_METHOD_HANDLE ftn, uint32_t cMap, ICorDebugInfo::OffsetMapping* pMap)
void getVars(CORINFO_METHOD_HANDLE ftn, uint32_t* cVars, ICorDebugInfo::ILVarInfo** vars, bool* extendOthers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3011,7 +3011,7 @@ private bool isObjectImmutable(CORINFO_OBJECT_STRUCT_* objPtr)
return null;
}

private int getArrayLength(CORINFO_OBJECT_STRUCT_* objHnd)
private int getArrayOrStringLength(CORINFO_OBJECT_STRUCT_* objHnd)
{
return -1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2295,14 +2295,14 @@ private bool isObjectImmutable(CORINFO_OBJECT_STRUCT_* objPtr)
};
}

private int getArrayLength(CORINFO_OBJECT_STRUCT_* objHnd)
private int getArrayOrStringLength(CORINFO_OBJECT_STRUCT_* objHnd)
{
object obj = HandleToObject(objHnd);
return obj switch
{
FrozenStringNode frozenStr => frozenStr.Data.Length,
FrozenObjectNode frozenObj => frozenObj.GetArrayLength(),
_ => throw new NotImplementedException($"Unexpected object in getArrayLength: {obj}")
_ => throw new NotImplementedException($"Unexpected object in getArrayOrStringLength: {obj}")
};
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/tools/aot/jitinterface/jitinterface_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ struct JitInterfaceCallbacks
unsigned (* getFieldOffset)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field);
void (* getFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult);
bool (* isFieldStatic)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE fldHnd);
int (* getArrayLength)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_OBJECT_HANDLE objHnd);
int (* getArrayOrStringLength)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_OBJECT_HANDLE objHnd);
void (* getBoundaries)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, unsigned int* cILOffsets, uint32_t** pILOffsets, ICorDebugInfo::BoundaryTypes* implicitBoundaries);
void (* setBoundaries)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, uint32_t cMap, ICorDebugInfo::OffsetMapping* pMap);
void (* getVars)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, uint32_t* cVars, ICorDebugInfo::ILVarInfo** vars, bool* extendOthers);
Expand Down Expand Up @@ -1160,11 +1160,11 @@ class JitInterfaceWrapper : public ICorJitInfo
return temp;
}

virtual int getArrayLength(
virtual int getArrayOrStringLength(
CORINFO_OBJECT_HANDLE objHnd)
{
CorInfoExceptionClass* pException = nullptr;
int temp = _callbacks->getArrayLength(_thisHandle, &pException, objHnd);
int temp = _callbacks->getArrayOrStringLength(_thisHandle, &pException, objHnd);
if (pException != nullptr) throw pException;
return temp;
}
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ LWM(InitClass, Agnostic_InitClass, DWORD)
LWM(IsCompatibleDelegate, Agnostic_IsCompatibleDelegate, DD)
LWM(IsDelegateCreationAllowed, DLDL, DWORD)
LWM(IsFieldStatic, DWORDLONG, DWORD)
LWM(GetArrayLength, DWORDLONG, DWORD)
LWM(GetArrayOrStringLength, DWORDLONG, DWORD)
LWM(ExpandRawHandleIntrinsic, Agnostic_CORINFO_RESOLVED_TOKENin, Agnostic_CORINFO_GENERICHANDLE_RESULT)
LWM(IsIntrinsicType, DWORDLONG, DWORD)
LWM(IsSDArray, DWORDLONG, DWORD)
Expand Down
22 changes: 11 additions & 11 deletions src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7019,26 +7019,26 @@ bool MethodContext::repIsFieldStatic(CORINFO_FIELD_HANDLE fhld)
return value != 0;
}

void MethodContext::recGetArrayLength(CORINFO_OBJECT_HANDLE objHandle, int result)
void MethodContext::recGetArrayOrStringLength(CORINFO_OBJECT_HANDLE objHandle, int result)
{
if (GetArrayLength == nullptr)
GetArrayLength = new LightWeightMap<DWORDLONG, DWORD>();
if (GetArrayOrStringLength == nullptr)
GetArrayOrStringLength = new LightWeightMap<DWORDLONG, DWORD>();

DWORDLONG key = CastHandle(objHandle);
DWORD value = (DWORD)result;
GetArrayLength->Add(key, value);
DEBUG_REC(dmpGetArrayLength(key, value));
GetArrayOrStringLength->Add(key, value);
DEBUG_REC(dmpGetArrayOrStringLength(key, value));
}
void MethodContext::dmpGetArrayLength(DWORDLONG key, DWORD value)
void MethodContext::dmpGetArrayOrStringLength(DWORDLONG key, DWORD value)
{
printf("GetArrayLength key %016llX, value %u", key, value);
printf("GetArrayOrStringLength key %016llX, value %u", key, value);
}
int MethodContext::repGetArrayLength(CORINFO_OBJECT_HANDLE objHandle)
int MethodContext::repGetArrayOrStringLength(CORINFO_OBJECT_HANDLE objHandle)
{
DWORDLONG key = CastHandle(objHandle);
AssertMapAndKeyExist(GetArrayLength, key, ": key %016llX", key);
DWORD value = GetArrayLength->Get(key);
DEBUG_REP(dmpGetArrayLength(key, value));
AssertMapAndKeyExist(GetArrayOrStringLength, key, ": key %016llX", key);
DWORD value = GetArrayOrStringLength->Get(key);
DEBUG_REP(dmpGetArrayOrStringLength(key, value));
return value != 0;
}

Expand Down
8 changes: 4 additions & 4 deletions src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h
Original file line number Diff line number Diff line change
Expand Up @@ -876,9 +876,9 @@ class MethodContext
void dmpIsFieldStatic(DWORDLONG key, DWORD value);
bool repIsFieldStatic(CORINFO_FIELD_HANDLE fhld);

void recGetArrayLength(CORINFO_OBJECT_HANDLE objHnd, int result);
void dmpGetArrayLength(DWORDLONG key, DWORD value);
int repGetArrayLength(CORINFO_OBJECT_HANDLE objHnd);
void recGetArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd, int result);
void dmpGetArrayOrStringLength(DWORDLONG key, DWORD value);
int repGetArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd);

void recGetIntConfigValue(const WCHAR* name, int defaultValue, int result);
void dmpGetIntConfigValue(const Agnostic_ConfigIntInfo& key, int value);
Expand Down Expand Up @@ -1153,7 +1153,7 @@ enum mcPackets
Packet_GetObjectType = 199,
Packet_IsObjectImmutable = 200,
Packet_ExpandRawHandleIntrinsic = 201,
Packet_GetArrayLength = 202,
Packet_GetArrayOrStringLength = 202,
};

void SetDebugDumpVariables();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,7 @@ int interceptor_ICJI::getArrayLength(CORINFO_OBJECT_HANDLE objHnd)
{
mc->cr->AddCall("getArrayLength");
int result = original_ICorJitInfo->getArrayLength(objHnd);
mc->recGetArrayLength(objHnd, result);
mc->recGetArrayOrStringLength(objHnd, result);
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -787,11 +787,11 @@ bool interceptor_ICJI::isFieldStatic(
return original_ICorJitInfo->isFieldStatic(fldHnd);
}

int interceptor_ICJI::getArrayLength(
int interceptor_ICJI::getArrayOrStringLength(
CORINFO_OBJECT_HANDLE objHnd)
{
mcs->AddCall("getArrayLength");
return original_ICorJitInfo->getArrayLength(objHnd);
mcs->AddCall("getArrayOrStringLength");
return original_ICorJitInfo->getArrayOrStringLength(objHnd);
}

void interceptor_ICJI::getBoundaries(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -689,10 +689,10 @@ bool interceptor_ICJI::isFieldStatic(
return original_ICorJitInfo->isFieldStatic(fldHnd);
}

int interceptor_ICJI::getArrayLength(
int interceptor_ICJI::getArrayOrStringLength(
CORINFO_OBJECT_HANDLE objHnd)
{
return original_ICorJitInfo->getArrayLength(objHnd);
return original_ICorJitInfo->getArrayOrStringLength(objHnd);
}

void interceptor_ICJI::getBoundaries(
Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -948,10 +948,10 @@ bool MyICJI::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd)
return jitInstance->mc->repIsFieldStatic(fldHnd);
}

int MyICJI::getArrayLength(CORINFO_OBJECT_HANDLE objHnd)
int MyICJI::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd)
{
jitInstance->mc->cr->AddCall("getArrayLength");
return jitInstance->mc->repGetArrayLength(objHnd);
jitInstance->mc->cr->AddCall("getArrayOrStringLength");
return jitInstance->mc->repGetArrayOrStringLength(objHnd);
}

/*********************************************************************************/
Expand Down
21 changes: 2 additions & 19 deletions src/coreclr/vm/jitinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1721,7 +1721,7 @@ bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd)
return res;
}

int CEEInfo::getArrayLength(CORINFO_OBJECT_HANDLE objHnd)
int CEEInfo::getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd)
{
CONTRACTL {
THROWS;
Expand All @@ -1736,7 +1736,7 @@ int CEEInfo::getArrayLength(CORINFO_OBJECT_HANDLE objHnd)

GCX_COOP();

Object* obj = getObjectFromJitHandle(objHnd);
Object* obj = getObjectFromJitHandle((OBJECTHANDLE)objHnd);

if (obj->GetMethodTable()->IsArray())
{
Expand Down Expand Up @@ -2512,23 +2512,6 @@ void CEEInfo::MethodCompileComplete(CORINFO_METHOD_HANDLE methHnd)
pMD->AsDynamicMethodDesc()->GetResolver()->FreeCompileTimeState();
}

// Free all handles used by JIT
if (m_pJitHandles != nullptr)
{
OBJECTHANDLE *elements = m_pJitHandles->GetElements();
unsigned count = m_pJitHandles->GetCount();
for (unsigned i = 0; i < count; i++)
{
size_t elementHandle = (size_t)elements[i];
// All jit handles have the lowest bit set ("it's not a frozen object" marker)
// Clear it here.
_ASSERT(elementHandle & 1);
::DestroyHandle((OBJECTHANDLE)(elementHandle - 1));
}
delete m_pJitHandles;
m_pJitHandles = nullptr;
}

EE_TO_JIT_TRANSITION();
}

Expand Down
19 changes: 19 additions & 0 deletions src/coreclr/vm/jitinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,25 @@ class CEEInfo : public ICorJitInfo
virtual ~CEEInfo()
{
LIMITED_METHOD_CONTRACT;

#if !defined(DACCESS_COMPILE)
// Free all handles used by JIT
if (m_pJitHandles != nullptr)
{
OBJECTHANDLE* elements = m_pJitHandles->GetElements();
unsigned count = m_pJitHandles->GetCount();
for (unsigned i = 0; i < count; i++)
{
size_t elementHandle = (size_t)elements[i];
// All jit handles have the lowest bit set ("it's not a frozen object" marker)
// Clear it here.
_ASSERT(elementHandle & 1);
DestroyHandle((OBJECTHANDLE)(elementHandle - 1));
}
delete m_pJitHandles;
m_pJitHandles = nullptr;
}
#endif
}

// Performs any work JIT-related work that should be performed at process shutdown.
Expand Down