Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ BOOL isValidStringRef(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
);

int getStringLength(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
);

BOOL shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope);

/**********************************************************************************/
Expand Down
1 change: 1 addition & 0 deletions src/ToolBox/superpmi/superpmi-shared/lwmlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ LWM(IsInstantiationOfVerifiedGeneric, DWORDLONG, DWORD)
LWM(IsSDArray, DWORDLONG, DWORD)
LWM(IsStructRequiringStackAllocRetBuf, DWORDLONG, DWORD)
LWM(IsValidStringRef, DLD, DWORD)
LWM(GetStringLength, DLD, DWORD)
LWM(IsValidToken, DLD, DWORD)
LWM(IsValueClass, DWORDLONG, DWORD)
LWM(IsWriteBarrierHelperRequired, DWORDLONG, DWORD)
Expand Down
33 changes: 33 additions & 0 deletions src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4592,6 +4592,39 @@ BOOL MethodContext::repIsValidStringRef(CORINFO_MODULE_HANDLE module, unsigned m
return value;
}

void MethodContext::recGetStringLength(CORINFO_MODULE_HANDLE module, unsigned metaTOK, int result)
{
if (GetStringLength == nullptr)
GetStringLength = new LightWeightMap<DLD, DWORD>();

DLD key;
ZeroMemory(&key, sizeof(DLD)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
// out padding too

key.A = (DWORDLONG)module;
key.B = (DWORD)metaTOK;

GetStringLength->Add(key, (DWORD)result);
}

void MethodContext::dmpGetStringLength(DLD key, DWORD value)
{
printf("GetStringLength key mod-%016llX tok-%08X, value res-%u", key.A, key.B, value);
}

int MethodContext::repGetStringLength(CORINFO_MODULE_HANDLE module, unsigned metaTOK)
{
DLD key;
ZeroMemory(&key, sizeof(DLD)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
// out padding too

key.A = (DWORDLONG)module;
key.B = (DWORD)metaTOK;

int value = (int)GetStringLength->Get(key);
return value;
}

void MethodContext::recGetHelperName(CorInfoHelpFunc funcNum, const char* result)
{
if (GetHelperName == nullptr)
Expand Down
7 changes: 6 additions & 1 deletion src/ToolBox/superpmi/superpmi-shared/methodcontext.h
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,10 @@ class MethodContext
void recIsValidStringRef(CORINFO_MODULE_HANDLE module, unsigned metaTOK, BOOL result);
void dmpIsValidStringRef(DLD key, DWORD value);
BOOL repIsValidStringRef(CORINFO_MODULE_HANDLE module, unsigned metaTOK);

void recGetStringLength(CORINFO_MODULE_HANDLE module, unsigned metaTOK, BOOL result);
void dmpGetStringLength(DLD key, DWORD value);
int repGetStringLength(CORINFO_MODULE_HANDLE module, unsigned metaTOK);

void recGetHelperName(CorInfoHelpFunc funcNum, const char* result);
void dmpGetHelperName(DWORD key, DWORD value);
Expand Down Expand Up @@ -1352,7 +1356,7 @@ class MethodContext
};

// ********************* Please keep this up-to-date to ease adding more ***************
// Highest packet number: 174
// Highest packet number: 175
// *************************************************************************************
enum mcPackets
{
Expand Down Expand Up @@ -1493,6 +1497,7 @@ enum mcPackets
Packet_IsSDArray = 101,
Packet_IsStructRequiringStackAllocRetBuf = 102,
Packet_IsValidStringRef = 103,
Packet_GetStringLength = 175,
Retired6 = 104,
Packet_IsValidToken = 144, // Added 7/19/2013 - adjusted members to proper types
Packet_IsValueClass = 105,
Expand Down
10 changes: 10 additions & 0 deletions src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,16 @@ BOOL interceptor_ICJI::isValidStringRef(CORINFO_MODULE_HANDLE module, /* IN */
return temp;
}

int interceptor_ICJI::getStringLength(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
)
{
mc->cr->AddCall("getStringLength");
int temp = original_ICorJitInfo->getStringLength(module, metaTOK);
mc->recGetStringLength(module, metaTOK, temp);
return temp;
}

BOOL interceptor_ICJI::shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope)
{
mc->cr->AddCall("shouldEnforceCallvirtRestriction");
Expand Down
8 changes: 8 additions & 0 deletions src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,14 @@ BOOL interceptor_ICJI::isValidStringRef(CORINFO_MODULE_HANDLE module, /* IN */
return original_ICorJitInfo->isValidStringRef(module, metaTOK);
}

int interceptor_ICJI::getStringLength(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
)
{
mcs->AddCall("getStringLength");
return original_ICorJitInfo->getStringLength(module, metaTOK);
}

BOOL interceptor_ICJI::shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope)
{
mcs->AddCall("shouldEnforceCallvirtRestriction");
Expand Down
7 changes: 7 additions & 0 deletions src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,13 @@ BOOL interceptor_ICJI::isValidStringRef(CORINFO_MODULE_HANDLE module, /* IN */
return original_ICorJitInfo->isValidStringRef(module, metaTOK);
}

int interceptor_ICJI::getStringLength(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
)
{
return original_ICorJitInfo->getStringLength(module, metaTOK);
}

BOOL interceptor_ICJI::shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope)
{
return original_ICorJitInfo->shouldEnforceCallvirtRestriction(scope);
Expand Down
8 changes: 8 additions & 0 deletions src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,14 @@ BOOL MyICJI::isValidStringRef(CORINFO_MODULE_HANDLE module, /* IN */
return jitInstance->mc->repIsValidStringRef(module, metaTOK);
}

int MyICJI::getStringLength(CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
)
{
jitInstance->mc->cr->AddCall("getStringLength");
return jitInstance->mc->repGetStringLength(module, metaTOK);
}

BOOL MyICJI::shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope)
{
jitInstance->mc->cr->AddCall("shouldEnforceCallvirtRestriction");
Expand Down
5 changes: 5 additions & 0 deletions src/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -2304,6 +2304,11 @@ class ICorStaticInfo
unsigned metaTOK /* IN */
) = 0;

virtual int getStringLength (
CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */
) = 0;

virtual BOOL shouldEnforceCallvirtRestriction(
CORINFO_MODULE_HANDLE scope
) = 0;
Expand Down
1 change: 1 addition & 0 deletions src/jit/ICorJitInfo_API_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ DEF_CLR_API(getTokenTypeAsHandle)
DEF_CLR_API(canSkipVerification)
DEF_CLR_API(isValidToken)
DEF_CLR_API(isValidStringRef)
DEF_CLR_API(getStringLength)
DEF_CLR_API(shouldEnforceCallvirtRestriction)
DEF_CLR_API(asCorInfoType)
DEF_CLR_API(getClassName)
Expand Down
10 changes: 10 additions & 0 deletions src/jit/ICorJitInfo_API_wrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,16 @@ BOOL WrapICorJitInfo::isValidStringRef(
return temp;
}

int WrapICorJitInfo::getStringLength(
CORINFO_MODULE_HANDLE module, /* IN */
unsigned metaTOK /* IN */)
{
API_ENTER(getStringLength);
int temp = wrapHnd->getStringLength(module, metaTOK);
API_LEAVE(getStringLength);
return temp;
}

BOOL WrapICorJitInfo::shouldEnforceCallvirtRestriction(
CORINFO_MODULE_HANDLE scope)
{
Expand Down
15 changes: 15 additions & 0 deletions src/jit/morph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11717,6 +11717,21 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac)
}
break;

case GT_ARR_LENGTH:
// Morph "constant_string".Length to CNS_INT
if (op1->OperIs(GT_CNS_STR))
{
GenTreeStrCon* strCon = op1->AsStrCon();
int len = info.compCompHnd->getStringLength(strCon->gtScpHnd, strCon->gtSconCPX);
if (len >= 0)
{
tree = gtNewIconNode(len);
INDEBUG(tree->gtDebugFlags |= GTF_DEBUG_NODE_MORPHED);
return tree;
}
}
break;

case GT_EQ:
case GT_NE:
{
Expand Down
12 changes: 12 additions & 0 deletions src/vm/dynamicmethod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,18 @@ LCGMethodResolver::IsValidStringRef(mdToken metaTok)
return GetStringLiteral(metaTok) != NULL;
}

//---------------------------------------------------------------------------------------
//
int
LCGMethodResolver::GetStringLength(mdToken metaTok)
{
STANDARD_VM_CONTRACT;

GCX_COOP();

return GetStringLiteral(metaTok)->GetStringLength();
}

//---------------------------------------------------------------------------------------
//
STRINGREF
Expand Down
2 changes: 2 additions & 0 deletions src/vm/dynamicmethod.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class DynamicResolver
// jit interface api
virtual OBJECTHANDLE ConstructStringLiteral(mdToken metaTok) = 0;
virtual BOOL IsValidStringRef(mdToken metaTok) = 0;
virtual int GetStringLength(mdToken metaTok) = 0;
virtual void ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD) = 0;
virtual SigPointer ResolveSignature(mdToken token) = 0;
virtual SigPointer ResolveSignatureForVarArg(mdToken token) = 0;
Expand Down Expand Up @@ -122,6 +123,7 @@ class LCGMethodResolver : public DynamicResolver

OBJECTHANDLE ConstructStringLiteral(mdToken metaTok);
BOOL IsValidStringRef(mdToken metaTok);
int GetStringLength(mdToken metaTok);
void ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD);
SigPointer ResolveSignature(mdToken token);
SigPointer ResolveSignatureForVarArg(mdToken token);
Expand Down
7 changes: 7 additions & 0 deletions src/vm/ilstubresolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@ BOOL ILStubResolver::IsValidStringRef(mdToken metaTok)
return FALSE;
}

int ILStubResolver::GetStringLength(mdToken metaTok)
{
STANDARD_VM_CONTRACT;
_ASSERTE(FALSE);
return -1;
}

void ILStubResolver::ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD)
{
STANDARD_VM_CONTRACT;
Expand Down
1 change: 1 addition & 0 deletions src/vm/ilstubresolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class ILStubResolver : DynamicResolver

OBJECTHANDLE ConstructStringLiteral(mdToken metaTok);
BOOL IsValidStringRef(mdToken metaTok);
int GetStringLength(mdToken metaTok);
void ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD);
SigPointer ResolveSignature(mdToken token);
SigPointer ResolveSignatureForVarArg(mdToken token);
Expand Down
38 changes: 38 additions & 0 deletions src/vm/jitinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,44 @@ BOOL CEEInfo::isValidToken (
return result;
}

int CEEInfo::getStringLength (
CORINFO_MODULE_HANDLE moduleHnd,
mdToken metaTOK)
{
CONTRACTL{
THROWS;
GC_TRIGGERS;
MODE_PREEMPTIVE;
} CONTRACTL_END;

int length = 0;
Module* module = GetModule(moduleHnd);

JIT_TO_EE_TRANSITION();

if (IsDynamicScope(moduleHnd))
{
length = GetDynamicResolver(moduleHnd)->GetStringLength(metaTOK);
}
else
{
DWORD dwCharCount;
LPCWSTR pString;
if (!FAILED((module)->GetMDImport()->GetUserString(metaTOK, &dwCharCount, NULL, &pString)) && (pString != nullptr))
{
length = dwCharCount;
}
else
{
length = -1;
}
}

EE_TO_JIT_TRANSITION();

return length;
}

/*********************************************************************/
// Checks if the given metadata token is valid StringRef
BOOL CEEInfo::isValidStringRef (
Expand Down
4 changes: 4 additions & 0 deletions src/vm/jitinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,10 @@ class CEEInfo : public ICorJitInfo
CORINFO_MODULE_HANDLE module,
mdToken metaTOK);

int getStringLength (
CORINFO_MODULE_HANDLE module,
mdToken metaTOK);

static size_t findNameOfToken (Module* module, mdToken metaTOK,
__out_ecount (FQNameCapacity) char * szFQName, size_t FQNameCapacity);

Expand Down
6 changes: 6 additions & 0 deletions src/zap/zapinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3791,6 +3791,12 @@ BOOL ZapInfo::isValidStringRef (
return m_pEEJitInfo->isValidStringRef(tokenScope, token);
}

int ZapInfo::getStringLength (
CORINFO_MODULE_HANDLE tokenScope,
unsigned token)
{
return m_pEEJitInfo->getStringLength(tokenScope, token);
}

//
// ICorMethodInfo
Expand Down
2 changes: 2 additions & 0 deletions src/zap/zapinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,8 @@ class ZapInfo
unsigned metaTOK);
BOOL isValidStringRef(CORINFO_MODULE_HANDLE module,
unsigned metaTOK);
int getStringLength(CORINFO_MODULE_HANDLE module,
unsigned metaTOK);


// ICorMethodInfo
Expand Down