[vm/shared] Ensure field initialization uses store-release semantic for updating shared fields.

Fixes https://github.com/dart-lang/sdk/issues/61367
TEST=ci tsan

Change-Id: I8e3e6fa1e4f4a799f19eca298be9e37c972b3343
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447442
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
This commit is contained in:
Alexander Aprelev
2025-08-27 15:16:10 -07:00
committed by Commit Queue
parent ada8082d90
commit 7b30d3507f
+10 -2
View File
@@ -137,12 +137,20 @@ void StubCodeCompiler::GenerateInitLateStaticFieldStub(bool is_final,
Label throw_exception;
if (is_final) {
__ Comment("Checking that initializer did not set late final field");
__ LoadFromOffset(kScratchReg, kAddressReg, 0);
if (is_shared) {
__ LoadAcquireFromOffset(kScratchReg, kAddressReg, 0);
} else {
__ LoadFromOffset(kScratchReg, kAddressReg, 0);
}
__ CompareObject(kScratchReg, SentinelObject());
__ BranchIf(NOT_EQUAL, &throw_exception);
}
__ StoreToOffset(kResultReg, kAddressReg, 0);
if (is_shared) {
__ StoreReleaseToOffset(kResultReg, kAddressReg, 0);
} else {
__ StoreToOffset(kResultReg, kAddressReg, 0);
}
__ LeaveStubFrame();
__ Ret();