diff options
Diffstat (limited to 'deps/v8/src/interface-descriptors.h')
-rw-r--r-- | deps/v8/src/interface-descriptors.h | 96 |
1 files changed, 73 insertions, 23 deletions
diff --git a/deps/v8/src/interface-descriptors.h b/deps/v8/src/interface-descriptors.h index ee9abac9ea..ae64b05582 100644 --- a/deps/v8/src/interface-descriptors.h +++ b/deps/v8/src/interface-descriptors.h @@ -60,7 +60,7 @@ namespace internal { V(StringAt) \ V(StringSubstring) \ V(GetProperty) \ - V(ArgumentAdaptor) \ + V(ArgumentsAdaptor) \ V(ApiCallback) \ V(ApiGetter) \ V(GrowArrayElements) \ @@ -74,6 +74,7 @@ namespace internal { V(FrameDropperTrampoline) \ V(RunMicrotasks) \ V(WasmGrowMemory) \ + V(WasmThrow) \ V(CloneObjectWithVector) \ BUILTIN_LIST_TFS(V) @@ -211,7 +212,7 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor { typedef CallInterfaceDescriptorData::Flags Flags; CallInterfaceDescriptor() : data_(nullptr) {} - virtual ~CallInterfaceDescriptor() {} + virtual ~CallInterfaceDescriptor() = default; CallInterfaceDescriptor(CallDescriptors::Key key) : data_(CallDescriptors::call_descriptor_data(key)) {} @@ -306,19 +307,32 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor { explicit name() : base(key()) {} \ static inline CallDescriptors::Key key(); -#if defined(V8_TARGET_ARCH_IA32) && defined(V8_EMBEDDED_BUILTINS) -// TODO(jgruber,v8:6666): Keep kRootRegister free unconditionally. +#if defined(V8_TARGET_ARCH_IA32) +// To support all possible cases, we must limit the number of register args for +// TFS builtins on ia32 to 3. Out of the 6 allocatable registers, esi is taken +// as the context register and ebx is the root register. One register must +// remain available to store the jump/call target. Thus 3 registers remain for +// arguments. The reason this applies to TFS builtins specifically is because +// this becomes relevant for builtins used as targets of Torque function +// pointers (which must have a register available to store the target). +// TODO(jgruber): Ideally we should just decrement kMaxBuiltinRegisterParams but +// that comes with its own set of complications. It's possible, but requires +// refactoring the calling convention of other existing stubs. constexpr int kMaxBuiltinRegisterParams = 4; +constexpr int kMaxTFSBuiltinRegisterParams = 3; #else constexpr int kMaxBuiltinRegisterParams = 5; +constexpr int kMaxTFSBuiltinRegisterParams = kMaxBuiltinRegisterParams; #endif +STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams); #define DECLARE_DEFAULT_DESCRIPTOR(name, base) \ DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ protected: \ static const int kRegisterParams = \ - kParameterCount > kMaxBuiltinRegisterParams ? kMaxBuiltinRegisterParams \ - : kParameterCount; \ + kParameterCount > kMaxTFSBuiltinRegisterParams \ + ? kMaxTFSBuiltinRegisterParams \ + : kParameterCount; \ static const int kStackParams = kParameterCount - kRegisterParams; \ void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \ override { \ @@ -428,7 +442,7 @@ class AllocateDescriptor : public CallInterfaceDescriptor { public: DEFINE_PARAMETERS_NO_CONTEXT(kRequestedSize) DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::TaggedPointer(), // result 1 - MachineType::Int32()) // kRequestedSize + MachineType::IntPtr()) // kRequestedSize DECLARE_DESCRIPTOR(AllocateDescriptor, CallInterfaceDescriptor) }; @@ -601,6 +615,15 @@ class LoadWithVectorDescriptor : public LoadDescriptor { DECLARE_DESCRIPTOR(LoadWithVectorDescriptor, LoadDescriptor) static const Register VectorRegister(); + +#if V8_TARGET_ARCH_IA32 + static const bool kPassLastArgsOnStack = true; +#else + static const bool kPassLastArgsOnStack = false; +#endif + + // Pass vector through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0; }; class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor { @@ -611,9 +634,15 @@ class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor { MachineType::AnyTagged()) // kVector DECLARE_DESCRIPTOR(LoadGlobalWithVectorDescriptor, LoadGlobalDescriptor) +#if V8_TARGET_ARCH_IA32 + // On ia32, LoadWithVectorDescriptor passes vector on the stack and thus we + // need to choose a new register here. + static const Register VectorRegister() { return edx; } +#else static const Register VectorRegister() { return LoadWithVectorDescriptor::VectorRegister(); } +#endif }; class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor { @@ -639,10 +668,9 @@ class FastNewObjectDescriptor : public CallInterfaceDescriptor { class RecordWriteDescriptor final : public CallInterfaceDescriptor { public: - DEFINE_PARAMETERS(kObject, kSlot, kIsolate, kRememberedSet, kFPMode) + DEFINE_PARAMETERS(kObject, kSlot, kRememberedSet, kFPMode) DEFINE_PARAMETER_TYPES(MachineType::TaggedPointer(), // kObject MachineType::Pointer(), // kSlot - MachineType::Pointer(), // kIsolate MachineType::TaggedSigned(), // kRememberedSet MachineType::TaggedSigned()) // kFPMode @@ -690,12 +718,12 @@ class CallTrampolineDescriptor : public CallInterfaceDescriptor { class CallVarargsDescriptor : public CallInterfaceDescriptor { public: - DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsList, - kArgumentsLength) + DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsLength, + kArgumentsList) DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget MachineType::Int32(), // kActualArgumentsCount - MachineType::AnyTagged(), // kArgumentsList - MachineType::Int32()) // kArgumentsLength + MachineType::Int32(), // kArgumentsLength + MachineType::AnyTagged()) // kArgumentsList DECLARE_DESCRIPTOR(CallVarargsDescriptor, CallInterfaceDescriptor) }; @@ -727,9 +755,10 @@ class CallWithArrayLikeDescriptor : public CallInterfaceDescriptor { class ConstructVarargsDescriptor : public CallInterfaceDescriptor { public: - DEFINE_JS_PARAMETERS(kArgumentsList, kArgumentsLength) - DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged(), // kArgumentsList - MachineType::Int32()) // kArgumentsLength + DEFINE_JS_PARAMETERS(kArgumentsLength, kArgumentsList) + DEFINE_JS_PARAMETER_TYPES(MachineType::Int32(), // kArgumentsLength + MachineType::AnyTagged()) // kArgumentsList + DECLARE_DESCRIPTOR(ConstructVarargsDescriptor, CallInterfaceDescriptor) }; @@ -759,6 +788,7 @@ class ConstructWithArrayLikeDescriptor : public CallInterfaceDescriptor { // TODO(ishell): consider merging this with ArrayConstructorDescriptor class ConstructStubDescriptor : public CallInterfaceDescriptor { public: + // TODO(jgruber): Remove the unused allocation site parameter. DEFINE_JS_PARAMETERS(kAllocationSite) DEFINE_JS_PARAMETER_TYPES(MachineType::AnyTagged()); @@ -879,11 +909,11 @@ class StringSubstringDescriptor final : public CallInterfaceDescriptor { DECLARE_DESCRIPTOR(StringSubstringDescriptor, CallInterfaceDescriptor) }; -class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor { +class ArgumentsAdaptorDescriptor : public CallInterfaceDescriptor { public: DEFINE_JS_PARAMETERS(kExpectedArgumentsCount) DEFINE_JS_PARAMETER_TYPES(MachineType::Int32()) - DECLARE_DESCRIPTOR(ArgumentAdaptorDescriptor, CallInterfaceDescriptor) + DECLARE_DESCRIPTOR(ArgumentsAdaptorDescriptor, CallInterfaceDescriptor) }; class CppBuiltinAdaptorDescriptor : public CallInterfaceDescriptor { @@ -913,6 +943,9 @@ class CEntry1ArgvOnStackDescriptor : public CallInterfaceDescriptor { class ApiCallbackDescriptor : public CallInterfaceDescriptor { public: + // TODO(jgruber): This could be simplified to pass call data on the stack + // since this is what the CallApiCallbackStub anyways. This would free a + // register. DEFINE_PARAMETERS_NO_CONTEXT(kTargetContext, kCallData, kHolder, kApiFunctionAddress) DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTargetContext @@ -981,15 +1014,24 @@ class InterpreterPushArgsThenCallDescriptor : public CallInterfaceDescriptor { class InterpreterPushArgsThenConstructDescriptor : public CallInterfaceDescriptor { public: - DEFINE_PARAMETERS(kNumberOfArguments, kNewTarget, kConstructor, - kFeedbackElement, kFirstArgument) + DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kConstructor, + kNewTarget, kFeedbackElement) DEFINE_PARAMETER_TYPES(MachineType::Int32(), // kNumberOfArguments - MachineType::AnyTagged(), // kNewTarget + MachineType::Pointer(), // kFirstArgument MachineType::AnyTagged(), // kConstructor - MachineType::AnyTagged(), // kFeedbackElement - MachineType::Pointer()) // kFirstArgument + MachineType::AnyTagged(), // kNewTarget + MachineType::AnyTagged()) // kFeedbackElement DECLARE_DESCRIPTOR(InterpreterPushArgsThenConstructDescriptor, CallInterfaceDescriptor) + +#if V8_TARGET_ARCH_IA32 + static const bool kPassLastArgsOnStack = true; +#else + static const bool kPassLastArgsOnStack = false; +#endif + + // Pass constructor, new target and feedback element through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0; }; class InterpreterCEntry1Descriptor : public CallInterfaceDescriptor { @@ -1044,6 +1086,14 @@ class WasmGrowMemoryDescriptor final : public CallInterfaceDescriptor { DECLARE_DESCRIPTOR(WasmGrowMemoryDescriptor, CallInterfaceDescriptor) }; +class WasmThrowDescriptor final : public CallInterfaceDescriptor { + public: + DEFINE_PARAMETERS_NO_CONTEXT(kException) + DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged(), // result 1 + MachineType::AnyTagged()) // kException + DECLARE_DESCRIPTOR(WasmThrowDescriptor, CallInterfaceDescriptor) +}; + class CloneObjectWithVectorDescriptor final : public CallInterfaceDescriptor { public: DEFINE_PARAMETERS(kSource, kFlags, kSlot, kVector) |