Files
sdk/runtime/vm/stub_code_list.h
T
Vyacheslav Egorov 8085a97a63 [vm] Fix JumpToFrame execution state transition
Instead of handling FFI related execution state and safepoint
in assembly handle it in runtime code.

The transition needs to be done before JumpToFrame unwinds
stack because unwinding destroys exit frame and this can't
be done at safepoint as GC might be traversing the stack.

An incorrect order of operation was manifesting as crashes in
GC when one isolate in a group was encountering a lot of
exceptions thrown from an FFI call and another isolate is
triggering GCs.

To catch this in the future added a bit of validation to
ExitSafepoint runtime call which triggers when --use-slow-path
is enabled. Though after refactoring this code does not
trigger this code path anymore because it was completely
removed - but it is better than nothing.

This CL also removes a lot of unnecessary complexity which
was associated with handling this transition in the stub
itself.

TEST=ffi/vmspecific_handle_test

Bug: b/408377905
Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-asan-linux-release-x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-msan-linux-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-aot-ubsan-linux-release-x64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-arm64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-mac-debug-simarm64_arm64-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-arm64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-tsan-linux-release-arm64-try,vm-tsan-linux-release-x64-try,vm-ubsan-linux-release-arm64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try
Change-Id: Ia073cb6bb9e1b5a0ea8514c7e048cee6019b84d6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/420324
Commit-Queue: Slava Egorov <vegorov@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2025-04-07 05:22:56 -07:00

197 lines
14 KiB
C++

// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_VM_STUB_CODE_LIST_H_
#define RUNTIME_VM_STUB_CODE_LIST_H_
namespace dart {
#define VM_TYPE_TESTING_STUB_CODE_LIST(V) \
V(DefaultTypeTest) \
V(DefaultNullableTypeTest) \
V(TopTypeTypeTest) \
V(UnreachableTypeTest) \
V(TypeParameterTypeTest) \
V(NullableTypeParameterTypeTest) \
V(SlowTypeTest) \
V(LazySpecializeTypeTest) \
V(LazySpecializeNullableTypeTest)
#if (defined(DART_TARGET_OS_LINUX) || defined(DART_TARGET_OS_ANDROID)) && \
(defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64))
// Currently we support probe points only Linux and Android (X64 and ARM64).
#define DART_TARGET_SUPPORTS_PROBE_POINTS 1
#endif
#define PROBE_POINT_STUBS_LIST(V) V(AllocationProbePoint)
// List of stubs created in the VM isolate, these stubs are shared by different
// isolates running in this dart process.
#define VM_STUB_CODE_LIST(V) \
V(GetCStackPointer) \
V(JumpToFrame) \
V(RunExceptionHandler) \
V(RunExceptionHandlerUnbox) \
V(DeoptForRewind) \
V(WriteBarrier) \
V(WriteBarrierWrappers) \
V(ArrayWriteBarrier) \
PROBE_POINT_STUBS_LIST(V) \
V(AllocateArray) \
V(AllocateMint) \
V(AllocateDouble) \
V(AllocateFloat32x4) \
V(AllocateFloat64x2) \
V(AllocateInt32x4) \
V(AllocateInt8Array) \
V(AllocateUint8Array) \
V(AllocateUint8ClampedArray) \
V(AllocateInt16Array) \
V(AllocateUint16Array) \
V(AllocateInt32Array) \
V(AllocateUint32Array) \
V(AllocateInt64Array) \
V(AllocateUint64Array) \
V(AllocateFloat32Array) \
V(AllocateFloat64Array) \
V(AllocateFloat32x4Array) \
V(AllocateInt32x4Array) \
V(AllocateFloat64x2Array) \
V(AllocateMintSharedWithFPURegs) \
V(AllocateMintSharedWithoutFPURegs) \
V(AllocateClosure) \
V(AllocateClosureGeneric) \
V(AllocateClosureTA) \
V(AllocateClosureTAGeneric) \
V(AllocateContext) \
V(AllocateGrowableArray) \
V(AllocateObject) \
V(AllocateObjectParameterized) \
V(AllocateObjectSlow) \
V(AllocateRecord) \
V(AllocateRecord2) \
V(AllocateRecord2Named) \
V(AllocateRecord3) \
V(AllocateRecord3Named) \
V(AllocateUnhandledException) \
V(BoxDouble) \
V(BoxFloat32x4) \
V(BoxFloat64x2) \
V(CloneContext) \
V(CallToRuntime) \
V(LazyCompile) \
V(InterpretCall) \
V(ResumeInterpreter) \
V(CallBootstrapNative) \
V(CallNoScopeNative) \
V(CallAutoScopeNative) \
V(FixCallersTarget) \
V(CallStaticFunction) \
V(OptimizeFunction) \
V(InvokeDartCode) \
V(InvokeDartCodeFromBytecode) \
V(DebugStepCheck) \
V(SwitchableCallMiss) \
V(MonomorphicSmiableCheck) \
V(SingleTargetCall) \
V(ICCallThroughCode) \
V(MegamorphicCall) \
V(FixAllocationStubTarget) \
V(FixParameterizedAllocationStubTarget) \
V(Deoptimize) \
V(DeoptimizeLazyFromReturn) \
V(DeoptimizeLazyFromThrow) \
V(UnoptimizedIdenticalWithNumberCheck) \
V(OptimizedIdenticalWithNumberCheck) \
V(ICCallBreakpoint) \
V(UnoptStaticCallBreakpoint) \
V(RuntimeCallBreakpoint) \
V(OneArgCheckInlineCache) \
V(TwoArgsCheckInlineCache) \
V(SmiAddInlineCache) \
V(SmiLessInlineCache) \
V(SmiEqualInlineCache) \
V(OneArgOptimizedCheckInlineCache) \
V(TwoArgsOptimizedCheckInlineCache) \
V(ZeroArgsUnoptimizedStaticCall) \
V(OneArgUnoptimizedStaticCall) \
V(TwoArgsUnoptimizedStaticCall) \
V(AssertSubtype) \
V(AssertAssignable) \
V(TypeIsTopTypeForSubtyping) \
V(NullIsAssignableToType) \
V(Subtype1TestCache) \
V(Subtype2TestCache) \
V(Subtype3TestCache) \
V(Subtype4TestCache) \
V(Subtype6TestCache) \
V(Subtype7TestCache) \
VM_TYPE_TESTING_STUB_CODE_LIST(V) \
V(CallClosureNoSuchMethod) \
V(FrameAwaitingMaterialization) \
V(AsynchronousGapMarker) \
V(NotLoaded) \
V(DispatchTableNullError) \
V(LateInitializationErrorSharedWithFPURegs) \
V(LateInitializationErrorSharedWithoutFPURegs) \
V(NullErrorSharedWithFPURegs) \
V(NullErrorSharedWithoutFPURegs) \
V(NullArgErrorSharedWithFPURegs) \
V(NullArgErrorSharedWithoutFPURegs) \
V(NullCastErrorSharedWithFPURegs) \
V(NullCastErrorSharedWithoutFPURegs) \
V(RangeErrorSharedWithFPURegs) \
V(RangeErrorSharedWithoutFPURegs) \
V(WriteErrorSharedWithFPURegs) \
V(WriteErrorSharedWithoutFPURegs) \
V(StackOverflowSharedWithFPURegs) \
V(StackOverflowSharedWithoutFPURegs) \
V(DoubleToInteger) \
V(OneArgCheckInlineCacheWithExactnessCheck) \
V(OneArgOptimizedCheckInlineCacheWithExactnessCheck) \
V(EnterSafepoint) \
V(ExitSafepoint) \
V(CallNativeThroughSafepoint) \
V(FfiCallbackTrampoline) \
V(InitStaticField) \
V(InitLateStaticField) \
V(InitLateFinalStaticField) \
V(InitInstanceField) \
V(InitLateInstanceField) \
V(InitLateFinalInstanceField) \
V(InitSharedLateStaticField) \
V(InitSharedLateFinalStaticField) \
V(Throw) \
V(ReThrow) \
V(InstanceOf) \
V(InstantiateType) \
V(InstantiateTypeNonNullableClassTypeParameter) \
V(InstantiateTypeNullableClassTypeParameter) \
V(InstantiateTypeNonNullableFunctionTypeParameter) \
V(InstantiateTypeNullableFunctionTypeParameter) \
V(InstantiateTypeArguments) \
V(InstantiateTypeArgumentsMayShareInstantiatorTA) \
V(InstantiateTypeArgumentsMayShareFunctionTA) \
V(NoSuchMethodDispatcher) \
V(Await) \
V(AwaitWithTypeCheck) \
V(InitAsync) \
V(Resume) \
V(ReturnAsync) \
V(ReturnAsyncNotFuture) \
V(InitAsyncStar) \
V(YieldAsyncStar) \
V(ReturnAsyncStar) \
V(InitSyncStar) \
V(SuspendSyncStarAtStart) \
V(SuspendSyncStarAtYield) \
V(AsyncExceptionHandler) \
V(CloneSuspendState) \
V(FfiAsyncCallbackSend) \
V(UnknownDartCode)
} // namespace dart
#endif // RUNTIME_VM_STUB_CODE_LIST_H_