Skip to content

Commit c3bf307

Browse files
committed
emit tracking
1 parent f14af49 commit c3bf307

File tree

5 files changed

+94
-0
lines changed

5 files changed

+94
-0
lines changed

src/coreclr/jit/emitarm.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -4754,6 +4754,16 @@ void emitter::emitIns_Call(EmitCallType callType,
47544754

47554755
/* Update the emitter's live GC ref sets */
47564756

4757+
// If the method returns a GC ref, mark R0 appropriately
4758+
if (retSize == EA_GCREF)
4759+
{
4760+
gcrefRegs |= RBM_R0;
4761+
}
4762+
else if (retSize == EA_BYREF)
4763+
{
4764+
byrefRegs |= RBM_R0;
4765+
}
4766+
47574767
VarSetOps::Assign(emitComp, emitThisGCrefVars, ptrVars);
47584768
emitThisGCrefRegs = gcrefRegs;
47594769
emitThisByrefRegs = byrefRegs;

src/coreclr/jit/emitarm64.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -9020,6 +9020,26 @@ void emitter::emitIns_Call(EmitCallType callType,
90209020

90219021
/* Update the emitter's live GC ref sets */
90229022

9023+
// If the method returns a GC ref, mark RBM_INTRET appropriately
9024+
if (retSize == EA_GCREF)
9025+
{
9026+
gcrefRegs |= RBM_INTRET;
9027+
}
9028+
else if (retSize == EA_BYREF)
9029+
{
9030+
byrefRegs |= RBM_INTRET;
9031+
}
9032+
9033+
// If is a multi-register return method is called, mark RBM_INTRET_1 appropriately
9034+
if (secondRetSize == EA_GCREF)
9035+
{
9036+
gcrefRegs |= RBM_INTRET_1;
9037+
}
9038+
else if (secondRetSize == EA_BYREF)
9039+
{
9040+
byrefRegs |= RBM_INTRET_1;
9041+
}
9042+
90239043
VarSetOps::Assign(emitComp, emitThisGCrefVars, ptrVars);
90249044
emitThisGCrefRegs = gcrefRegs;
90259045
emitThisByrefRegs = byrefRegs;

src/coreclr/jit/emitloongarch64.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -2464,6 +2464,26 @@ void emitter::emitIns_Call(EmitCallType callType,
24642464

24652465
/* Update the emitter's live GC ref sets */
24662466

2467+
// If the method returns a GC ref, mark RBM_INTRET appropriately
2468+
if (retSize == EA_GCREF)
2469+
{
2470+
gcrefRegs |= RBM_INTRET;
2471+
}
2472+
else if (retSize == EA_BYREF)
2473+
{
2474+
byrefRegs |= RBM_INTRET;
2475+
}
2476+
2477+
// If is a multi-register return method is called, mark RBM_INTRET_1 appropriately
2478+
if (secondRetSize == EA_GCREF)
2479+
{
2480+
gcrefRegs |= RBM_INTRET_1;
2481+
}
2482+
else if (secondRetSize == EA_BYREF)
2483+
{
2484+
byrefRegs |= RBM_INTRET_1;
2485+
}
2486+
24672487
VarSetOps::Assign(emitComp, emitThisGCrefVars, ptrVars);
24682488
emitThisGCrefRegs = gcrefRegs;
24692489
emitThisByrefRegs = byrefRegs;

src/coreclr/jit/emitriscv64.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,26 @@ void emitter::emitIns_Call(EmitCallType callType,
13731373

13741374
/* Update the emitter's live GC ref sets */
13751375

1376+
// If the method returns a GC ref, mark RBM_INTRET appropriately
1377+
if (retSize == EA_GCREF)
1378+
{
1379+
gcrefRegs |= RBM_INTRET;
1380+
}
1381+
else if (retSize == EA_BYREF)
1382+
{
1383+
byrefRegs |= RBM_INTRET;
1384+
}
1385+
1386+
// If is a multi-register return method is called, mark RBM_INTRET_1 appropriately
1387+
if (secondRetSize == EA_GCREF)
1388+
{
1389+
gcrefRegs |= RBM_INTRET_1;
1390+
}
1391+
else if (secondRetSize == EA_BYREF)
1392+
{
1393+
byrefRegs |= RBM_INTRET_1;
1394+
}
1395+
13761396
VarSetOps::Assign(emitComp, emitThisGCrefVars, ptrVars);
13771397
emitThisGCrefRegs = gcrefRegs;
13781398
emitThisByrefRegs = byrefRegs;

src/coreclr/jit/emitxarch.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -9580,6 +9580,28 @@ void emitter::emitIns_Call(EmitCallType callType,
95809580

95819581
/* Update the emitter's live GC ref sets */
95829582

9583+
// If the method returns a GC ref, mark EAX appropriately
9584+
if (retSize == EA_GCREF)
9585+
{
9586+
gcrefRegs |= RBM_EAX;
9587+
}
9588+
else if (retSize == EA_BYREF)
9589+
{
9590+
byrefRegs |= RBM_EAX;
9591+
}
9592+
9593+
#ifdef UNIX_AMD64_ABI
9594+
// If is a multi-register return method is called, mark RDX appropriately (for System V AMD64).
9595+
if (secondRetSize == EA_GCREF)
9596+
{
9597+
gcrefRegs |= RBM_RDX;
9598+
}
9599+
else if (secondRetSize == EA_BYREF)
9600+
{
9601+
byrefRegs |= RBM_RDX;
9602+
}
9603+
#endif // UNIX_AMD64_ABI
9604+
95839605
VarSetOps::Assign(emitComp, emitThisGCrefVars, ptrVars);
95849606
emitThisGCrefRegs = gcrefRegs;
95859607
emitThisByrefRegs = byrefRegs;
@@ -10951,6 +10973,8 @@ void emitter::emitDispIns(
1095110973
// printf("[A=%08X] " , emitSimpleByrefStkMask);
1095210974
// printf("[L=%02u] " , id->idCodeSize());
1095310975

10976+
doffs = true;
10977+
1095410978
if (!isNew && !asmfm)
1095510979
{
1095610980
doffs = true;

0 commit comments

Comments
 (0)