v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
interface-descriptors.cc
Go to the documentation of this file.
1// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
9
10namespace v8 {
11namespace internal {
12
13#ifdef DEBUG
14void CheckRegisterConfiguration(int count, const Register* registers,
15 const DoubleRegister* double_registers) {
16 // Make sure that the registers are all valid, and don't alias each other.
17 RegList reglist;
18 DoubleRegList double_reglist;
19 for (int i = 0; i < count; ++i) {
21 DoubleRegister dreg = double_registers[i];
22 DCHECK(reg.is_valid() || dreg.is_valid());
24#ifdef V8_COMPRESS_POINTERS
26#endif
27 if (reg.is_valid()) {
28 DCHECK(!reglist.has(reg));
29 reglist.set(reg);
30 }
31 if (dreg.is_valid()) {
32 DCHECK(!double_reglist.has(dreg));
33 double_reglist.set(dreg);
34 }
35 }
36}
37#endif
38
40 Flags flags, CodeEntrypointTag tag, int return_count, int parameter_count,
41 StackArgumentOrder stack_order, int register_parameter_count,
42 const Register* registers, const DoubleRegister* double_registers,
43 const Register* return_registers,
44 const DoubleRegister* return_double_registers) {
46
47#ifdef DEBUG
48 CheckRegisterConfiguration(register_parameter_count, registers,
49 double_registers);
50 CheckRegisterConfiguration(return_count, return_registers,
51 return_double_registers);
52#endif
53
54 flags_ = flags;
55 tag_ = tag;
59 register_param_count_ = register_parameter_count;
60
61 // The caller owns the the registers array, so we just set the pointer.
63 double_register_params_ = double_registers;
64 register_returns_ = return_registers;
65 double_register_returns_ = return_double_registers;
66}
67
69 const MachineType* machine_types, int machine_types_length) {
71 const int types_length = return_count_ + param_count_;
72
73 // Machine types are either fully initialized or null.
74 if (machine_types == nullptr) {
77 } else {
78 DCHECK_EQ(machine_types_length, types_length);
80 for (int i = 0; i < types_length; i++) machine_types_[i] = machine_types[i];
81 }
82
83 if (!(flags_ & kNoStackScan)) DCHECK(AllStackParametersAreTagged());
84}
85
86#ifdef DEBUG
87bool CallInterfaceDescriptorData::AllStackParametersAreTagged() const {
89 const int types_length = return_count_ + param_count_;
90 const int first_stack_param = return_count_ + register_param_count_;
91 for (int i = first_stack_param; i < types_length; i++) {
92 if (!machine_types_[i].IsTagged()) return false;
93 }
94 return true;
95}
96#endif // DEBUG
97
99 delete[] machine_types_;
100 machine_types_ = nullptr;
101 register_params_ = nullptr;
102 double_register_params_ = nullptr;
103 register_returns_ = nullptr;
104 double_register_returns_ = nullptr;
105}
106
107// static
109 CallDescriptors::call_descriptor_data_[NUMBER_OF_DESCRIPTORS];
110
112#define INTERFACE_DESCRIPTOR(name, ...) \
113 name##Descriptor().Initialize(&call_descriptor_data_[CallDescriptors::name]);
115#undef INTERFACE_DESCRIPTOR
116
123}
124
127 data.Reset();
128 }
129}
130
133 switch (key) {
134#define DEF_CASE(name, ...) \
135 case CallDescriptors::name: \
136 return #name " Descriptor";
138#undef DEF_CASE
140 break;
141 }
142 return "";
143}
144
146#if defined(V8_TARGET_ARCH_MIPS64)
147 return reg.code() % 2 == 0;
148#else
149 return true;
150#endif
151}
152
153#if DEBUG
154template <typename DerivedDescriptor>
157// static
158void WriteBarrierDescriptor::Verify(CallInterfaceDescriptorData* data) {
160 // The default parameters should not clobber vital registers in order to
161 // reduce code size:
169 // Coincidental: to make calling from various builtins easier.
171 // We need a certain set of registers by default:
172 RegList allocatable_regs = data->allocatable_registers();
173 DCHECK(allocatable_regs.has(kContextRegister));
174 DCHECK(allocatable_regs.has(kReturnRegister0));
175 VerifyArgumentRegisterCount(data, 4);
176}
177// static
178void IndirectPointerWriteBarrierDescriptor::Verify(
179 CallInterfaceDescriptorData* data) {
180 WriteBarrierDescriptor::Verify(data);
181}
182#endif // DEBUG
183
184} // namespace internal
185} // namespace v8
int16_t parameter_count
Definition builtins.cc:67
static CallInterfaceDescriptorData call_descriptor_data_[NUMBER_OF_DESCRIPTORS]
static Key GetKey(const CallInterfaceDescriptorData *data)
void InitializeTypes(const MachineType *machine_types, int machine_types_length)
void InitializeRegisters(Flags flags, CodeEntrypointTag tag, int return_count, int parameter_count, StackArgumentOrder stack_order, int register_parameter_count, const Register *registers, const DoubleRegister *double_registers, const Register *return_registers, const DoubleRegister *return_double_registers)
const CallInterfaceDescriptorData * data_
static constexpr MachineType AnyTagged()
uint32_t count
#define INTERFACE_DESCRIPTOR(name,...)
#define DEF_CASE(name,...)
#define INTERFACE_DESCRIPTOR_LIST(V)
LiftoffRegister reg
RegListBase< RegisterT > registers
constexpr Register kRootRegister
RegListBase< DoubleRegister > DoubleRegList
Definition reglist-arm.h:15
DwVfpRegister DoubleRegister
RegListBase< Register > RegList
Definition reglist-arm.h:14
constexpr Register kInterpreterAccumulatorRegister
constexpr Register kReturnRegister0
constexpr Register kContextRegister
V8_EXPORT_PRIVATE bool AreAliased(const CPURegister &reg1, const CPURegister &reg2, const CPURegister &reg3=NoReg, const CPURegister &reg4=NoReg, const CPURegister &reg5=NoReg, const CPURegister &reg6=NoReg, const CPURegister &reg7=NoReg, const CPURegister &reg8=NoReg)
constexpr Register kPtrComprCageBaseRegister
T * NewArray(size_t size)
Definition allocation.h:43
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485