[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:
committed by
Commit Queue
parent
ada8082d90
commit
7b30d3507f
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user