| Index: src/compiler/linkage.cc
|
| diff --git a/src/compiler/linkage.cc b/src/compiler/linkage.cc
|
| index 4d3187506ace5dd7323bc8050255301ea2edfd4a..87c6ee8a4fdf5da97b6e8214caaf9fcbb4204bc4 100644
|
| --- a/src/compiler/linkage.cc
|
| +++ b/src/compiler/linkage.cc
|
| @@ -120,114 +120,49 @@ bool Linkage::NeedsFrameState(Runtime::FunctionId function) {
|
| if (!FLAG_turbo_deoptimization) {
|
| return false;
|
| }
|
| - // TODO(jarin) At the moment, we only add frame state for
|
| - // few chosen runtime functions.
|
| +
|
| + // Most runtime functions need a FrameState. A few chosen ones that we know
|
| + // not to call into arbitrary JavaScript, not to throw, and not to deoptimize
|
| + // are blacklisted here and can be called without a FrameState.
|
| switch (function) {
|
| - case Runtime::kApply:
|
| - case Runtime::kArrayBufferNeuter:
|
| - case Runtime::kArrayConcat:
|
| - case Runtime::kBasicJSONStringify:
|
| - case Runtime::kCheckExecutionState:
|
| - case Runtime::kCollectStackTrace:
|
| - case Runtime::kCompileLazy:
|
| - case Runtime::kCompileOptimized:
|
| - case Runtime::kCompileString:
|
| - case Runtime::kCreateArrayLiteral:
|
| - case Runtime::kCreateObjectLiteral:
|
| - case Runtime::kDebugBreak:
|
| - case Runtime::kDataViewSetInt8:
|
| - case Runtime::kDataViewSetUint8:
|
| - case Runtime::kDataViewSetInt16:
|
| - case Runtime::kDataViewSetUint16:
|
| - case Runtime::kDataViewSetInt32:
|
| - case Runtime::kDataViewSetUint32:
|
| - case Runtime::kDataViewSetFloat32:
|
| - case Runtime::kDataViewSetFloat64:
|
| - case Runtime::kDataViewGetInt8:
|
| - case Runtime::kDataViewGetUint8:
|
| - case Runtime::kDataViewGetInt16:
|
| - case Runtime::kDataViewGetUint16:
|
| - case Runtime::kDataViewGetInt32:
|
| - case Runtime::kDataViewGetUint32:
|
| - case Runtime::kDataViewGetFloat32:
|
| - case Runtime::kDataViewGetFloat64:
|
| - case Runtime::kDebugEvaluate:
|
| - case Runtime::kDebugEvaluateGlobal:
|
| - case Runtime::kDebugGetLoadedScripts:
|
| - case Runtime::kDebugGetPropertyDetails:
|
| - case Runtime::kDebugPromiseEvent:
|
| - case Runtime::kDefaultConstructorSuperCall:
|
| - case Runtime::kDefineAccessorPropertyUnchecked:
|
| - case Runtime::kDefineClass:
|
| - case Runtime::kDefineDataPropertyUnchecked:
|
| - case Runtime::kDeleteProperty:
|
| - case Runtime::kDeliverObservationChangeRecords:
|
| - case Runtime::kDeoptimizeFunction:
|
| - case Runtime::kFunctionBindArguments:
|
| - case Runtime::kGetDefaultReceiver:
|
| - case Runtime::kGetFrameCount:
|
| - case Runtime::kGetOwnProperty:
|
| - case Runtime::kGetOwnPropertyNames:
|
| - case Runtime::kGetPropertyNamesFast:
|
| - case Runtime::kGetPrototype:
|
| + case Runtime::kBooleanize:
|
| + case Runtime::kDeclareGlobals: // TODO(jarin): Is it safe?
|
| + case Runtime::kDefineClassMethod: // TODO(jarin): Is it safe?
|
| + case Runtime::kDefineGetterPropertyUnchecked: // TODO(jarin): Is it safe?
|
| + case Runtime::kDefineSetterPropertyUnchecked: // TODO(jarin): Is it safe?
|
| + case Runtime::kForInCacheArrayLength:
|
| + case Runtime::kForInInit:
|
| + case Runtime::kForInNext:
|
| + case Runtime::kNewArguments:
|
| + case Runtime::kNewClosure:
|
| + case Runtime::kNewFunctionContext:
|
| + case Runtime::kPushBlockContext:
|
| + case Runtime::kPushCatchContext:
|
| + case Runtime::kReThrow:
|
| + case Runtime::kSetProperty: // TODO(jarin): Is it safe?
|
| + case Runtime::kStringCompare:
|
| + case Runtime::kStringEquals:
|
| + case Runtime::kToFastProperties: // TODO(jarin): Is it safe?
|
| + case Runtime::kTraceEnter:
|
| + case Runtime::kTraceExit:
|
| + case Runtime::kTypeof:
|
| + return false;
|
| case Runtime::kInlineArguments:
|
| case Runtime::kInlineCallFunction:
|
| case Runtime::kInlineDateField:
|
| case Runtime::kInlineOptimizedGetPrototype:
|
| case Runtime::kInlineRegExpExec:
|
| - case Runtime::kInternalSetPrototype:
|
| - case Runtime::kInterrupt:
|
| - case Runtime::kIsPropertyEnumerable:
|
| - case Runtime::kIsSloppyModeFunction:
|
| - case Runtime::kLiveEditGatherCompileInfo:
|
| - case Runtime::kLoadLookupSlot:
|
| - case Runtime::kLoadLookupSlotNoReferenceError:
|
| - case Runtime::kMaterializeRegExpLiteral:
|
| - case Runtime::kNewObject:
|
| - case Runtime::kNewObjectFromBound:
|
| - case Runtime::kNewObjectWithAllocationSite:
|
| - case Runtime::kObjectFreeze:
|
| - case Runtime::kObjectSeal:
|
| - case Runtime::kOwnKeys:
|
| - case Runtime::kParseJson:
|
| - case Runtime::kPrepareStep:
|
| - case Runtime::kPreventExtensions:
|
| - case Runtime::kPromiseRejectEvent:
|
| - case Runtime::kPromiseRevokeReject:
|
| - case Runtime::kPushWithContext:
|
| - case Runtime::kRegExpInitializeAndCompile:
|
| - case Runtime::kRegExpExecMultiple:
|
| - case Runtime::kResolvePossiblyDirectEval:
|
| - case Runtime::kRunMicrotasks:
|
| - case Runtime::kSetPrototype:
|
| - case Runtime::kSetScriptBreakPoint:
|
| - case Runtime::kSparseJoinWithSeparator:
|
| - case Runtime::kStackGuard:
|
| - case Runtime::kStoreKeyedToSuper_Sloppy:
|
| - case Runtime::kStoreKeyedToSuper_Strict:
|
| - case Runtime::kStoreToSuper_Sloppy:
|
| - case Runtime::kStoreToSuper_Strict:
|
| - case Runtime::kStoreLookupSlot:
|
| - case Runtime::kStringBuilderConcat:
|
| - case Runtime::kStringBuilderJoin:
|
| - case Runtime::kStringMatch:
|
| - case Runtime::kStringReplaceGlobalRegExpWithString:
|
| - case Runtime::kThrowConstAssignError:
|
| - case Runtime::kThrowConstructorNonCallableError:
|
| - case Runtime::kThrowNonMethodError:
|
| - case Runtime::kThrowNotDateError:
|
| - case Runtime::kThrowReferenceError:
|
| - case Runtime::kThrowUnsupportedSuperError:
|
| - case Runtime::kThrow:
|
| - case Runtime::kTypedArraySetFastCases:
|
| - case Runtime::kTypedArrayInitializeFromArrayLike:
|
| -#ifdef V8_I18N_SUPPORT
|
| - case Runtime::kGetImplFromInitializedIntlObject:
|
| -#endif
|
| return true;
|
| default:
|
| - return false;
|
| + break;
|
| }
|
| +
|
| + // Most inlined runtime functions (except the ones listed above) can be called
|
| + // without a FrameState or will be lowered by JSIntrinsicLowering internally.
|
| + const Runtime::Function* const f = Runtime::FunctionForId(function);
|
| + if (f->intrinsic_type == Runtime::IntrinsicType::INLINE) return false;
|
| +
|
| + return true;
|
| }
|
|
|
|
|
|
|