From d992965ae6d7a7c6530c2b2551f320839e6d52e8 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Mon, 25 Aug 2025 12:44:10 -0700 Subject: [PATCH 1/2] Support taking the address of the empty string --- src/coreclr/interpreter/compiler.cpp | 11 +++++++++++ src/coreclr/interpreter/intops.def | 1 + src/coreclr/vm/interpexec.cpp | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/src/coreclr/interpreter/compiler.cpp b/src/coreclr/interpreter/compiler.cpp index 924953f8419da6..020646e53280b0 100644 --- a/src/coreclr/interpreter/compiler.cpp +++ b/src/coreclr/interpreter/compiler.cpp @@ -3342,6 +3342,17 @@ void InterpCompiler::EmitStaticFieldAddress(CORINFO_FIELD_INFO *pFieldInfo, CORI bool isBoxedStatic = (pFieldInfo->fieldFlags & CORINFO_FLG_FIELD_STATIC_IN_HEAP) != 0; switch (pFieldInfo->fieldAccessor) { + case CORINFO_FIELD_INTRINSIC_EMPTY_STRING: + { + void *emptyString; + InfoAccessType iat = m_compHnd->emptyStringLiteral(&emptyString); + assert(iat == IAT_VALUE); + AddIns(INTOP_LDPTR_ADDRESS); + PushInterpType(InterpTypeByRef, NULL); + m_pLastNewIns->SetDVar(m_pStackPointer[-1].var); + m_pLastNewIns->data[0] = GetDataItemIndex(emptyString); + break; + } case CORINFO_FIELD_STATIC_ADDRESS: case CORINFO_FIELD_STATIC_RVA_ADDRESS: { diff --git a/src/coreclr/interpreter/intops.def b/src/coreclr/interpreter/intops.def index 5850997ec29cc9..4237ee90b2155a 100644 --- a/src/coreclr/interpreter/intops.def +++ b/src/coreclr/interpreter/intops.def @@ -22,6 +22,7 @@ OPDEF(INTOP_LDC_R4, "ldc.r4", 3, 1, 0, InterpOpFloat) OPDEF(INTOP_LDC_R8, "ldc.r8", 4, 1, 0, InterpOpDouble) OPDEF(INTOP_LDPTR, "ldptr", 3, 1, 0, InterpOpLdPtr) +OPDEF(INTOP_LDPTR_ADDRESS, "ldptr.address", 3, 1, 0, InterpOpLdPtr) OPDEF(INTOP_LDPTR_DEREF, "ldptr.deref", 3, 1, 0, InterpOpLdPtr) OPDEF(INTOP_NULLCHECK, "nullcheck", 2, 1, 0, InterpOpNoArgs) OPDEF(INTOP_NEWARR, "newarr", 5, 1, 1, InterpOpPointerHelperFtn) diff --git a/src/coreclr/vm/interpexec.cpp b/src/coreclr/vm/interpexec.cpp index 5c82f07e4ec820..b83f989c16a62f 100644 --- a/src/coreclr/vm/interpexec.cpp +++ b/src/coreclr/vm/interpexec.cpp @@ -604,6 +604,10 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr LOCAL_VAR(ip[1], void*) = pMethod->pDataItems[ip[2]]; ip += 3; break; + case INTOP_LDPTR_ADDRESS: + LOCAL_VAR(ip[1], void*) = &pMethod->pDataItems[ip[2]]; + ip += 3; + break; case INTOP_LDPTR_DEREF: LOCAL_VAR(ip[1], void*) = *(void**)pMethod->pDataItems[ip[2]]; ip += 3; From b4a05e772e6207f4d38d5f95e8251c0f038a3b59 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Mon, 25 Aug 2025 14:52:08 -0700 Subject: [PATCH 2/2] Correct fix suggested by @jkotas - use the right access mode in LDSFLDA --- src/coreclr/interpreter/compiler.cpp | 13 +------------ src/coreclr/interpreter/intops.def | 1 - src/coreclr/vm/interpexec.cpp | 4 ---- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/coreclr/interpreter/compiler.cpp b/src/coreclr/interpreter/compiler.cpp index 020646e53280b0..6bdfceb08b15f6 100644 --- a/src/coreclr/interpreter/compiler.cpp +++ b/src/coreclr/interpreter/compiler.cpp @@ -3342,17 +3342,6 @@ void InterpCompiler::EmitStaticFieldAddress(CORINFO_FIELD_INFO *pFieldInfo, CORI bool isBoxedStatic = (pFieldInfo->fieldFlags & CORINFO_FLG_FIELD_STATIC_IN_HEAP) != 0; switch (pFieldInfo->fieldAccessor) { - case CORINFO_FIELD_INTRINSIC_EMPTY_STRING: - { - void *emptyString; - InfoAccessType iat = m_compHnd->emptyStringLiteral(&emptyString); - assert(iat == IAT_VALUE); - AddIns(INTOP_LDPTR_ADDRESS); - PushInterpType(InterpTypeByRef, NULL); - m_pLastNewIns->SetDVar(m_pStackPointer[-1].var); - m_pLastNewIns->data[0] = GetDataItemIndex(emptyString); - break; - } case CORINFO_FIELD_STATIC_ADDRESS: case CORINFO_FIELD_STATIC_RVA_ADDRESS: { @@ -5151,7 +5140,7 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo) CORINFO_FIELD_INFO fieldInfo; uint32_t token = getU4LittleEndian(m_ip + 1); ResolveToken(token, CORINFO_TOKENKIND_Field, &resolvedToken); - m_compHnd->getFieldInfo(&resolvedToken, m_methodHnd, CORINFO_ACCESS_GET, &fieldInfo); + m_compHnd->getFieldInfo(&resolvedToken, m_methodHnd, CORINFO_ACCESS_ADDRESS, &fieldInfo); EmitStaticFieldAddress(&fieldInfo, &resolvedToken); diff --git a/src/coreclr/interpreter/intops.def b/src/coreclr/interpreter/intops.def index 4237ee90b2155a..5850997ec29cc9 100644 --- a/src/coreclr/interpreter/intops.def +++ b/src/coreclr/interpreter/intops.def @@ -22,7 +22,6 @@ OPDEF(INTOP_LDC_R4, "ldc.r4", 3, 1, 0, InterpOpFloat) OPDEF(INTOP_LDC_R8, "ldc.r8", 4, 1, 0, InterpOpDouble) OPDEF(INTOP_LDPTR, "ldptr", 3, 1, 0, InterpOpLdPtr) -OPDEF(INTOP_LDPTR_ADDRESS, "ldptr.address", 3, 1, 0, InterpOpLdPtr) OPDEF(INTOP_LDPTR_DEREF, "ldptr.deref", 3, 1, 0, InterpOpLdPtr) OPDEF(INTOP_NULLCHECK, "nullcheck", 2, 1, 0, InterpOpNoArgs) OPDEF(INTOP_NEWARR, "newarr", 5, 1, 1, InterpOpPointerHelperFtn) diff --git a/src/coreclr/vm/interpexec.cpp b/src/coreclr/vm/interpexec.cpp index b83f989c16a62f..5c82f07e4ec820 100644 --- a/src/coreclr/vm/interpexec.cpp +++ b/src/coreclr/vm/interpexec.cpp @@ -604,10 +604,6 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr LOCAL_VAR(ip[1], void*) = pMethod->pDataItems[ip[2]]; ip += 3; break; - case INTOP_LDPTR_ADDRESS: - LOCAL_VAR(ip[1], void*) = &pMethod->pDataItems[ip[2]]; - ip += 3; - break; case INTOP_LDPTR_DEREF: LOCAL_VAR(ip[1], void*) = *(void**)pMethod->pDataItems[ip[2]]; ip += 3;