Skip to content

Commit 300eba1

Browse files
Fix remaining uses of hccall (#116561)
* Remove HCCALL use from R2R helpers * Get rid of the other uses of HCCALL * Address the usage of the jit helpers by just removing them
1 parent ff8c934 commit 300eba1

File tree

7 files changed

+42
-60
lines changed

7 files changed

+42
-60
lines changed

src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/StaticsHelpers.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ private static ref byte GetNonGCStaticBase(MethodTable* mt)
3939
}
4040

4141
[DebuggerHidden]
42-
private static ref byte GetDynamicNonGCStaticBase(DynamicStaticsInfo *dynamicStaticsInfo)
42+
private static ref byte GetDynamicNonGCStaticBase(DynamicStaticsInfo* dynamicStaticsInfo)
4343
{
4444
ref byte nonGCStaticBase = ref VolatileReadAsByref(ref dynamicStaticsInfo->_pNonGCStatics);
4545

@@ -69,7 +69,7 @@ private static ref byte GetGCStaticBase(MethodTable* mt)
6969
}
7070

7171
[DebuggerHidden]
72-
private static ref byte GetDynamicGCStaticBase(DynamicStaticsInfo *dynamicStaticsInfo)
72+
private static ref byte GetDynamicGCStaticBase(DynamicStaticsInfo* dynamicStaticsInfo)
7373
{
7474
ref byte gcStaticBase = ref VolatileReadAsByref(ref dynamicStaticsInfo->_pGCStatics);
7575

@@ -174,7 +174,7 @@ private static ref byte GetGCThreadStaticBaseSlow(MethodTable* mt)
174174
[MethodImpl(MethodImplOptions.AggressiveInlining)]
175175
private static ref byte GetThreadLocalStaticBaseByIndex(int index, bool gcStatics)
176176
{
177-
ThreadLocalData *t_ThreadStatics = System.Threading.Thread.GetThreadStaticsBase();
177+
ThreadLocalData* t_ThreadStatics = System.Threading.Thread.GetThreadStaticsBase();
178178
int indexOffset = GetIndexOffset(index);
179179
if (GetIndexType(index) == NonCollectibleTLSIndexType)
180180
{
@@ -238,7 +238,7 @@ private static ref byte GetGCThreadStaticBase(MethodTable* mt)
238238
}
239239

240240
[DebuggerHidden]
241-
private static ref byte GetDynamicNonGCThreadStaticBase(ThreadStaticsInfo *threadStaticsInfo)
241+
private static ref byte GetDynamicNonGCThreadStaticBase(ThreadStaticsInfo* threadStaticsInfo)
242242
{
243243
int index = threadStaticsInfo->_nonGCTlsIndex;
244244
if (IsIndexAllocated(index))
@@ -248,7 +248,7 @@ private static ref byte GetDynamicNonGCThreadStaticBase(ThreadStaticsInfo *threa
248248
}
249249

250250
[DebuggerHidden]
251-
private static ref byte GetDynamicGCThreadStaticBase(ThreadStaticsInfo *threadStaticsInfo)
251+
private static ref byte GetDynamicGCThreadStaticBase(ThreadStaticsInfo* threadStaticsInfo)
252252
{
253253
int index = threadStaticsInfo->_gcTlsIndex;
254254
if (IsIndexAllocated(index))
@@ -268,5 +268,26 @@ private static ref byte GetOptimizedGCThreadStaticBase(int index)
268268
{
269269
return ref GetThreadLocalStaticBaseByIndex(index, true);
270270
}
271+
272+
[StructLayout(LayoutKind.Sequential)]
273+
private struct StaticFieldAddressArgs
274+
{
275+
public delegate*<IntPtr, ref byte> staticBaseHelper; // Function pointer to get the static base address
276+
public IntPtr arg0; // Argument to pass to the staticBaseHelper function
277+
public nint offset; // Offset from the static base address
278+
}
279+
280+
[DebuggerHidden]
281+
private static unsafe ref byte StaticFieldAddress_Dynamic(StaticFieldAddressArgs* pArgs)
282+
{
283+
return ref Unsafe.Add(ref pArgs->staticBaseHelper(pArgs->arg0), pArgs->offset);
284+
}
285+
286+
[DebuggerHidden]
287+
private static unsafe ref byte StaticFieldAddressUnbox_Dynamic(StaticFieldAddressArgs* pArgs)
288+
{
289+
object boxedObject = Unsafe.As<byte, object>(ref Unsafe.Add(ref pArgs->staticBaseHelper(pArgs->arg0), pArgs->offset));
290+
return ref boxedObject.GetRawData();
291+
}
271292
}
272293
}

src/coreclr/vm/corelib.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,6 +1329,9 @@ DEFINE_METHOD(STATICSHELPERS, GET_DYNAMIC_GC_THREADSTATIC, GetDynamicGCThreadSta
13291329
DEFINE_METHOD(STATICSHELPERS, GET_OPTIMIZED_NONGC_THREADSTATIC, GetOptimizedNonGCThreadStaticBase, NoSig)
13301330
DEFINE_METHOD(STATICSHELPERS, GET_OPTIMIZED_GC_THREADSTATIC, GetOptimizedGCThreadStaticBase, NoSig)
13311331

1332+
DEFINE_METHOD(STATICSHELPERS, STATICFIELDADDRESS_DYNAMIC, StaticFieldAddress_Dynamic, NoSig)
1333+
DEFINE_METHOD(STATICSHELPERS, STATICFIELDADDRESSUNBOX_DYNAMIC, StaticFieldAddressUnbox_Dynamic, NoSig)
1334+
13321335
DEFINE_CLASS_U(CompilerServices, GenericsHelpers+GenericHandleArgs, GenericHandleArgs)
13331336
DEFINE_FIELD_U(signature, GenericHandleArgs, signature)
13341337
DEFINE_FIELD_U(module, GenericHandleArgs, module)

src/coreclr/vm/fcall.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,6 @@ struct FCSigCheck {
436436
#define HCIMPL2_VV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(int /* EAX */, int /* EDX */, int /* ECX */, a2, a1) { HCIMPL_PROLOG(funcname)
437437
#define HCIMPL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(int /* EAX */, a2, a1, a3) { HCIMPL_PROLOG(funcname)
438438
#define HCIMPL3_RAW(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(int /* EAX */, a2, a1, a3) {
439-
440-
#define HCCALL1(funcname, a1) funcname(0, 0, a1)
441-
#define HCCALL1_PTR(rettype, funcptr, a1) rettype (F_CALL_CONV * funcptr)(int /* EAX */, int /* EDX */, a1)
442439
#else // SWIZZLE_REGARG_ORDER
443440

444441
#define HCIMPL0(rettype, funcname) rettype F_CALL_CONV funcname() { HCIMPL_PROLOG(funcname)
@@ -450,9 +447,6 @@ struct FCSigCheck {
450447
#define HCIMPL2_VV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(a2, a1) { HCIMPL_PROLOG(funcname)
451448
#define HCIMPL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) { HCIMPL_PROLOG(funcname)
452449
#define HCIMPL3_RAW(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) {
453-
454-
#define HCCALL1(funcname, a1) funcname(a1)
455-
#define HCCALL1_PTR(rettype, funcptr, a1) rettype (F_CALL_CONV * (funcptr))(a1)
456450
#endif // !SWIZZLE_REGARG_ORDER
457451
#else // SWIZZLE_STKARG_ORDER
458452

@@ -465,10 +459,6 @@ struct FCSigCheck {
465459
#define HCIMPL2_VV(rettype, funcname, a1, a2) rettype F_CALL_CONV funcname(a1, a2) { HCIMPL_PROLOG(funcname)
466460
#define HCIMPL3(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) { HCIMPL_PROLOG(funcname)
467461
#define HCIMPL3_RAW(rettype, funcname, a1, a2, a3) rettype F_CALL_CONV funcname(a1, a2, a3) {
468-
469-
#define HCCALL1(funcname, a1) funcname(a1)
470-
#define HCCALL1_PTR(rettype, funcptr, a1) rettype (F_CALL_CONV * (funcptr))(a1)
471-
472462
#endif // !SWIZZLE_STKARG_ORDER
473463

474464
#define HCIMPLEND_RAW }

src/coreclr/vm/interpexec.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@
1111
// for numeric_limits
1212
#include <limits>
1313

14-
FCDECL1(float, JIT_ULng2Flt, uint64_t val);
15-
FCDECL1(double, JIT_ULng2Dbl, uint64_t val);
16-
FCDECL1(float, JIT_Lng2Flt, int64_t val);
17-
FCDECL1(double, JIT_Lng2Dbl, int64_t val);
18-
1914
void InvokeCompiledMethod(MethodDesc *pMD, int8_t *pArgs, int8_t *pRet)
2015
{
2116
CONTRACTL
@@ -551,23 +546,23 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr
551546
ip += 3;
552547
break;
553548
case INTOP_CONV_R4_I4:
554-
LOCAL_VAR(ip[1], float) = HCCALL1(JIT_Lng2Flt, (int64_t)LOCAL_VAR(ip[2], int32_t));
549+
LOCAL_VAR(ip[1], float) = (float)LOCAL_VAR(ip[2], int32_t);
555550
ip += 3;
556551
break;
557552
case INTOP_CONV_R4_I8:
558-
LOCAL_VAR(ip[1], float) = HCCALL1(JIT_Lng2Flt, LOCAL_VAR(ip[2], int64_t));
553+
LOCAL_VAR(ip[1], float) = (float)LOCAL_VAR(ip[2], int64_t);
559554
ip += 3;
560555
break;
561556
case INTOP_CONV_R4_R8:
562557
LOCAL_VAR(ip[1], float) = (float)LOCAL_VAR(ip[2], double);
563558
ip += 3;
564559
break;
565560
case INTOP_CONV_R8_I4:
566-
LOCAL_VAR(ip[1], double) = HCCALL1(JIT_Lng2Dbl, (int64_t)LOCAL_VAR(ip[2], int32_t));
561+
LOCAL_VAR(ip[1], double) = (double)LOCAL_VAR(ip[2], int32_t);
567562
ip += 3;
568563
break;
569564
case INTOP_CONV_R8_I8:
570-
LOCAL_VAR(ip[1], double) = HCCALL1(JIT_Lng2Dbl, LOCAL_VAR(ip[2], int64_t));
565+
LOCAL_VAR(ip[1], double) = (double)LOCAL_VAR(ip[2], int64_t);
571566
ip += 3;
572567
break;
573568
case INTOP_CONV_R8_R4:

src/coreclr/vm/jithelpers.cpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -376,34 +376,6 @@ HCIMPLEND
376376

377377
#include <optdefault.h>
378378

379-
//========================================================================
380-
//
381-
// STATIC FIELD DYNAMIC HELPERS
382-
//
383-
//========================================================================
384-
385-
#include <optsmallperfcritical.h>
386-
HCIMPL1_RAW(TADDR, JIT_StaticFieldAddress_Dynamic, StaticFieldAddressArgs * pArgs)
387-
{
388-
FCALL_CONTRACT;
389-
390-
TADDR base = HCCALL1(pArgs->staticBaseHelper, pArgs->arg0);
391-
return base + pArgs->offset;
392-
}
393-
HCIMPLEND_RAW
394-
#include <optdefault.h>
395-
396-
#include <optsmallperfcritical.h>
397-
HCIMPL1_RAW(TADDR, JIT_StaticFieldAddressUnbox_Dynamic, StaticFieldAddressArgs * pArgs)
398-
{
399-
FCALL_CONTRACT;
400-
401-
TADDR base = HCCALL1(pArgs->staticBaseHelper, pArgs->arg0);
402-
return *(TADDR *)(base + pArgs->offset) + Object::GetOffsetOfFirstField();
403-
}
404-
HCIMPLEND_RAW
405-
#include <optdefault.h>
406-
407379
//========================================================================
408380
//
409381
// CASTING HELPERS

src/coreclr/vm/jitinterface.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,18 +1045,13 @@ struct VirtualFunctionPointerArgs
10451045
CORINFO_METHOD_HANDLE methodHnd;
10461046
};
10471047

1048-
typedef HCCALL1_PTR(TADDR, FnStaticBaseHelper, TADDR arg0);
1049-
10501048
struct StaticFieldAddressArgs
10511049
{
1052-
FnStaticBaseHelper staticBaseHelper;
1050+
PCODE staticBaseHelper;
10531051
TADDR arg0;
10541052
SIZE_T offset;
10551053
};
10561054

1057-
FCDECL1(TADDR, JIT_StaticFieldAddress_Dynamic, StaticFieldAddressArgs * pArgs);
1058-
FCDECL1(TADDR, JIT_StaticFieldAddressUnbox_Dynamic, StaticFieldAddressArgs * pArgs);
1059-
10601055
struct GenericHandleArgs
10611056
{
10621057
LPVOID signature;

src/coreclr/vm/prestub.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,7 +2843,7 @@ static PCODE getHelperForSharedStatic(Module * pModule, ReadyToRunFixupKind kind
28432843
pModule->GetLoaderAllocator()->GetHighFrequencyHeap()->
28442844
AllocMem(S_SIZE_T(sizeof(StaticFieldAddressArgs))));
28452845

2846-
pArgs->staticBaseHelper = (FnStaticBaseHelper)CEEJitInfo::getHelperFtnStatic((CorInfoHelpFunc)helpFunc);
2846+
pArgs->staticBaseHelper = CEEJitInfo::getHelperFtnStatic((CorInfoHelpFunc)helpFunc);
28472847

28482848
switch(helpFunc)
28492849
{
@@ -2879,8 +2879,14 @@ static PCODE getHelperForSharedStatic(Module * pModule, ReadyToRunFixupKind kind
28792879
}
28802880
pArgs->offset = pFD->GetOffset();
28812881

2882+
BinderMethodID managedHelperId = fUnbox ?
2883+
METHOD__STATICSHELPERS__STATICFIELDADDRESSUNBOX_DYNAMIC :
2884+
METHOD__STATICSHELPERS__STATICFIELDADDRESS_DYNAMIC;
2885+
2886+
MethodDesc *pManagedHelper = CoreLibBinder::GetMethod(managedHelperId);
2887+
28822888
PCODE pHelper = DynamicHelpers::CreateHelper(pModule->GetLoaderAllocator(), (TADDR)pArgs,
2883-
fUnbox ? GetEEFuncEntryPoint(JIT_StaticFieldAddressUnbox_Dynamic) : GetEEFuncEntryPoint(JIT_StaticFieldAddress_Dynamic));
2889+
pManagedHelper->GetMultiCallableAddrOfCode());
28842890

28852891
amTracker.SuppressRelease();
28862892

0 commit comments

Comments
 (0)