From 7b30d3507fa7a45ff0cbdb7d3e775cf0a4be0701 Mon Sep 17 00:00:00 2001 From: Alexander Aprelev Date: Wed, 27 Aug 2025 15:16:10 -0700 Subject: [PATCH] [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 Commit-Queue: Alexander Aprelev --- runtime/vm/compiler/stub_code_compiler.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc index 300b7262b6b..23a4280a33b 100644 --- a/runtime/vm/compiler/stub_code_compiler.cc +++ b/runtime/vm/compiler/stub_code_compiler.cc @@ -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();