diff --git a/runtime/platform/thread_sanitizer.h b/runtime/platform/thread_sanitizer.h index 2f059d210ad..12c0efdbaee 100644 --- a/runtime/platform/thread_sanitizer.h +++ b/runtime/platform/thread_sanitizer.h @@ -35,6 +35,8 @@ extern "C" void __tsan_write2(void* addr); extern "C" void __tsan_write4(void* addr); extern "C" void __tsan_write8(void* addr); extern "C" void __tsan_write16(void* addr); +extern "C" void __tsan_func_entry(void* pc); +extern "C" void __tsan_func_exit(); #else #define NO_SANITIZE_THREAD #endif diff --git a/runtime/tests/vm/dart/tsan/array_data_race_test.dart b/runtime/tests/vm/dart/tsan/array_data_race_test.dart index b27b5f0c40e..a9cde1d2ebf 100644 --- a/runtime/tests/vm/dart/tsan/array_data_race_test.dart +++ b/runtime/tests/vm/dart/tsan/array_data_race_test.dart @@ -83,6 +83,6 @@ main(List arguments) { Expect.notEquals(0, result.exitCode); Expect.contains("ThreadSanitizer: data race", result.stderr); Expect.contains("of size 8", result.stderr); - Expect.contains("List.[]=", result.stderr); - Expect.contains("_Array.[]", result.stderr); + Expect.contains("dataRaceFromMain", result.stderr); + Expect.contains("dataRaceFromChild", result.stderr); } diff --git a/runtime/tests/vm/dart/tsan/field_data_race_test.dart b/runtime/tests/vm/dart/tsan/field_data_race_test.dart index c9ddbd3ca9c..9b7e7a1a524 100644 --- a/runtime/tests/vm/dart/tsan/field_data_race_test.dart +++ b/runtime/tests/vm/dart/tsan/field_data_race_test.dart @@ -40,8 +40,20 @@ dataRaceFromChild() { } } +@pragma("vm:never-inline") +dataRaceFromMainCaller() => dataRaceFromMain(); + +@pragma("vm:never-inline") +dataRaceFromMainCallerCaller() => dataRaceFromMainCaller(); + +@pragma("vm:never-inline") +dataRaceFromChildCaller() => dataRaceFromChild(); + +@pragma("vm:never-inline") +dataRaceFromChildCallerCaller() => dataRaceFromChildCaller(); + child(_) { - dataRaceFromChild(); + dataRaceFromChildCallerCaller(); } final nativeLib = dlopenPlatformSpecific('ffi_test_functions'); @@ -65,7 +77,7 @@ main(List arguments) { unsafeSetSharedTo(getRootLibraryUrl(), "box", Box()); print(box); // side effect initialization Isolate.spawn(child, null); - dataRaceFromMain(); + dataRaceFromMainCallerCaller(); return; } @@ -87,5 +99,9 @@ main(List arguments) { Expect.contains("ThreadSanitizer: data race", result.stderr); Expect.contains("of size 8", result.stderr); Expect.contains("dataRaceFromMain", result.stderr); + Expect.contains("dataRaceFromMainCaller", result.stderr); + Expect.contains("dataRaceFromMainCallerCaller", result.stderr); Expect.contains("dataRaceFromChild", result.stderr); + Expect.contains("dataRaceFromChildCaller", result.stderr); + Expect.contains("dataRaceFromChildCallerCaller", result.stderr); } diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc index a66263c9aba..f61af5df067 100644 --- a/runtime/vm/compiler/assembler/assembler_arm.cc +++ b/runtime/vm/compiler/assembler/assembler_arm.cc @@ -3273,7 +3273,8 @@ void Assembler::EmitEntryFrameVerification(Register scratch) { } void Assembler::CallRuntime(const RuntimeEntry& entry, - intptr_t argument_count) { + intptr_t argument_count, + bool tsan_enter_exit) { ASSERT(!entry.is_leaf()); // Argument count is not checked here, but in the runtime entry for a more // informative error message. diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h index f096c0f606c..b526c7d9dde 100644 --- a/runtime/vm/compiler/assembler/assembler_arm.h +++ b/runtime/vm/compiler/assembler/assembler_arm.h @@ -430,6 +430,10 @@ class Assembler : public AssemblerBase { void StoreMemoryValue(Register src, Register base, int32_t offset) { StoreToOffset(src, base, offset); } + + void TsanFuncEntry(bool preserve_registers = true) { UNREACHABLE(); } + void TsanFuncExit(bool preserve_registers = true) { UNREACHABLE(); } + void LoadAcquire(Register dst, const Address& address, OperandSize size = kFourBytes) override { @@ -1464,7 +1468,9 @@ class Assembler : public AssemblerBase { void EmitEntryFrameVerification(Register scratch); // For non-leaf runtime calls. For leaf runtime calls, use LeafRuntimeScope, - void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); + void CallRuntime(const RuntimeEntry& entry, + intptr_t argument_count, + bool tsan_enter_exit = true); // Set up a Dart frame on entry with a frame pointer and PC information to // enable easy access to the RawInstruction object of code corresponding diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc index 3f055336e7c..05d7d49c361 100644 --- a/runtime/vm/compiler/assembler/assembler_arm64.cc +++ b/runtime/vm/compiler/assembler/assembler_arm64.cc @@ -403,6 +403,22 @@ void Assembler::TsanWrite(Register addr, intptr_t size) { } } +void Assembler::TsanFuncEntry(bool preserve_registers) { + Comment("TsanFuncEntry"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + ldr(R0, Address(FP, target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + ldr(R0, Address(R0, target::frame_layout.saved_caller_pc_from_fp * + target::kWordSize)); + rt.Call(kTsanFuncEntryRuntimeEntry, /*argument_count=*/1); +} + +void Assembler::TsanFuncExit(bool preserve_registers) { + Comment("TsanFuncExit"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + rt.Call(kTsanFuncExitRuntimeEntry, /*argument_count=*/0); +} + static int CountLeadingZeros(uint64_t value, int width) { if (width == 64) return Utils::CountLeadingZeros64(value); if (width == 32) return Utils::CountLeadingZeros32(value); @@ -1830,13 +1846,22 @@ void Assembler::VerifyNotInGenerated(Register scratch) { } void Assembler::CallRuntime(const RuntimeEntry& entry, - intptr_t argument_count) { + intptr_t argument_count, + bool tsan_enter_exit) { ASSERT(!entry.is_leaf()); // Argument count is not checked here, but in the runtime entry for a more // informative error message. + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncEntry(/*preserve_registers=*/false); + } ldr(R5, compiler::Address(THR, entry.OffsetFromThread())); LoadImmediate(R4, argument_count); Call(Address(THR, target::Thread::call_to_runtime_entry_point_offset())); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncExit(/*preserve_registers=*/false); + } } // FPU: Only the bottom 64-bits of v8-v15 are preserved by the caller. The upper diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h index 33f6367c08f..d46ab7343e9 100644 --- a/runtime/vm/compiler/assembler/assembler_arm64.h +++ b/runtime/vm/compiler/assembler/assembler_arm64.h @@ -506,6 +506,8 @@ class Assembler : public AssemblerBase { void TsanStoreRelease(Register src, Register addr, OperandSize size); void TsanRead(Register addr, intptr_t size); void TsanWrite(Register addr, intptr_t size); + void TsanFuncEntry(bool preserve_registers = true); + void TsanFuncExit(bool preserve_registers = true); void LoadAcquire(Register dst, const Address& address, @@ -2141,7 +2143,9 @@ class Assembler : public AssemblerBase { void LeaveDartFrame(); // For non-leaf runtime calls. For leaf runtime calls, use LeafRuntimeScope, - void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); + void CallRuntime(const RuntimeEntry& entry, + intptr_t argument_count, + bool tsan_enter_exit = true); // Set up a stub frame so that the stack traversal code can easily identify // a stub frame. diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc index 7432472714d..f9140ea0f9f 100644 --- a/runtime/vm/compiler/assembler/assembler_ia32.cc +++ b/runtime/vm/compiler/assembler/assembler_ia32.cc @@ -2607,7 +2607,8 @@ static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = { EAX, ECX, EDX}; void Assembler::CallRuntime(const RuntimeEntry& entry, - intptr_t argument_count) { + intptr_t argument_count, + bool tsan_enter_exit) { ASSERT(!entry.is_leaf()); // Argument count is not checked here, but in the runtime entry for a more // informative error message. diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h index 316dbee9a0a..a47ecb23126 100644 --- a/runtime/vm/compiler/assembler/assembler_ia32.h +++ b/runtime/vm/compiler/assembler/assembler_ia32.h @@ -668,6 +668,9 @@ class Assembler : public AssemblerBase { } } + void TsanFuncEntry(bool preserve_registers = true) { UNREACHABLE(); } + void TsanFuncExit(bool preserve_registers = true) { UNREACHABLE(); } + void LoadAcquire(Register dst, const Address& address, OperandSize size = kFourBytes) override { @@ -906,7 +909,9 @@ class Assembler : public AssemblerBase { void ExitFullSafepoint(Register scratch); // For non-leaf runtime calls. For leaf runtime calls, use LeafRuntimeScope, - void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); + void CallRuntime(const RuntimeEntry& entry, + intptr_t argument_count, + bool tsan_enter_exit = true); void Call(const Code& code, bool movable_target = false, diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc index df6abd916ac..bbee925d301 100644 --- a/runtime/vm/compiler/assembler/assembler_riscv.cc +++ b/runtime/vm/compiler/assembler/assembler_riscv.cc @@ -3222,6 +3222,22 @@ void Assembler::TsanWrite(Register addr, intptr_t size) { } } +void Assembler::TsanFuncEntry(bool preserve_registers) { + Comment("TsanFuncEntry"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + lx(A0, Address(FP, target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + lx(A0, Address(A0, target::frame_layout.saved_caller_pc_from_fp * + target::kWordSize)); + rt.Call(kTsanFuncEntryRuntimeEntry, /*argument_count=*/1); +} + +void Assembler::TsanFuncExit(bool preserve_registers) { + Comment("TsanFuncExit"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + rt.Call(kTsanFuncExitRuntimeEntry, /*argument_count=*/0); +} + void Assembler::LoadAcquire(Register dst, const Address& address, OperandSize size) { @@ -4854,13 +4870,22 @@ void Assembler::LeaveDartFrame(intptr_t fp_sp_dist) { } void Assembler::CallRuntime(const RuntimeEntry& entry, - intptr_t argument_count) { + intptr_t argument_count, + bool tsan_enter_exit) { ASSERT(!entry.is_leaf()); // Argument count is not checked here, but in the runtime entry for a more // informative error message. + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncEntry(/*preserve_registers=*/false); + } lx(T5, compiler::Address(THR, entry.OffsetFromThread())); li(T4, argument_count); Call(Address(THR, target::Thread::call_to_runtime_entry_point_offset())); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncExit(/*preserve_registers=*/false); + } } static const RegisterSet kRuntimeCallSavedRegisters(kDartVolatileCpuRegs, diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h index e4b650eb22b..855a19d2c91 100644 --- a/runtime/vm/compiler/assembler/assembler_riscv.h +++ b/runtime/vm/compiler/assembler/assembler_riscv.h @@ -1011,6 +1011,8 @@ class Assembler : public MicroAssembler { void TsanStoreRelease(Register src, const Address& address, OperandSize size); void TsanRead(Register addr, intptr_t size); void TsanWrite(Register addr, intptr_t size); + void TsanFuncEntry(bool preserve_registers = true); + void TsanFuncExit(bool preserve_registers = true); void LoadAcquire(Register dst, const Address& address, @@ -1478,7 +1480,9 @@ class Assembler : public MicroAssembler { void LeaveDartFrame(intptr_t fp_sp_dist); // For non-leaf runtime calls. For leaf runtime calls, use LeafRuntimeScope, - void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); + void CallRuntime(const RuntimeEntry& entry, + intptr_t argument_count, + bool tsan_enter_exit = true); // Set up a stub frame so that the stack traversal code can easily identify // a stub frame. diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc index 79f1c2af473..2d1f0cc33d1 100644 --- a/runtime/vm/compiler/assembler/assembler_x64.cc +++ b/runtime/vm/compiler/assembler/assembler_x64.cc @@ -2058,13 +2058,22 @@ void Assembler::CallCFunction(Address address, bool restore_rsp) { } void Assembler::CallRuntime(const RuntimeEntry& entry, - intptr_t argument_count) { + intptr_t argument_count, + bool tsan_enter_exit) { ASSERT(!entry.is_leaf()); // Argument count is not checked here, but in the runtime entry for a more // informative error message. + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncEntry(/*preserve_registers=*/false); + } movq(RBX, compiler::Address(THR, entry.OffsetFromThread())); LoadImmediate(R10, compiler::Immediate(argument_count)); call(Address(THR, target::Thread::call_to_runtime_entry_point_offset())); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode && + tsan_enter_exit) { + TsanFuncExit(/*preserve_registers=*/false); + } } #define __ assembler_-> @@ -2226,7 +2235,7 @@ void Assembler::TsanRead(Register addr, intptr_t size) { } void Assembler::TsanWrite(Register addr, intptr_t size) { - Comment("TsanStoreRelease"); + Comment("TsanWrite"); LeafRuntimeScope rt(this, /*frame_size=*/0, /*preserve_registers=*/true); MoveRegister(CallingConventions::kArg1Reg, addr); switch (size) { @@ -2250,6 +2259,25 @@ void Assembler::TsanWrite(Register addr, intptr_t size) { } } +void Assembler::TsanFuncEntry(bool preserve_registers) { + Comment("TsanFuncEntry"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + movq(CallingConventions::kArg1Reg, + Address(RBP, target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + movq(CallingConventions::kArg1Reg, + Address( + CallingConventions::kArg1Reg, + target::frame_layout.saved_caller_pc_from_fp * target::kWordSize)); + rt.Call(kTsanFuncEntryRuntimeEntry, /*argument_count=*/1); +} + +void Assembler::TsanFuncExit(bool preserve_registers) { + Comment("TsanFuncExit"); + LeafRuntimeScope rt(this, /*frame_size=*/0, preserve_registers); + rt.Call(kTsanFuncExitRuntimeEntry, /*argument_count=*/0); +} + void Assembler::RestoreCodePointer() { movq(CODE_REG, Address(RBP, target::frame_layout.code_from_fp * target::kWordSize)); diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h index a432e8cc1f2..f71dac18582 100644 --- a/runtime/vm/compiler/assembler/assembler_x64.h +++ b/runtime/vm/compiler/assembler/assembler_x64.h @@ -966,7 +966,9 @@ class Assembler : public AssemblerBase { void EmitEntryFrameVerification(); // For non-leaf runtime calls. For leaf runtime calls, use LeafRuntimeScope, - void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); + void CallRuntime(const RuntimeEntry& entry, + intptr_t argument_count, + bool tsan_enter_exit = true); // Call runtime function. Reserves shadow space on the stack before calling // if platform ABI requires that. @@ -1163,6 +1165,8 @@ class Assembler : public AssemblerBase { void TsanStoreRelease(Register src, Address addr, OperandSize size); void TsanRead(Register addr, intptr_t size); void TsanWrite(Register addr, intptr_t size); + void TsanFuncEntry(bool preserve_registers = true); + void TsanFuncExit(bool preserve_registers = true); void LoadAcquire(Register dst, const Address& address, diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc index cfb69328219..f91f5553488 100644 --- a/runtime/vm/compiler/backend/constant_propagator.cc +++ b/runtime/vm/compiler/backend/constant_propagator.cc @@ -307,6 +307,9 @@ void ConstantPropagator::VisitDeoptimize(DeoptimizeInstr* instr) { // TODO(vegorov) remove all code after DeoptimizeInstr as dead. } +void ConstantPropagator::VisitTsanFuncEntryExit(TsanFuncEntryExitInstr* instr) { +} + void ConstantPropagator::VisitTsanReadWrite(TsanReadWriteInstr* instr) {} Definition* ConstantPropagator::UnwrapPhi(Definition* defn) { diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc index 14b4c6be09f..8bb546f55f1 100644 --- a/runtime/vm/compiler/backend/flow_graph.cc +++ b/runtime/vm/compiler/backend/flow_graph.cc @@ -2676,12 +2676,13 @@ void FlowGraph::ExtractNonInternalTypedDataPayloads() { void FlowGraph::AddTsanInstrumentation() { if (!FLAG_target_thread_sanitizer) return; + bool needs_entry_exit = false; for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done(); block_it.Advance()) { BlockEntryInstr* block = block_it.Current(); + for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { Instruction* current = it.Current(); - if (LoadFieldInstr* load = current->AsLoadField()) { if (!load->slot().is_no_sanitize_thread() && load->memory_order() == compiler::Assembler::kRelaxedNonAtomic) { @@ -2689,6 +2690,7 @@ void FlowGraph::AddTsanInstrumentation() { TsanReadWriteInstr::Kind::kRead, load->slot(), new (Z) Value(load->instance()->definition()), load->source()); InsertBefore(load, tsan_read, /*env=*/nullptr, kEffect); + needs_entry_exit = true; } } else if (StoreFieldInstr* store = current->AsStoreField()) { if (!store->slot().is_no_sanitize_thread() && @@ -2697,7 +2699,37 @@ void FlowGraph::AddTsanInstrumentation() { TsanReadWriteInstr::Kind::kWrite, store->slot(), new (Z) Value(store->instance()->definition()), store->source()); InsertBefore(store, tsan_write, /*env=*/nullptr, kEffect); + needs_entry_exit = true; } + } else if (current->CanCallDart() || current->MayThrow()) { + needs_entry_exit = true; + } + } + } + + // TSAN can't symbolize JIT functions anyway, so don't bother with this + // overhead. + if (!FLAG_precompiled_mode) return; + + if (!needs_entry_exit) return; + + for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done(); + block_it.Advance()) { + BlockEntryInstr* block = block_it.Current(); + if (block->IsFunctionEntry()) { + auto* tsan_entry = new (Z) TsanFuncEntryExitInstr( + TsanFuncEntryExitInstr::kEntry, block->source()); + InsertAfter(block, tsan_entry, /*env=*/nullptr, kEffect); + } + for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { + Instruction* current = it.Current(); + if ((current->IsDartReturn() && + !parsed_function_.function().IsAsyncFunction() && + !parsed_function_.function().IsAsyncGenerator()) || + current->IsTailCall()) { + auto* tsan_exit = new (Z) TsanFuncEntryExitInstr( + TsanFuncEntryExitInstr::kExit, current->source()); + InsertBefore(current, tsan_exit, /*env=*/nullptr, kEffect); } } } diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc index 03fbf641aae..2e12c92103d 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc @@ -3087,6 +3087,7 @@ void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) { EmitCodeAtSlowPathEntry(compiler); LocationSummary* locs = instruction()->locs(); const bool has_frame = compiler->flow_graph().graph_entry()->NeedsFrame(); + bool need_tsan_exit = false; if (use_shared_stub) { if (!has_frame) { #if !defined(TARGET_ARCH_IA32) @@ -3094,6 +3095,9 @@ void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) { __ set_constant_pool_allowed(false); #endif __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } EmitSharedStubCall(compiler, live_fpu_registers); #if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64) @@ -3107,7 +3111,14 @@ void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) { // Save registers as they are needed for lazy deopt / exception handling. compiler->SaveLiveRegisters(locs); PushArgumentsForRuntimeCall(compiler); - __ CallRuntime(runtime_entry_, num_args); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + need_tsan_exit = true; + __ TsanFuncEntry(/*preserve_registers=*/false); + } + // We need to emit TsanFuncEntry/Exit separately so the pc descriptors, etc + // are recordered for the call's return address. + bool tsan_enter_exit = false; + __ CallRuntime(runtime_entry_, num_args, tsan_enter_exit); } const intptr_t deopt_id = instruction()->deopt_id(); compiler->AddCurrentDescriptor(UntaggedPcDescriptors::kOther, deopt_id, @@ -3134,6 +3145,8 @@ void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) { } if (!use_shared_stub) { __ Breakpoint(); + } else if (need_tsan_exit) { + __ TsanFuncExit(/*preserve_registers=*/false); } } diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc index 607a8bea8d5..3ee177318f3 100644 --- a/runtime/vm/compiler/backend/il.cc +++ b/runtime/vm/compiler/backend/il.cc @@ -7283,6 +7283,66 @@ Definition* InvokeMathCFunctionInstr::Canonicalize(FlowGraph* flow_graph) { return this; } +LocationSummary* TsanFuncEntryExitInstr::MakeLocationSummary(Zone* zone, + bool opt) const { + const intptr_t kNumTemps = 1; + LocationSummary* result = new (zone) LocationSummary( + zone, InputCount(), kNumTemps, LocationSummary::kNativeLeafCall); + result->set_temp(0, Location::RegisterLocation(CALLEE_SAVED_TEMP)); + return result; +} + +const RuntimeEntry& TsanFuncEntryExitInstr::TargetFunction() const { + if (kind_ == kEntry) { + return kTsanFuncEntryRuntimeEntry; + } else { + return kTsanFuncExitRuntimeEntry; + } +} + +void TsanFuncEntryExitInstr::EmitNativeCode(FlowGraphCompiler* compiler) { + if (!compiler->flow_graph().graph_entry()->NeedsFrame()) return; + + const Register saved_sp = locs()->temp(0).reg(); + ASSERT(IsCalleeSavedRegister(saved_sp)); + ASSERT(IsCalleeSavedRegister(THR)); + ASSERT(IsCalleeSavedRegister(PP)); + ASSERT(IsCalleeSavedRegister(CODE_REG)); +#if defined(TARGET_ARCH_ARM64) + ASSERT(IsCalleeSavedRegister(NULL_REG)); + ASSERT(IsCalleeSavedRegister(HEAP_BITS)); + ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG)); +#elif defined(TARGET_ARCH_RISCV64) + ASSERT(IsCalleeSavedRegister(NULL_REG)); + ASSERT(IsCalleeSavedRegister(WRITE_BARRIER_STATE)); + ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG)); +#endif + + __ MoveRegister(saved_sp, SPREG); +#if defined(TARGET_ARCH_ARM64) + __ AndImmediate(CSP, SP, ~(OS::ActivationFrameAlignment() - 1)); +#else + __ ReserveAlignedFrameSpace(0); +#endif + if (kind_ == kEntry) { + __ Load(CallingConventions::ArgumentRegisters[0], + compiler::Address( + FPREG, compiler::target::frame_layout.saved_caller_pc_from_fp * + compiler::target::kWordSize)); + } + __ Load(TMP, compiler::Address(THR, TargetFunction().OffsetFromThread())); + __ Store(TMP, + compiler::Address(THR, compiler::target::Thread::vm_tag_offset())); + __ CallCFunction(TMP); + __ LoadImmediate(TMP, VMTag::kDartTagId); + __ Store(TMP, + compiler::Address(THR, compiler::target::Thread::vm_tag_offset())); + __ MoveRegister(SPREG, saved_sp); +#if defined(TARGET_ARCH_ARM64) + __ SetupCSPFromThread(THR); +#endif +} + LocationSummary* TsanReadWriteInstr::MakeLocationSummary(Zone* zone, bool opt) const { const intptr_t kNumTemps = 1; @@ -7293,7 +7353,7 @@ LocationSummary* TsanReadWriteInstr::MakeLocationSummary(Zone* zone, return result; } -const RuntimeEntry& TsanReadWriteInstr::GetRuntimeEntry() const { +const RuntimeEntry& TsanReadWriteInstr::TargetFunction() const { intptr_t size = RepresentationUtils::ValueSize(slot().representation()); if (kind_ == Kind::kRead) { switch (size) { @@ -7330,21 +7390,24 @@ const RuntimeEntry& TsanReadWriteInstr::GetRuntimeEntry() const { } void TsanReadWriteInstr::EmitNativeCode(FlowGraphCompiler* compiler) { -#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_RISCV64) || \ - defined(TARGET_ARCH_X64) const Register saved_sp = locs()->temp(0).reg(); - ASSERT(IsAbiPreservedRegister(saved_sp)); - ASSERT(IsAbiPreservedRegister(THR)); - ASSERT(IsAbiPreservedRegister(PP)); - ASSERT(IsAbiPreservedRegister(CODE_REG)); + ASSERT(IsCalleeSavedRegister(saved_sp)); + ASSERT(IsCalleeSavedRegister(THR)); + ASSERT(IsCalleeSavedRegister(PP)); + ASSERT(IsCalleeSavedRegister(CODE_REG)); #if defined(TARGET_ARCH_ARM64) - ASSERT(IsAbiPreservedRegister(NULL_REG)); - ASSERT(IsAbiPreservedRegister(HEAP_BITS)); - ASSERT(IsAbiPreservedRegister(DISPATCH_TABLE_REG)); + ASSERT(IsCalleeSavedRegister(NULL_REG)); + ASSERT(IsCalleeSavedRegister(HEAP_BITS)); + ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG)); +#elif defined(TARGET_ARCH_RISCV64) + ASSERT(IsCalleeSavedRegister(NULL_REG)); + ASSERT(IsCalleeSavedRegister(WRITE_BARRIER_STATE)); + ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG)); #endif + __ MoveRegister(saved_sp, SPREG); #if defined(TARGET_ARCH_ARM64) - __ andi(CSP, SP, compiler::Immediate(~(OS::ActivationFrameAlignment() - 1))); + __ AndImmediate(CSP, SP, ~(OS::ActivationFrameAlignment() - 1)); #else __ ReserveAlignedFrameSpace(0); #endif @@ -7352,7 +7415,7 @@ void TsanReadWriteInstr::EmitNativeCode(FlowGraphCompiler* compiler) { intptr_t tag = slot().has_untagged_instance() ? 0 : kHeapObjectTag; __ AddImmediate(CallingConventions::ArgumentRegisters[0], instance_reg, slot().offset_in_bytes() - tag); - __ Load(TMP, compiler::Address(THR, GetRuntimeEntry().OffsetFromThread())); + __ Load(TMP, compiler::Address(THR, TargetFunction().OffsetFromThread())); __ Store(TMP, compiler::Address(THR, compiler::target::Thread::vm_tag_offset())); __ CallCFunction(TMP); @@ -7363,9 +7426,6 @@ void TsanReadWriteInstr::EmitNativeCode(FlowGraphCompiler* compiler) { #if defined(TARGET_ARCH_ARM64) __ SetupCSPFromThread(THR); #endif -#else - UNREACHABLE(); -#endif } bool DoubleToIntegerInstr::SupportsFloorAndCeil() { diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h index 4c7bc7db2f7..80c724a3df3 100644 --- a/runtime/vm/compiler/backend/il.h +++ b/runtime/vm/compiler/backend/il.h @@ -512,6 +512,7 @@ struct InstrAttrs { M(OneByteStringFromCharCode, kNoGC) \ M(Utf8Scan, kNoGC) \ M(InvokeMathCFunction, kNoGC) \ + M(TsanFuncEntryExit, kNoGC) \ M(TsanReadWrite, kNoGC) \ M(TruncDivMod, kNoGC) \ /*We could be more precise about when these 2 instructions can trigger GC.*/ \ @@ -10038,6 +10039,53 @@ class InvokeMathCFunctionInstr : public VariadicDefinition { DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr); }; +class TsanFuncEntryExitInstr : public TemplateInstruction<0, NoThrow> { + public: + enum Kind { kEntry, kExit }; + + TsanFuncEntryExitInstr(Kind kind, const InstructionSource& source) + : TemplateInstruction(source, DeoptId::kNone), + kind_(kind), + token_pos_(source.token_pos) {} + + virtual TokenPosition token_pos() const { return token_pos_; } + + DECLARE_INSTRUCTION(TsanFuncEntryExit) + + virtual bool ComputeCanDeoptimize() const { return false; } + + virtual Representation RequiredInputRepresentation(intptr_t idx) const { + UNREACHABLE(); + } + + virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } + + virtual bool AllowsCSE() const { return false; } + virtual bool HasUnknownSideEffects() const { return false; } + + virtual bool AttributesEqual(const Instruction& other) const { + return &other == this; + } + + virtual bool MayThrow() const { return false; } + + PRINT_OPERANDS_TO_SUPPORT + +#define FIELD_LIST(F) \ + F(const TsanFuncEntryExitInstr::Kind, kind_) \ + F(const TokenPosition, token_pos_) + + DECLARE_INSTRUCTION_SERIALIZABLE_FIELDS(TsanFuncEntryExitInstr, + TemplateInstruction, + FIELD_LIST) +#undef FIELD_LIST + + const RuntimeEntry& TargetFunction() const; + + private: + DISALLOW_COPY_AND_ASSIGN(TsanFuncEntryExitInstr); +}; + class TsanReadWriteInstr : public TemplateInstruction<1, NoThrow> { public: enum Kind { kRead, kWrite }; @@ -10090,7 +10138,7 @@ class TsanReadWriteInstr : public TemplateInstruction<1, NoThrow> { FIELD_LIST) #undef FIELD_LIST - const RuntimeEntry& GetRuntimeEntry() const; + const RuntimeEntry& TargetFunction() const; private: DISALLOW_COPY_AND_ASSIGN(TsanReadWriteInstr); diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc index ca2d3e7528f..dce05e34059 100644 --- a/runtime/vm/compiler/backend/il_arm64.cc +++ b/runtime/vm/compiler/backend/il_arm64.cc @@ -2899,6 +2899,9 @@ class CheckStackOverflowSlowPath ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } auto object_store = compiler->isolate_group()->object_store(); const bool live_fpu_regs = locs->live_registers()->FpuRegisterCount() > 0; @@ -2923,12 +2926,20 @@ class CheckStackOverflowSlowPath instruction()->deopt_id(), instruction()->source()); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } } else { ASSERT(has_frame); - __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs); + // We're using the function's frame, which already did TsanFuncEntry. Also + // the pc descriptors, etc need to be recordered for the call's return + // address. + const bool tsan_enter_exit = false; + __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs, + tsan_enter_exit); compiler->EmitCallsiteMetadata( instruction()->source(), instruction()->deopt_id(), UntaggedPcDescriptors::kOther, instruction()->locs(), env); @@ -3748,6 +3759,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } auto object_store = compiler->isolate_group()->object_store(); const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0; @@ -3762,6 +3776,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { compiler->GenerateStubCall(source(), stub, UntaggedPcDescriptors::kOther, locs(), DeoptId::kNone, extended_env); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc index 7a729ced25b..b86084b8a2e 100644 --- a/runtime/vm/compiler/backend/il_printer.cc +++ b/runtime/vm/compiler/backend/il_printer.cc @@ -1247,6 +1247,14 @@ void TsanReadWriteInstr::PrintOperandsTo(BaseTextBuffer* f) const { } } +void TsanFuncEntryExitInstr::PrintOperandsTo(BaseTextBuffer* f) const { + if (kind_ == kEntry) { + f->AddString("entry"); + } else { + f->AddString("exit"); + } +} + void GraphEntryInstr::PrintBlockHeaderTo(BaseTextBuffer* f) const { f->Printf("B%" Pd "[graph]:%" Pd, block_id(), GetDeoptId()); } diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc index 149d8668a6b..aa49057c781 100644 --- a/runtime/vm/compiler/backend/il_riscv.cc +++ b/runtime/vm/compiler/backend/il_riscv.cc @@ -3094,6 +3094,9 @@ class CheckStackOverflowSlowPath ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } auto object_store = compiler->isolate_group()->object_store(); const bool live_fpu_regs = locs->live_registers()->FpuRegisterCount() > 0; @@ -3118,12 +3121,20 @@ class CheckStackOverflowSlowPath instruction()->deopt_id(), instruction()->source()); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } } else { ASSERT(has_frame); - __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs); + // We're using the function's frame, which already did TsanFuncEntry. Also + // the pc descriptors, etc need to be recordered for the call's return + // address. + const bool tsan_enter_exit = false; + __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs, + tsan_enter_exit); compiler->EmitCallsiteMetadata( instruction()->source(), instruction()->deopt_id(), UntaggedPcDescriptors::kOther, instruction()->locs(), env); @@ -4114,6 +4125,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } auto object_store = compiler->isolate_group()->object_store(); const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0; @@ -4128,6 +4142,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { compiler->GenerateStubCall(source(), stub, UntaggedPcDescriptors::kOther, locs(), DeoptId::kNone, extended_env); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc index b612b4943ff..2f14e3f2494 100644 --- a/runtime/vm/compiler/backend/il_x64.cc +++ b/runtime/vm/compiler/backend/il_x64.cc @@ -2864,6 +2864,9 @@ class CheckStackOverflowSlowPath ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } const uword entry_point_offset = Thread::stack_overflow_shared_stub_entry_point_offset( @@ -2875,12 +2878,20 @@ class CheckStackOverflowSlowPath instruction()->deopt_id(), instruction()->source()); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } } else { ASSERT(has_frame); - __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs); + // We're using the function's frame, which already did TsanFuncEntry. Also + // the pc descriptors, etc need to be recordered for the call's return + // address. + const bool tsan_enter_exit = false; + __ CallRuntime(kInterruptOrStackOverflowRuntimeEntry, kNumSlowPathArgs, + tsan_enter_exit); compiler->EmitCallsiteMetadata( instruction()->source(), instruction()->deopt_id(), UntaggedPcDescriptors::kOther, instruction()->locs(), env); @@ -3999,6 +4010,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { ASSERT(__ constant_pool_allowed()); __ set_constant_pool_allowed(false); __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } } auto object_store = compiler->isolate_group()->object_store(); const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0; @@ -4013,6 +4027,9 @@ void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { compiler->GenerateStubCall(source(), stub, UntaggedPcDescriptors::kOther, locs(), DeoptId::kNone, extended_env); if (!has_frame) { + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); __ set_constant_pool_allowed(true); } diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h index e3019c08c71..1e3790ad3e4 100644 --- a/runtime/vm/compiler/runtime_offsets_extracted.h +++ b/runtime/vm/compiler/runtime_offsets_extracted.h @@ -341,7 +341,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x3fc; + 0x404; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -354,13 +354,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x444; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x44c; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x400; + Thread_double_truncate_round_supported_offset = 0x408; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x448; + Thread_service_extension_stream_offset = 0x450; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -476,7 +476,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x334; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x34; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x42c; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x434; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0xdc; static constexpr dart::compiler::target::word @@ -523,21 +523,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x408; + Thread_unboxed_runtime_arg_offset = 0x410; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x318; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x418; -static constexpr dart::compiler::target::word Thread_random_offset = 0x420; + 0x420; +static constexpr dart::compiler::target::word Thread_random_offset = 0x428; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x428; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x434; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x438; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x430; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x430; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x43c; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x440; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x438; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -1059,7 +1059,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x810; + 0x820; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -1072,13 +1072,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x878; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x888; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x818; + Thread_double_truncate_round_supported_offset = 0x828; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x880; + Thread_service_extension_stream_offset = 0x890; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -1194,7 +1194,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x680; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x68; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x848; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x858; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -1241,21 +1241,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x820; + Thread_unboxed_runtime_arg_offset = 0x830; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x648; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x830; -static constexpr dart::compiler::target::word Thread_random_offset = 0x838; + 0x840; +static constexpr dart::compiler::target::word Thread_random_offset = 0x848; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x840; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x858; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x860; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x850; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x850; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x868; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x870; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x860; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -1777,7 +1777,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x3f0; + 0x3f8; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -1790,13 +1790,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x434; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x43c; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x3f4; + Thread_double_truncate_round_supported_offset = 0x3fc; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x438; + Thread_service_extension_stream_offset = 0x440; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -1912,7 +1912,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x328; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x34; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x41c; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x424; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0xdc; static constexpr dart::compiler::target::word @@ -1959,21 +1959,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x3f8; + Thread_unboxed_runtime_arg_offset = 0x400; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x30c; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x408; -static constexpr dart::compiler::target::word Thread_random_offset = 0x410; + 0x410; +static constexpr dart::compiler::target::word Thread_random_offset = 0x418; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x418; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x424; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x428; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x420; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x420; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x42c; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x430; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x428; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -2494,7 +2494,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x858; + 0x868; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -2507,13 +2507,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c0; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8d0; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x860; + Thread_double_truncate_round_supported_offset = 0x870; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8c8; + Thread_service_extension_stream_offset = 0x8d8; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -2629,7 +2629,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x6c8; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x68; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x890; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x8a0; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -2676,21 +2676,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x868; + Thread_unboxed_runtime_arg_offset = 0x878; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x690; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x878; -static constexpr dart::compiler::target::word Thread_random_offset = 0x880; + 0x888; +static constexpr dart::compiler::target::word Thread_random_offset = 0x890; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x888; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a0; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8a8; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x898; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x898; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8b0; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8b8; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8a8; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -3216,7 +3216,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x818; + 0x828; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -3229,13 +3229,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc8; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x880; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x890; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x820; + Thread_double_truncate_round_supported_offset = 0x830; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x888; + Thread_service_extension_stream_offset = 0x898; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -3351,7 +3351,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x688; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x70; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x850; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x860; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0x1c0; static constexpr dart::compiler::target::word @@ -3398,7 +3398,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x50; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x828; + Thread_unboxed_runtime_arg_offset = 0x838; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x650; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e8; @@ -3406,14 +3406,14 @@ static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x838; -static constexpr dart::compiler::target::word Thread_random_offset = 0x840; + 0x848; +static constexpr dart::compiler::target::word Thread_random_offset = 0x850; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x260; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x848; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x860; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x868; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x858; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x858; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x870; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x878; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x868; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -3935,7 +3935,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x860; + 0x870; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -3948,13 +3948,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc8; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c8; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8d8; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x868; + Thread_double_truncate_round_supported_offset = 0x878; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8d0; + Thread_service_extension_stream_offset = 0x8e0; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -4070,7 +4070,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x6d0; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x70; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x898; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x8a8; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0x1c0; static constexpr dart::compiler::target::word @@ -4117,7 +4117,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x50; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x870; + Thread_unboxed_runtime_arg_offset = 0x880; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x698; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e8; @@ -4125,14 +4125,14 @@ static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x880; -static constexpr dart::compiler::target::word Thread_random_offset = 0x888; + 0x890; +static constexpr dart::compiler::target::word Thread_random_offset = 0x898; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x260; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x890; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a8; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8b0; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8b8; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8c0; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8b0; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -4654,7 +4654,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x424; + 0x42c; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -4667,13 +4667,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x46c; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x474; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x428; + Thread_double_truncate_round_supported_offset = 0x430; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x470; + Thread_service_extension_stream_offset = 0x478; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -4789,7 +4789,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x35c; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x34; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x454; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x45c; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0xdc; static constexpr dart::compiler::target::word @@ -4836,21 +4836,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x430; + Thread_unboxed_runtime_arg_offset = 0x438; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x340; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x440; -static constexpr dart::compiler::target::word Thread_random_offset = 0x448; + 0x448; +static constexpr dart::compiler::target::word Thread_random_offset = 0x450; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x450; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x45c; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x460; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x458; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x458; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x464; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x468; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x460; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -5373,7 +5373,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x848; + 0x858; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -5386,13 +5386,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8b0; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c0; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x850; + Thread_double_truncate_round_supported_offset = 0x860; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8b8; + Thread_service_extension_stream_offset = 0x8c8; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -5508,7 +5508,7 @@ static constexpr dart::compiler::target::word Thread_safepoint_state_offset = 0x6b8; static constexpr dart::compiler::target::word Thread_shared_field_table_values_offset = 0x68; -static constexpr dart::compiler::target::word Thread_single_step_offset = 0x880; +static constexpr dart::compiler::target::word Thread_single_step_offset = 0x890; static constexpr dart::compiler::target::word Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -5555,21 +5555,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x858; + Thread_unboxed_runtime_arg_offset = 0x868; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x680; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x868; -static constexpr dart::compiler::target::word Thread_random_offset = 0x870; + 0x878; +static constexpr dart::compiler::target::word Thread_random_offset = 0x880; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x878; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x890; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x898; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x888; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x888; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8a8; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x898; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -6085,7 +6085,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x3fc; + 0x404; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -6098,13 +6098,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x444; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x44c; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x400; + Thread_double_truncate_round_supported_offset = 0x408; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x448; + Thread_service_extension_stream_offset = 0x450; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -6266,21 +6266,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x408; + Thread_unboxed_runtime_arg_offset = 0x410; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x318; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x418; -static constexpr dart::compiler::target::word Thread_random_offset = 0x420; + 0x420; +static constexpr dart::compiler::target::word Thread_random_offset = 0x428; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x428; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x434; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x438; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x430; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x430; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x43c; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x440; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x438; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -6795,7 +6795,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x810; + 0x820; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -6808,13 +6808,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x878; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x888; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x818; + Thread_double_truncate_round_supported_offset = 0x828; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x880; + Thread_service_extension_stream_offset = 0x890; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -6976,21 +6976,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x820; + Thread_unboxed_runtime_arg_offset = 0x830; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x648; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x830; -static constexpr dart::compiler::target::word Thread_random_offset = 0x838; + 0x840; +static constexpr dart::compiler::target::word Thread_random_offset = 0x848; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x840; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x858; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x860; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x850; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x850; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x868; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x870; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x860; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -7505,7 +7505,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x3f0; + 0x3f8; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -7518,13 +7518,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x434; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x43c; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x3f4; + Thread_double_truncate_round_supported_offset = 0x3fc; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x438; + Thread_service_extension_stream_offset = 0x440; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -7686,21 +7686,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x3f8; + Thread_unboxed_runtime_arg_offset = 0x400; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x30c; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x408; -static constexpr dart::compiler::target::word Thread_random_offset = 0x410; + 0x410; +static constexpr dart::compiler::target::word Thread_random_offset = 0x418; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x418; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x424; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x428; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x420; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x420; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x42c; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x430; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x428; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -8214,7 +8214,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x858; + 0x868; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -8227,13 +8227,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c0; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8d0; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x860; + Thread_double_truncate_round_supported_offset = 0x870; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8c8; + Thread_service_extension_stream_offset = 0x8d8; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -8395,21 +8395,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x868; + Thread_unboxed_runtime_arg_offset = 0x878; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x690; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x878; -static constexpr dart::compiler::target::word Thread_random_offset = 0x880; + 0x888; +static constexpr dart::compiler::target::word Thread_random_offset = 0x890; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x888; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a0; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8a8; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x898; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x898; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8b0; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8b8; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8a8; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -8928,7 +8928,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x818; + 0x828; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -8941,13 +8941,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc8; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x880; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x890; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x820; + Thread_double_truncate_round_supported_offset = 0x830; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x888; + Thread_service_extension_stream_offset = 0x898; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -9109,7 +9109,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x50; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x828; + Thread_unboxed_runtime_arg_offset = 0x838; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x650; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e8; @@ -9117,14 +9117,14 @@ static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x838; -static constexpr dart::compiler::target::word Thread_random_offset = 0x840; + 0x848; +static constexpr dart::compiler::target::word Thread_random_offset = 0x850; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x260; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x848; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x860; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x868; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x858; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x858; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x870; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x878; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x868; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -9639,7 +9639,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x860; + 0x870; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -9652,13 +9652,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc8; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c8; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8d8; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x868; + Thread_double_truncate_round_supported_offset = 0x878; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8d0; + Thread_service_extension_stream_offset = 0x8e0; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -9820,7 +9820,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x50; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x870; + Thread_unboxed_runtime_arg_offset = 0x880; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x698; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e8; @@ -9828,14 +9828,14 @@ static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x880; -static constexpr dart::compiler::target::word Thread_random_offset = 0x888; + 0x890; +static constexpr dart::compiler::target::word Thread_random_offset = 0x898; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x260; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x890; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a8; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8b0; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8b8; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8c0; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x8b0; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -10350,7 +10350,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x424; + 0x42c; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -10363,13 +10363,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0xf8; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0x60; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x46c; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x474; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x428; + Thread_double_truncate_round_supported_offset = 0x430; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x470; + Thread_service_extension_stream_offset = 0x478; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -10531,21 +10531,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x24; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x430; + Thread_unboxed_runtime_arg_offset = 0x438; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x340; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x440; -static constexpr dart::compiler::target::word Thread_random_offset = 0x448; + 0x448; +static constexpr dart::compiler::target::word Thread_random_offset = 0x450; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x12c; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x450; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x45c; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x460; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x458; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x458; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x464; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x468; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x460; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -11061,7 +11061,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word Thread_api_top_scope_offset = - 0x848; + 0x858; static constexpr dart::compiler::target::word Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -11074,13 +11074,13 @@ static constexpr dart::compiler::target::word Thread_call_to_runtime_entry_point_offset = 0x1f0; static constexpr dart::compiler::target::word Thread_call_to_runtime_stub_offset = 0xc0; -static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8b0; +static constexpr dart::compiler::target::word Thread_dart_stream_offset = 0x8c0; static constexpr dart::compiler::target::word Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - Thread_double_truncate_round_supported_offset = 0x850; + Thread_double_truncate_round_supported_offset = 0x860; static constexpr dart::compiler::target::word - Thread_service_extension_stream_offset = 0x8b8; + Thread_service_extension_stream_offset = 0x8c8; static constexpr dart::compiler::target::word Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word Thread_optimize_stub_offset = @@ -11242,21 +11242,21 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word Thread_top_offset = 0x48; static constexpr dart::compiler::target::word Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - Thread_unboxed_runtime_arg_offset = 0x858; + Thread_unboxed_runtime_arg_offset = 0x868; static constexpr dart::compiler::target::word Thread_vm_tag_offset = 0x680; static constexpr dart::compiler::target::word Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word Thread_next_task_id_offset = - 0x868; -static constexpr dart::compiler::target::word Thread_random_offset = 0x870; + 0x878; +static constexpr dart::compiler::target::word Thread_random_offset = 0x880; static constexpr dart::compiler::target::word Thread_jump_to_frame_entry_point_offset = 0x258; -static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x878; -static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x890; -static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x898; -static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x888; +static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 0x888; +static constexpr dart::compiler::target::word Thread_current_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word Thread_default_tag_offset = 0x8a8; +static constexpr dart::compiler::target::word Thread_user_tag_offset = 0x898; static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset = @@ -11807,7 +11807,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x3fc; + 0x404; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -11823,13 +11823,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0x60; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x444; + 0x44c; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x400; + AOT_Thread_double_truncate_round_supported_offset = 0x408; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x448; + AOT_Thread_service_extension_stream_offset = 0x450; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -11951,7 +11951,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x34; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x42c; + 0x434; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0xdc; static constexpr dart::compiler::target::word @@ -12002,25 +12002,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x24; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x408; + AOT_Thread_unboxed_runtime_arg_offset = 0x410; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x318; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x418; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x420; + 0x420; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x428; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x12c; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x428; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x434; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x438; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x430; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x43c; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x440; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x438; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -12603,7 +12603,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x810; + 0x820; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -12619,13 +12619,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x878; + 0x888; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x818; + AOT_Thread_double_truncate_round_supported_offset = 0x828; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x880; + AOT_Thread_service_extension_stream_offset = 0x890; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -12747,7 +12747,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x68; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x848; + 0x858; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -12798,25 +12798,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x820; + AOT_Thread_unboxed_runtime_arg_offset = 0x830; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x648; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x830; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x838; + 0x840; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x848; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x840; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x858; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x860; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x850; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x868; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x870; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x860; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -13406,7 +13406,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x858; + 0x868; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -13422,13 +13422,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8c0; + 0x8d0; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x860; + AOT_Thread_double_truncate_round_supported_offset = 0x870; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8c8; + AOT_Thread_service_extension_stream_offset = 0x8d8; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -13550,7 +13550,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x68; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x890; + 0x8a0; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -13601,25 +13601,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x868; + AOT_Thread_unboxed_runtime_arg_offset = 0x878; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x690; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x878; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x880; + 0x888; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x890; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x888; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x8a0; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x8a8; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x898; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8b0; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8b8; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x8a8; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -14205,7 +14205,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x818; + 0x828; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -14221,13 +14221,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc8; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x880; + 0x890; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x820; + AOT_Thread_double_truncate_round_supported_offset = 0x830; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x888; + AOT_Thread_service_extension_stream_offset = 0x898; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -14349,7 +14349,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x70; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x850; + 0x860; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0x1c0; static constexpr dart::compiler::target::word @@ -14400,7 +14400,7 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x50; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x828; + AOT_Thread_unboxed_runtime_arg_offset = 0x838; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x650; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e8; @@ -14409,18 +14409,18 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x838; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x840; + 0x848; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x850; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x260; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x848; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x860; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x868; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x858; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x870; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x878; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x868; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -15004,7 +15004,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x860; + 0x870; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -15020,13 +15020,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc8; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8c8; + 0x8d8; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x868; + AOT_Thread_double_truncate_round_supported_offset = 0x878; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8d0; + AOT_Thread_service_extension_stream_offset = 0x8e0; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -15148,7 +15148,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x70; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x898; + 0x8a8; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0x1c0; static constexpr dart::compiler::target::word @@ -15199,7 +15199,7 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x50; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x870; + AOT_Thread_unboxed_runtime_arg_offset = 0x880; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x698; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e8; @@ -15208,18 +15208,18 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x880; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x888; + 0x890; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x898; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x260; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x890; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x8a8; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x8b0; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8b8; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8c0; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x8b0; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -15805,7 +15805,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x424; + 0x42c; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -15821,13 +15821,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0x60; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x46c; + 0x474; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x428; + AOT_Thread_double_truncate_round_supported_offset = 0x430; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x470; + AOT_Thread_service_extension_stream_offset = 0x478; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -15949,7 +15949,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x34; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x454; + 0x45c; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0xdc; static constexpr dart::compiler::target::word @@ -16000,25 +16000,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x24; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x430; + AOT_Thread_unboxed_runtime_arg_offset = 0x438; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x340; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x440; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x448; + 0x448; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x450; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x12c; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x450; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x45c; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x460; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x458; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x464; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x468; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x460; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -16602,7 +16602,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x848; + 0x858; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -16618,13 +16618,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8b0; + 0x8c0; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x850; + AOT_Thread_double_truncate_round_supported_offset = 0x860; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8b8; + AOT_Thread_service_extension_stream_offset = 0x8c8; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -16746,7 +16746,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_shared_field_table_values_offset = 0x68; static constexpr dart::compiler::target::word AOT_Thread_single_step_offset = - 0x880; + 0x890; static constexpr dart::compiler::target::word AOT_Thread_slow_type_test_stub_offset = 0x1b8; static constexpr dart::compiler::target::word @@ -16797,25 +16797,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x858; + AOT_Thread_unboxed_runtime_arg_offset = 0x868; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x680; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x868; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x870; + 0x878; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x880; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x878; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x890; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x898; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x888; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8a0; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8a8; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x898; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -17393,7 +17393,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x3fc; + 0x404; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -17409,13 +17409,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0x60; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x444; + 0x44c; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x400; + AOT_Thread_double_truncate_round_supported_offset = 0x408; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x448; + AOT_Thread_service_extension_stream_offset = 0x450; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -17586,25 +17586,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x24; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x408; + AOT_Thread_unboxed_runtime_arg_offset = 0x410; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x318; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x418; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x420; + 0x420; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x428; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x12c; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x428; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x434; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x438; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x430; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x43c; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x440; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x438; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -18180,7 +18180,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x810; + 0x820; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -18196,13 +18196,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x878; + 0x888; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x818; + AOT_Thread_double_truncate_round_supported_offset = 0x828; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x880; + AOT_Thread_service_extension_stream_offset = 0x890; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -18373,25 +18373,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x820; + AOT_Thread_unboxed_runtime_arg_offset = 0x830; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x648; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x830; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x838; + 0x840; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x848; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x840; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x858; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x860; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x850; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x868; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x870; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x860; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -18974,7 +18974,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x858; + 0x868; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -18990,13 +18990,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8c0; + 0x8d0; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x860; + AOT_Thread_double_truncate_round_supported_offset = 0x870; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8c8; + AOT_Thread_service_extension_stream_offset = 0x8d8; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -19167,25 +19167,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x868; + AOT_Thread_unboxed_runtime_arg_offset = 0x878; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x690; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x878; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x880; + 0x888; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x890; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x888; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x8a0; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x8a8; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x898; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8b0; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8b8; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x8a8; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -19764,7 +19764,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x818; + 0x828; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -19780,13 +19780,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc8; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x880; + 0x890; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x820; + AOT_Thread_double_truncate_round_supported_offset = 0x830; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x888; + AOT_Thread_service_extension_stream_offset = 0x898; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -19957,7 +19957,7 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x50; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x828; + AOT_Thread_unboxed_runtime_arg_offset = 0x838; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x650; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e8; @@ -19966,18 +19966,18 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x838; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x840; + 0x848; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x850; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x260; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x848; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x860; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x868; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x858; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x870; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x878; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x868; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -20554,7 +20554,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x220; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x860; + 0x870; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x150; static constexpr dart::compiler::target::word @@ -20570,13 +20570,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc8; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8c8; + 0x8d8; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x60; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x868; + AOT_Thread_double_truncate_round_supported_offset = 0x878; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8d0; + AOT_Thread_service_extension_stream_offset = 0x8e0; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x248; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -20747,7 +20747,7 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x50; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x870; + AOT_Thread_unboxed_runtime_arg_offset = 0x880; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x698; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e8; @@ -20756,18 +20756,18 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x880; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x888; + 0x890; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x898; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x260; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x890; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x8a8; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x8b0; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x8a0; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8b8; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8c0; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x8b0; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -21346,7 +21346,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x10c; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x424; + 0x42c; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0xa4; static constexpr dart::compiler::target::word @@ -21362,13 +21362,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0x60; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x46c; + 0x474; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x2c; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x428; + AOT_Thread_double_truncate_round_supported_offset = 0x430; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x470; + AOT_Thread_service_extension_stream_offset = 0x478; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x120; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -21539,25 +21539,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x24; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x10; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x430; + AOT_Thread_unboxed_runtime_arg_offset = 0x438; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x340; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0xf0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x20; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x440; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x448; + 0x448; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x450; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x12c; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x450; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x45c; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x460; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x458; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x464; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x468; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x460; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word @@ -22134,7 +22134,7 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_allocate_object_slow_entry_point_offset = 0x218; static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset = - 0x848; + 0x858; static constexpr dart::compiler::target::word AOT_Thread_async_exception_handler_stub_offset = 0x148; static constexpr dart::compiler::target::word @@ -22150,13 +22150,13 @@ static constexpr dart::compiler::target::word static constexpr dart::compiler::target::word AOT_Thread_call_to_runtime_stub_offset = 0xc0; static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset = - 0x8b0; + 0x8c0; static constexpr dart::compiler::target::word AOT_Thread_dispatch_table_array_offset = 0x58; static constexpr dart::compiler::target::word - AOT_Thread_double_truncate_round_supported_offset = 0x850; + AOT_Thread_double_truncate_round_supported_offset = 0x860; static constexpr dart::compiler::target::word - AOT_Thread_service_extension_stream_offset = 0x8b8; + AOT_Thread_service_extension_stream_offset = 0x8c8; static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset = 0x240; static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset = @@ -22327,25 +22327,25 @@ static constexpr dart::compiler::target::word AOT_Thread_top_offset = 0x48; static constexpr dart::compiler::target::word AOT_Thread_top_resource_offset = 0x20; static constexpr dart::compiler::target::word - AOT_Thread_unboxed_runtime_arg_offset = 0x858; + AOT_Thread_unboxed_runtime_arg_offset = 0x868; static constexpr dart::compiler::target::word AOT_Thread_vm_tag_offset = 0x680; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_entry_point_offset = 0x1e0; static constexpr dart::compiler::target::word AOT_Thread_write_barrier_mask_offset = 0x40; static constexpr dart::compiler::target::word AOT_Thread_next_task_id_offset = - 0x868; -static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x870; + 0x878; +static constexpr dart::compiler::target::word AOT_Thread_random_offset = 0x880; static constexpr dart::compiler::target::word AOT_Thread_jump_to_frame_entry_point_offset = 0x258; static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset = - 0x878; -static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = - 0x890; -static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = - 0x898; -static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = 0x888; +static constexpr dart::compiler::target::word AOT_Thread_current_tag_offset = + 0x8a0; +static constexpr dart::compiler::target::word AOT_Thread_default_tag_offset = + 0x8a8; +static constexpr dart::compiler::target::word AOT_Thread_user_tag_offset = + 0x898; static constexpr dart::compiler::target::word AOT_TsanUtils_setjmp_function_offset = 0x0; static constexpr dart::compiler::target::word diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc index 8b951166f56..300b7262b6b 100644 --- a/runtime/vm/compiler/stub_code_compiler.cc +++ b/runtime/vm/compiler/stub_code_compiler.cc @@ -123,7 +123,13 @@ void StubCodeCompiler::GenerateInitLateStaticFieldStub(bool is_final, // Load a GC-safe value for the arguments descriptor (unused but tagged). __ LoadImmediate(ARGS_DESC_REG, 0); } + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } __ Call(FieldAddress(FUNCTION_REG, target::Function::entry_point_offset())); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ MoveRegister(kResultReg, CallingConventions::kReturnReg); __ PopRegister(kFieldReg); __ LoadStaticFieldAddress(kAddressReg, kFieldReg, kScratchReg, is_shared); @@ -225,7 +231,13 @@ void StubCodeCompiler::GenerateInitLateInstanceFieldStub(bool is_final) { __ LoadImmediate(ARGS_DESC_REG, 0); #endif // defined(DART_DYNAMIC_MODULES) } + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } __ Call(FieldAddress(FUNCTION_REG, target::Function::entry_point_offset())); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ Drop(1); // Drop argument. __ PopRegisterPair(kInstanceReg, kFieldReg); @@ -1861,7 +1873,13 @@ static void CallDartCoreLibraryFunction( intptr_t function_offset_in_object_store, bool uses_args_desc = false) { if (FLAG_precompiled_mode) { + if (FLAG_target_thread_sanitizer) { + __ TsanFuncEntry(); + } __ Call(Address(THR, entry_point_offset_in_thread)); + if (FLAG_target_thread_sanitizer) { + __ TsanFuncExit(); + } } else { __ LoadIsolateGroup(FUNCTION_REG); __ LoadFromOffset(FUNCTION_REG, FUNCTION_REG, @@ -2135,6 +2153,9 @@ void StubCodeCompiler::GenerateSuspendStub( __ LeaveStubFrame(); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } #if !defined(TARGET_ARCH_X64) && !defined(TARGET_ARCH_IA32) // Drop caller frame on all architectures except x86 (X64/IA32) which // needs to maintain call/return balance to avoid performance regressions. @@ -2310,6 +2331,9 @@ void StubCodeCompiler::GenerateResumeStub() { // ... [SuspendState] [value] [exception] [stackTrace] [ReturnAddress] __ EnterDartFrame(0); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncEntry(); + } const intptr_t param_offset = target::frame_layout.param_end_from_fp * target::kWordSize; @@ -2522,6 +2546,9 @@ void StubCodeCompiler::GenerateReturnStub( __ Bind(&okay); } #endif + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); if (!FLAG_precompiled_mode) { __ LoadFromOffset(CODE_REG, THR, return_stub_offset_in_thread); @@ -2574,6 +2601,9 @@ void StubCodeCompiler::GenerateAsyncExceptionHandlerStub() { __ CompareObject(kSuspendState, NullObject()); __ BranchIf(EQUAL, &rethrow_exception); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); if (!FLAG_precompiled_mode) { __ LoadFromOffset(CODE_REG, THR, @@ -2595,6 +2625,9 @@ void StubCodeCompiler::GenerateAsyncExceptionHandlerStub() { #endif __ Comment("Rethrow exception"); __ Bind(&rethrow_exception); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + __ TsanFuncExit(); + } __ LeaveDartFrame(); if (!FLAG_precompiled_mode) { __ LoadFromOffset(CODE_REG, THR, diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc index 47b12261196..861fedb7f64 100644 --- a/runtime/vm/compiler/stub_code_compiler_arm64.cc +++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc @@ -3463,10 +3463,32 @@ void StubCodeCompiler::GenerateJumpToFrameStub() { ASSERT(kExceptionObjectReg == R0); ASSERT(kStackTraceObjectReg == R1); __ set_lr_state(compiler::LRState::Clobbered()); + __ mov(THR, R3); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + Label again, done; + __ mov(SP, CSP); + __ ldr(CALLEE_SAVED_TEMP, + Address(R3, target::Thread::top_exit_frame_info_offset())); + // Skip CallToRuntime/CallNativeWithWrapper stub frame, which did not call + // __tsan_func_entry. + __ ldr(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ Bind(&again); + __ cmp(CALLEE_SAVED_TEMP, Operand(R2)); + __ b(&done, EQUAL); + __ TsanFuncExit(); + __ ldr(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ b(&again); + __ Bind(&done); + } __ mov(CALLEE_SAVED_TEMP, R0); // Program counter. __ mov(SP, R1); // Stack pointer. __ mov(FP, R2); // Frame_pointer. - __ mov(THR, R3); __ SetupCSPFromThread(THR); #if defined(DART_TARGET_OS_FUCHSIA) // We need to restore the shadow call stack pointer like longjmp would, diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc index 45f698d2abf..c361e5d0fd5 100644 --- a/runtime/vm/compiler/stub_code_compiler_riscv.cc +++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc @@ -2961,10 +2961,30 @@ void StubCodeCompiler::GenerateGetCStackPointerStub() { void StubCodeCompiler::GenerateJumpToFrameStub() { ASSERT(kExceptionObjectReg == A0); ASSERT(kStackTraceObjectReg == A1); + __ mv(THR, A3); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + Label again, done; + __ lx(CALLEE_SAVED_TEMP, + Address(THR, target::Thread::top_exit_frame_info_offset())); + // Skip CallToRuntime/CallNativeWithWrapper stub frame, which did not call + // __tsan_func_entry. + __ lx(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ Bind(&again); + __ beq(CALLEE_SAVED_TEMP, A2, &done); + __ TsanFuncExit(); + __ lx(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ j(&again); + __ Bind(&done); + } __ mv(CALLEE_SAVED_TEMP, A0); // Program counter. __ mv(SP, A1); // Stack pointer. __ mv(FP, A2); // Frame_pointer. - __ mv(THR, A3); #if defined(DART_TARGET_OS_FUCHSIA) || defined(DART_TARGET_OS_ANDROID) // We need to restore the shadow call stack pointer like longjmp would, // effectively popping all the return addresses between the Dart exit frame diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc index 943a581e935..94c454af22f 100644 --- a/runtime/vm/compiler/stub_code_compiler_x64.cc +++ b/runtime/vm/compiler/stub_code_compiler_x64.cc @@ -3443,6 +3443,27 @@ void StubCodeCompiler::GenerateGetCStackPointerStub() { // No Result. void StubCodeCompiler::GenerateJumpToFrameStub() { __ movq(THR, CallingConventions::kArg4Reg); + if (FLAG_target_thread_sanitizer && FLAG_precompiled_mode) { + Label again, done; + __ movq(CALLEE_SAVED_TEMP, + Address(THR, target::Thread::top_exit_frame_info_offset())); + // Skip CallToRuntime/CallNativeWithWrapper stub frame, which did not call + // __tsan_func_entry. + __ movq(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ Bind(&again); + __ cmpq(CALLEE_SAVED_TEMP, CallingConventions::kArg3Reg); + __ j(EQUAL, &done); + __ TsanFuncExit(); + __ movq(CALLEE_SAVED_TEMP, + Address(CALLEE_SAVED_TEMP, + target::frame_layout.saved_caller_fp_from_fp * + target::kWordSize)); + __ jmp(&again); + __ Bind(&done); + } __ movq(RBP, CallingConventions::kArg3Reg); __ movq(RSP, CallingConventions::kArg2Reg); #if defined(USING_SHADOW_CALL_STACK) diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc index 922339cb2b6..1e7dd744c1f 100644 --- a/runtime/vm/runtime_entry.cc +++ b/runtime/vm/runtime_entry.cc @@ -5191,6 +5191,12 @@ extern "C" void __tsan_write8(void* addr) { extern "C" void __tsan_write16(void* addr) { UNREACHABLE(); } +extern "C" void __tsan_func_entry(void* pc) { + UNREACHABLE(); +} +extern "C" void __tsan_func_exit() { + UNREACHABLE(); +} #endif // These runtime entries are defined even when not using MSAN / TSAN to keep @@ -5212,5 +5218,7 @@ DEFINE_LEAF_RUNTIME_ENTRY(TsanWrite2, 1, __tsan_write2); DEFINE_LEAF_RUNTIME_ENTRY(TsanWrite4, 1, __tsan_write4); DEFINE_LEAF_RUNTIME_ENTRY(TsanWrite8, 1, __tsan_write8); DEFINE_LEAF_RUNTIME_ENTRY(TsanWrite16, 1, __tsan_write16); +DEFINE_LEAF_RUNTIME_ENTRY(TsanFuncEntry, 1, __tsan_func_entry); +DEFINE_LEAF_RUNTIME_ENTRY(TsanFuncExit, 0, __tsan_func_exit); } // namespace dart diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h index d95a8eb82a1..72c5e6cb4c6 100644 --- a/runtime/vm/runtime_entry_list.h +++ b/runtime/vm/runtime_entry_list.h @@ -142,6 +142,8 @@ namespace dart { V(void, TsanWrite4, void*) \ V(void, TsanWrite8, void*) \ V(void, TsanWrite16, void*) \ + V(void, TsanFuncEntry, void*) \ + V(void, TsanFuncExit) \ V(bool, TryDoubleAsInteger, Thread*) \ V(void*, MemoryMove, void*, const void*, size_t) diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json index d0819ffda6e..bb417284565 100644 --- a/tools/bots/test_matrix.json +++ b/tools/bots/test_matrix.json @@ -1465,7 +1465,7 @@ "standalone" ], "fileset": "vm", - "shards": 2 + "shards": 3 } ] },