Skip to content

Commit 69db0ee

Browse files
Backport of Fix statics issue with barriers (#108311) (#108347)
* Fix statics issue with barriers * Add barriers for RiscV and Loongson Co-authored-by: Jeff Schwartz <[email protected]>
1 parent 5f87907 commit 69db0ee

File tree

4 files changed

+14
-8
lines changed

4 files changed

+14
-8
lines changed

src/coreclr/vm/arm64/asmhelpers.S

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,8 @@ DynamicHelper DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_Object
669669

670670
LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT
671671
// If class is not initialized, bail to C++ helper
672-
ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics]
672+
add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics
673+
ldar x1, [x1]
673674
tbnz x1, #0, LOCAL_LABEL(JIT_GetDynamicNonGCStaticBase_SingleAppDomain_CallHelper)
674675
mov x0, x1
675676
ret lr
@@ -684,7 +685,8 @@ LEAF_END JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT
684685

685686
LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain, _TEXT
686687
// If class is not initialized, bail to C++ helper
687-
ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics]
688+
add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics
689+
ldar x1, [x1]
688690
tbnz x1, #0, LOCAL_LABEL(JIT_GetDynamicGCStaticBase_SingleAppDomain_CallHelper)
689691
mov x0, x1
690692
ret lr

src/coreclr/vm/arm64/asmhelpers.asm

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,8 @@ Fail
10291029

10301030
LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain
10311031
; If class is not initialized, bail to C++ helper
1032-
ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics]
1032+
add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics
1033+
ldar x1, [x1]
10331034
tbnz x1, #0, CallHelper1
10341035
mov x0, x1
10351036
ret lr
@@ -1043,7 +1044,8 @@ CallHelper1
10431044

10441045
LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain
10451046
; If class is not initialized, bail to C++ helper
1046-
ldr x1, [x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics]
1047+
add x1, x0, #OFFSETOF__DynamicStaticsInfo__m_pGCStatics
1048+
ldar x1, [x1]
10471049
tbnz x1, #0, CallHelper2
10481050
mov x0, x1
10491051
ret lr

src/coreclr/vm/loongarch64/asmhelpers.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,7 @@ LEAF_END setFPReturn, _TEXT
950950
LEAF_ENTRY JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT
951951
// If class is not initialized, bail to C++ helper
952952
ld.d $a1, $a0, OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics
953+
dbar 0
953954
bnez $a1, LOCAL_LABEL(JIT_GetDynamicNonGCStaticBase_SingleAppDomain_CallHelper)
954955
ori $a0, $a1, 0
955956
jirl $r0, $ra, 0
@@ -965,6 +966,7 @@ LEAF_END JIT_GetDynamicNonGCStaticBase_SingleAppDomain, _TEXT
965966
LEAF_ENTRY JIT_GetDynamicGCStaticBase_SingleAppDomain, _TEXT
966967
// If class is not initialized, bail to C++ helper
967968
ld.d $a1, $a0, OFFSETOF__DynamicStaticsInfo__m_pGCStatics
969+
dbar 0
968970
bnez $a1, LOCAL_LABEL(JIT_GetDynamicGCStaticBase_SingleAppDomain_CallHelper)
969971
ori $a0, $a1, 0
970972
jirl $r0, $ra, 0

src/coreclr/vm/methodtable.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,12 @@ struct DynamicStaticsInfo
598598
TADDR m_pGCStatics; // Always access through helper methods to properly handle the ISCLASSNOTINITED bit
599599
TADDR m_pNonGCStatics; // Always access through helper methods to properly handle the ISCLASSNOTINITED bit
600600
PTR_MethodTable m_pMethodTable;
601-
PTR_OBJECTREF GetGCStaticsPointer() { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pGCStatics); return dac_cast<PTR_OBJECTREF>(staticsVal & STATICSPOINTERMASK); }
602-
PTR_BYTE GetNonGCStaticsPointer() { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pNonGCStatics); return dac_cast<PTR_BYTE>(staticsVal & STATICSPOINTERMASK); }
601+
PTR_OBJECTREF GetGCStaticsPointer() { TADDR staticsVal = VolatileLoad(&m_pGCStatics); return dac_cast<PTR_OBJECTREF>(staticsVal & STATICSPOINTERMASK); }
602+
PTR_BYTE GetNonGCStaticsPointer() { TADDR staticsVal = VolatileLoad(&m_pNonGCStatics); return dac_cast<PTR_BYTE>(staticsVal & STATICSPOINTERMASK); }
603603
PTR_OBJECTREF GetGCStaticsPointerAssumeIsInited() { TADDR staticsVal = m_pGCStatics; _ASSERTE(staticsVal != 0); _ASSERTE((staticsVal & (ISCLASSNOTINITEDMASK)) == 0); return dac_cast<PTR_OBJECTREF>(staticsVal); }
604604
PTR_BYTE GetNonGCStaticsPointerAssumeIsInited() { TADDR staticsVal = m_pNonGCStatics; _ASSERTE(staticsVal != 0); _ASSERTE((staticsVal & (ISCLASSNOTINITEDMASK)) == 0); return dac_cast<PTR_BYTE>(staticsVal); }
605-
bool GetIsInitedAndGCStaticsPointerIfInited(PTR_OBJECTREF *ptrResult) { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pGCStatics); *ptrResult = dac_cast<PTR_OBJECTREF>(staticsVal); return !(staticsVal & ISCLASSNOTINITED); }
606-
bool GetIsInitedAndNonGCStaticsPointerIfInited(PTR_BYTE *ptrResult) { TADDR staticsVal = VolatileLoadWithoutBarrier(&m_pNonGCStatics); *ptrResult = dac_cast<PTR_BYTE>(staticsVal); return !(staticsVal & ISCLASSNOTINITED); }
605+
bool GetIsInitedAndGCStaticsPointerIfInited(PTR_OBJECTREF *ptrResult) { TADDR staticsVal = VolatileLoad(&m_pGCStatics); *ptrResult = dac_cast<PTR_OBJECTREF>(staticsVal); return !(staticsVal & ISCLASSNOTINITED); }
606+
bool GetIsInitedAndNonGCStaticsPointerIfInited(PTR_BYTE *ptrResult) { TADDR staticsVal = VolatileLoad(&m_pNonGCStatics); *ptrResult = dac_cast<PTR_BYTE>(staticsVal); return !(staticsVal & ISCLASSNOTINITED); }
607607

608608
// This function sets the pointer portion of a statics pointer. It returns false if the statics value was already set.
609609
bool InterlockedUpdateStaticsPointer(bool isGC, TADDR newVal, bool isClassInitedByUpdatingStaticPointer)

0 commit comments

Comments
 (0)