@@ -105,6 +105,16 @@ namespace internal {
105105 BUILTIN_LIST_TFS (V) \
106106 TORQUE_BUILTIN_LIST_TFC (V)
107107
108+ enum class StackArgumentOrder {
109+ kDefault , // Arguments in the stack are pushed in the default/stub order (the
110+ // first argument is pushed first).
111+ kJS , // Arguments in the stack are pushed in the same order as the one used
112+ // by JS-to-JS function calls. This should be used if calling a
113+ // JSFunction or if the builtin is expected to be called directly from a
114+ // JSFunction. When V8_REVERSE_JSARGS is set, this order is reversed
115+ // compared to kDefault.
116+ };
117+
108118class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
109119 public:
110120 enum Flag {
@@ -140,7 +150,8 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
140150 void InitializePlatformIndependent (Flags flags, int return_count,
141151 int parameter_count,
142152 const MachineType* machine_types,
143- int machine_types_length);
153+ int machine_types_length,
154+ StackArgumentOrder stack_order);
144155
145156 void Reset ();
146157
@@ -163,6 +174,7 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
163174 DCHECK_LT (index, param_count_);
164175 return machine_types_[return_count_ + index];
165176 }
177+ StackArgumentOrder stack_order () const { return stack_order_; }
166178
167179 void RestrictAllocatableRegisters (const Register* registers, int num) {
168180 DCHECK_EQ (allocatable_registers_, 0 );
@@ -197,6 +209,7 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
197209 int return_count_ = -1 ;
198210 int param_count_ = -1 ;
199211 Flags flags_ = kNoFlags ;
212+ StackArgumentOrder stack_order_ = StackArgumentOrder::kDefault ;
200213
201214 // Specifying the set of registers that could be used by the register
202215 // allocator. Currently, it's only used by RecordWrite code stub.
@@ -293,6 +306,10 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
293306 return data ()->allocatable_registers ();
294307 }
295308
309+ StackArgumentOrder GetStackArgumentOrder () const {
310+ return data ()->stack_order ();
311+ }
312+
296313 static const Register ContextRegister ();
297314
298315 const char * DebugName () const ;
@@ -312,9 +329,9 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptor {
312329 CallInterfaceDescriptorData* data) {
313330 // Default descriptor configuration: one result, all parameters are passed
314331 // in registers and all parameters have MachineType::AnyTagged() type.
315- data->InitializePlatformIndependent (CallInterfaceDescriptorData:: kNoFlags ,
316- 1 , data->register_param_count (),
317- nullptr , 0 );
332+ data->InitializePlatformIndependent (
333+ CallInterfaceDescriptorData:: kNoFlags , 1 , data->register_param_count (),
334+ nullptr , 0 , StackArgumentOrder:: kDefault );
318335 }
319336
320337 // Initializes |data| using the platform dependent default set of registers.
@@ -400,7 +417,8 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
400417 void InitializePlatformIndependent (CallInterfaceDescriptorData* data) \
401418 override { \
402419 data->InitializePlatformIndependent (Flags (kDescriptorFlags ), kReturnCount , \
403- kParameterCount , nullptr , 0 ); \
420+ kParameterCount , nullptr , 0 , \
421+ kStackArgumentOrder ); \
404422 } \
405423 name (CallDescriptors::Key key) : base(key) {} \
406424 \
@@ -418,9 +436,11 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
418436 \
419437 public:
420438
421- #define DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS (flags, return_count, ...) \
439+ #define DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS (flags, stack_order, \
440+ return_count, ...) \
422441 static constexpr int kDescriptorFlags = flags; \
423442 static constexpr int kReturnCount = return_count; \
443+ static constexpr StackArgumentOrder kStackArgumentOrder = stack_order; \
424444 enum ParameterIndices { \
425445 __dummy = -1 , /* to be able to pass zero arguments */ \
426446 ##__VA_ARGS__, \
@@ -429,35 +449,41 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
429449 kContext = kParameterCount /* implicit parameter */ \
430450 };
431451
432- #define DEFINE_RESULT_AND_PARAMETERS (return_count, ...) \
433- DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
434- CallInterfaceDescriptorData::kNoFlags , return_count, ##__VA_ARGS__)
452+ #define DEFINE_RESULT_AND_PARAMETERS (return_count, ...) \
453+ DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
454+ CallInterfaceDescriptorData::kNoFlags , StackArgumentOrder::kDefault , \
455+ return_count, ##__VA_ARGS__)
435456
436457// This is valid only for builtins that use EntryFrame, which does not scan
437458// stack arguments on GC.
438- #define DEFINE_PARAMETERS_ENTRY (...) \
439- static constexpr int kDescriptorFlags = \
440- CallInterfaceDescriptorData::kNoContext | \
441- CallInterfaceDescriptorData::kNoStackScan ; \
442- static constexpr int kReturnCount = 1 ; \
443- enum ParameterIndices { \
444- __dummy = -1 , /* to be able to pass zero arguments */ \
445- ##__VA_ARGS__, \
446- \
447- kParameterCount \
459+ #define DEFINE_PARAMETERS_ENTRY (...) \
460+ static constexpr int kDescriptorFlags = \
461+ CallInterfaceDescriptorData::kNoContext | \
462+ CallInterfaceDescriptorData::kNoStackScan ; \
463+ static constexpr StackArgumentOrder kStackArgumentOrder = \
464+ StackArgumentOrder::kDefault ; \
465+ static constexpr int kReturnCount = 1 ; \
466+ enum ParameterIndices { \
467+ __dummy = -1 , /* to be able to pass zero arguments */ \
468+ ##__VA_ARGS__, \
469+ \
470+ kParameterCount \
448471 };
449472
450- #define DEFINE_PARAMETERS (...) \
451- DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
452- CallInterfaceDescriptorData::kNoFlags , 1 , ##__VA_ARGS__)
473+ #define DEFINE_PARAMETERS (...) \
474+ DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
475+ CallInterfaceDescriptorData::kNoFlags , StackArgumentOrder::kDefault , 1 , \
476+ ##__VA_ARGS__)
453477
454- #define DEFINE_PARAMETERS_NO_CONTEXT (...) \
455- DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
456- CallInterfaceDescriptorData::kNoContext , 1 , ##__VA_ARGS__)
478+ #define DEFINE_PARAMETERS_NO_CONTEXT (...) \
479+ DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
480+ CallInterfaceDescriptorData::kNoContext , StackArgumentOrder::kDefault , \
481+ 1 , ##__VA_ARGS__)
457482
458- #define DEFINE_PARAMETERS_VARARGS (...) \
459- DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
460- CallInterfaceDescriptorData::kAllowVarArgs , 1 , ##__VA_ARGS__)
483+ #define DEFINE_PARAMETERS_VARARGS (...) \
484+ DEFINE_FLAGS_AND_RESULT_AND_PARAMETERS ( \
485+ CallInterfaceDescriptorData::kAllowVarArgs , StackArgumentOrder::kJS , 1 , \
486+ ##__VA_ARGS__)
461487
462488#define DEFINE_RESULT_AND_PARAMETER_TYPES_WITH_FLAG (flag, ...) \
463489 void InitializePlatformIndependent (CallInterfaceDescriptorData* data) \
@@ -468,7 +494,7 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
468494 " Parameter names definition is not consistent with parameter types" ); \
469495 data->InitializePlatformIndependent ( \
470496 Flags (flag | kDescriptorFlags ), kReturnCount , kParameterCount , \
471- machine_types, arraysize (machine_types)); \
497+ machine_types, arraysize (machine_types), kStackArgumentOrder ); \
472498 }
473499
474500#define DEFINE_RESULT_AND_PARAMETER_TYPES (...) \
@@ -479,18 +505,20 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams);
479505 DEFINE_RESULT_AND_PARAMETER_TYPES (MachineType::AnyTagged() /* result */ , \
480506 ##__VA_ARGS__)
481507
482- #define DEFINE_JS_PARAMETERS (...) \
483- static constexpr int kDescriptorFlags = \
484- CallInterfaceDescriptorData::kAllowVarArgs ; \
485- static constexpr int kReturnCount = 1 ; \
486- enum ParameterIndices { \
487- kTarget , \
488- kNewTarget , \
489- kActualArgumentsCount , \
490- ##__VA_ARGS__, \
491- \
492- kParameterCount , \
493- kContext = kParameterCount /* implicit parameter */ \
508+ #define DEFINE_JS_PARAMETERS (...) \
509+ static constexpr int kDescriptorFlags = \
510+ CallInterfaceDescriptorData::kAllowVarArgs ; \
511+ static constexpr int kReturnCount = 1 ; \
512+ static constexpr StackArgumentOrder kStackArgumentOrder = \
513+ StackArgumentOrder::kJS ; \
514+ enum ParameterIndices { \
515+ kTarget , \
516+ kNewTarget , \
517+ kActualArgumentsCount , \
518+ ##__VA_ARGS__, \
519+ \
520+ kParameterCount , \
521+ kContext = kParameterCount /* implicit parameter */ \
494522 };
495523
496524#define DEFINE_JS_PARAMETER_TYPES (...) \
@@ -552,7 +580,8 @@ class TorqueInterfaceDescriptor : public CallInterfaceDescriptor {
552580 DCHECK_EQ (kReturnCount + kParameterCount , machine_types.size ());
553581 data->InitializePlatformIndependent (Flags (kDescriptorFlags ), kReturnCount ,
554582 kParameterCount , machine_types.data (),
555- static_cast <int >(machine_types.size ()));
583+ static_cast <int >(machine_types.size ()),
584+ StackArgumentOrder::kDefault );
556585 }
557586};
558587
0 commit comments