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; |
} |