Commit d7e6fbe5 authored by Igor Sheludko's avatar Igor Sheludko Committed by Commit Bot

Define return count and return types in CallInterfaceDescriptor.

Bug: v8:7754, v8:6600
Change-Id: I4db943d4a4a02a14bba670f89661ea98c5e306dd
Reviewed-on: https://chromium-review.googlesource.com/1107919
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53907}
parent 17693fea
...@@ -255,7 +255,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -255,7 +255,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
r0, // argument count (argc) r0, // argument count (argc)
...@@ -265,6 +267,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -265,6 +267,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -260,7 +260,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -260,7 +260,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
x0, // argument count (argc) x0, // argument count (argc)
...@@ -270,6 +272,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -270,6 +272,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -141,10 +141,11 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, int32_t builtin_index, ...@@ -141,10 +141,11 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, int32_t builtin_index,
// and this construction just queries the details from the descriptors table. // and this construction just queries the details from the descriptors table.
CallInterfaceDescriptor descriptor(interface_descriptor); CallInterfaceDescriptor descriptor(interface_descriptor);
// Ensure descriptor is already initialized. // Ensure descriptor is already initialized.
DCHECK_EQ(result_size, descriptor.GetReturnCount());
DCHECK_LE(0, descriptor.GetRegisterParameterCount()); DCHECK_LE(0, descriptor.GetRegisterParameterCount());
compiler::CodeAssemblerState state( compiler::CodeAssemblerState state(
isolate, &zone, descriptor, Code::BUILTIN, name, isolate, &zone, descriptor, Code::BUILTIN, name,
PoisoningMitigationLevel::kDontPoison, result_size, 0, builtin_index); PoisoningMitigationLevel::kDontPoison, 0, builtin_index);
generator(&state); generator(&state);
Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state);
PostBuildProfileAndTracing(isolate, *code, name); PostBuildProfileAndTracing(isolate, *code, name);
......
...@@ -318,7 +318,12 @@ Callable CodeFactory::InterpreterCEntry(Isolate* isolate, int result_size) { ...@@ -318,7 +318,12 @@ Callable CodeFactory::InterpreterCEntry(Isolate* isolate, int result_size) {
// save fpregs too. // save fpregs too.
Handle<Code> code = CodeFactory::CEntry(isolate, result_size, kDontSaveFPRegs, Handle<Code> code = CodeFactory::CEntry(isolate, result_size, kDontSaveFPRegs,
kArgvInRegister); kArgvInRegister);
return Callable(code, InterpreterCEntryDescriptor{}); if (result_size == 1) {
return Callable(code, InterpreterCEntry1Descriptor{});
} else {
DCHECK_EQ(result_size, 2);
return Callable(code, InterpreterCEntry2Descriptor{});
}
} }
// static // static
......
...@@ -261,7 +261,7 @@ Handle<Code> TurboFanCodeStub::GenerateCode() { ...@@ -261,7 +261,7 @@ Handle<Code> TurboFanCodeStub::GenerateCode() {
CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor());
compiler::CodeAssemblerState state( compiler::CodeAssemblerState state(
isolate(), &zone, descriptor, Code::STUB, name, isolate(), &zone, descriptor, Code::STUB, name,
PoisoningMitigationLevel::kDontPoison, 1, GetKey()); PoisoningMitigationLevel::kDontPoison, GetKey());
GenerateAssembly(&state); GenerateAssembly(&state);
return compiler::CodeAssembler::GenerateCode(&state); return compiler::CodeAssembler::GenerateCode(&state);
} }
......
...@@ -44,15 +44,14 @@ static_assert( ...@@ -44,15 +44,14 @@ static_assert(
CodeAssemblerState::CodeAssemblerState( CodeAssemblerState::CodeAssemblerState(
Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor,
Code::Kind kind, const char* name, PoisoningMitigationLevel poisoning_level, Code::Kind kind, const char* name, PoisoningMitigationLevel poisoning_level,
size_t result_size, uint32_t stub_key, int32_t builtin_index) uint32_t stub_key, int32_t builtin_index)
// TODO(rmcilroy): Should we use Linkage::GetBytecodeDispatchDescriptor for // TODO(rmcilroy): Should we use Linkage::GetBytecodeDispatchDescriptor for
// bytecode handlers? // bytecode handlers?
: CodeAssemblerState( : CodeAssemblerState(
isolate, zone, isolate, zone,
Linkage::GetStubCallDescriptor( Linkage::GetStubCallDescriptor(
zone, descriptor, descriptor.GetStackParameterCount(), zone, descriptor, descriptor.GetStackParameterCount(),
CallDescriptor::kNoFlags, Operator::kNoProperties, CallDescriptor::kNoFlags, Operator::kNoProperties),
MachineType::AnyTagged(), result_size),
kind, name, poisoning_level, stub_key, builtin_index) {} kind, name, poisoning_level, stub_key, builtin_index) {}
CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone, CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone,
...@@ -1142,9 +1141,10 @@ Node* CodeAssembler::CallStubN(const CallInterfaceDescriptor& descriptor, ...@@ -1142,9 +1141,10 @@ Node* CodeAssembler::CallStubN(const CallInterfaceDescriptor& descriptor,
// Extra arguments not mentioned in the descriptor are passed on the stack. // Extra arguments not mentioned in the descriptor are passed on the stack.
int stack_parameter_count = argc - descriptor.GetRegisterParameterCount(); int stack_parameter_count = argc - descriptor.GetRegisterParameterCount();
DCHECK_LE(descriptor.GetStackParameterCount(), stack_parameter_count); DCHECK_LE(descriptor.GetStackParameterCount(), stack_parameter_count);
DCHECK_EQ(result_size, descriptor.GetReturnCount());
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), descriptor, stack_parameter_count, CallDescriptor::kNoFlags, zone(), descriptor, stack_parameter_count, CallDescriptor::kNoFlags,
Operator::kNoProperties, MachineType::AnyTagged(), result_size, Operator::kNoProperties,
pass_context ? Linkage::kPassContext : Linkage::kNoContext); pass_context ? Linkage::kPassContext : Linkage::kNoContext);
CallPrologue(); CallPrologue();
...@@ -1160,11 +1160,9 @@ void CodeAssembler::TailCallStubImpl(const CallInterfaceDescriptor& descriptor, ...@@ -1160,11 +1160,9 @@ void CodeAssembler::TailCallStubImpl(const CallInterfaceDescriptor& descriptor,
constexpr size_t kMaxNumArgs = 11; constexpr size_t kMaxNumArgs = 11;
DCHECK_GE(kMaxNumArgs, args.size()); DCHECK_GE(kMaxNumArgs, args.size());
DCHECK_EQ(descriptor.GetParameterCount(), args.size()); DCHECK_EQ(descriptor.GetParameterCount(), args.size());
size_t result_size = 1;
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), descriptor, descriptor.GetStackParameterCount(), zone(), descriptor, descriptor.GetStackParameterCount(),
CallDescriptor::kNoFlags, Operator::kNoProperties, CallDescriptor::kNoFlags, Operator::kNoProperties);
MachineType::AnyTagged(), result_size);
NodeArray<kMaxNumArgs + 2> inputs; NodeArray<kMaxNumArgs + 2> inputs;
inputs.Add(target); inputs.Add(target);
...@@ -1203,7 +1201,7 @@ Node* CodeAssembler::TailCallStubThenBytecodeDispatchImpl( ...@@ -1203,7 +1201,7 @@ Node* CodeAssembler::TailCallStubThenBytecodeDispatchImpl(
DCHECK_LE(descriptor.GetStackParameterCount(), stack_parameter_count); DCHECK_LE(descriptor.GetStackParameterCount(), stack_parameter_count);
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), descriptor, stack_parameter_count, CallDescriptor::kNoFlags, zone(), descriptor, stack_parameter_count, CallDescriptor::kNoFlags,
Operator::kNoProperties, MachineType::AnyTagged(), 0); Operator::kNoProperties);
NodeArray<kMaxNumArgs + 2> inputs; NodeArray<kMaxNumArgs + 2> inputs;
inputs.Add(target); inputs.Add(target);
...@@ -1238,11 +1236,9 @@ TNode<Object> CodeAssembler::TailCallJSCode(TNode<Code> code, ...@@ -1238,11 +1236,9 @@ TNode<Object> CodeAssembler::TailCallJSCode(TNode<Code> code,
TNode<Object> new_target, TNode<Object> new_target,
TNode<Int32T> arg_count) { TNode<Int32T> arg_count) {
JSTrampolineDescriptor descriptor; JSTrampolineDescriptor descriptor;
size_t result_size = 1;
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), descriptor, descriptor.GetStackParameterCount(), zone(), descriptor, descriptor.GetStackParameterCount(),
CallDescriptor::kFixedTargetRegister, Operator::kNoProperties, CallDescriptor::kFixedTargetRegister, Operator::kNoProperties);
MachineType::AnyTagged(), result_size);
Node* nodes[] = {code, function, new_target, arg_count, context}; Node* nodes[] = {code, function, new_target, arg_count, context};
CHECK_EQ(descriptor.GetParameterCount() + 2, arraysize(nodes)); CHECK_EQ(descriptor.GetParameterCount() + 2, arraysize(nodes));
......
...@@ -1359,7 +1359,7 @@ class V8_EXPORT_PRIVATE CodeAssemblerState { ...@@ -1359,7 +1359,7 @@ class V8_EXPORT_PRIVATE CodeAssemblerState {
CodeAssemblerState(Isolate* isolate, Zone* zone, CodeAssemblerState(Isolate* isolate, Zone* zone,
const CallInterfaceDescriptor& descriptor, Code::Kind kind, const CallInterfaceDescriptor& descriptor, Code::Kind kind,
const char* name, PoisoningMitigationLevel poisoning_level, const char* name, PoisoningMitigationLevel poisoning_level,
size_t result_size = 1, uint32_t stub_key = 0, uint32_t stub_key = 0,
int32_t builtin_index = Builtins::kNoBuiltinId); int32_t builtin_index = Builtins::kNoBuiltinId);
// Create with JSCall linkage. // Create with JSCall linkage.
......
...@@ -2951,8 +2951,7 @@ Node* EffectControlLinearizer::LowerStringCodePointAt( ...@@ -2951,8 +2951,7 @@ Node* EffectControlLinearizer::LowerStringCodePointAt(
Operator::Properties properties = Operator::kNoThrow | Operator::kNoWrite; Operator::Properties properties = Operator::kNoThrow | Operator::kNoWrite;
CallDescriptor::Flags flags = CallDescriptor::kNoFlags; CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), callable.descriptor(), 0, flags, properties, graph()->zone(), callable.descriptor(), 0, flags, properties);
MachineType::TaggedSigned());
return __ Call(call_descriptor, __ HeapConstant(callable.code()), receiver, return __ Call(call_descriptor, __ HeapConstant(callable.code()), receiver,
position, __ NoContextConstant()); position, __ NoContextConstant());
} }
......
...@@ -863,8 +863,7 @@ Reduction JSCallReducer::ReduceReflectGet(Node* node) { ...@@ -863,8 +863,7 @@ Reduction JSCallReducer::ReduceReflectGet(Node* node) {
Builtins::CallableFor(isolate(), Builtins::kGetProperty); Builtins::CallableFor(isolate(), Builtins::kGetProperty);
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), callable.descriptor(), 0, graph()->zone(), callable.descriptor(), 0,
CallDescriptor::kNeedsFrameState, Operator::kNoProperties, CallDescriptor::kNeedsFrameState, Operator::kNoProperties);
MachineType::AnyTagged(), 1);
Node* stub_code = jsgraph()->HeapConstant(callable.code()); Node* stub_code = jsgraph()->HeapConstant(callable.code());
vtrue = etrue = if_true = vtrue = etrue = if_true =
graph()->NewNode(common()->Call(call_descriptor), stub_code, target, graph()->NewNode(common()->Call(call_descriptor), stub_code, target,
...@@ -2912,7 +2911,7 @@ Reduction JSCallReducer::ReduceCallApiFunction( ...@@ -2912,7 +2911,7 @@ Reduction JSCallReducer::ReduceCallApiFunction(
graph()->zone(), cid, graph()->zone(), cid,
cid.GetStackParameterCount() + argc + 1 /* implicit receiver */, cid.GetStackParameterCount() + argc + 1 /* implicit receiver */,
CallDescriptor::kNeedsFrameState, Operator::kNoProperties, CallDescriptor::kNeedsFrameState, Operator::kNoProperties,
MachineType::AnyTagged(), 1, Linkage::kNoContext); Linkage::kNoContext);
ApiFunction api_function(v8::ToCData<Address>(call_handler_info->callback())); ApiFunction api_function(v8::ToCData<Address>(call_handler_info->callback()));
Node* holder = lookup == CallOptimization::kHolderFound Node* holder = lookup == CallOptimization::kHolderFound
? jsgraph()->HeapConstant(api_holder) ? jsgraph()->HeapConstant(api_holder)
......
...@@ -101,12 +101,11 @@ void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable, ...@@ -101,12 +101,11 @@ void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable,
void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable, void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable,
CallDescriptor::Flags flags, CallDescriptor::Flags flags,
Operator::Properties properties, Operator::Properties properties) {
int result_size) {
const CallInterfaceDescriptor& descriptor = callable.descriptor(); const CallInterfaceDescriptor& descriptor = callable.descriptor();
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), descriptor, descriptor.GetStackParameterCount(), flags, zone(), descriptor, descriptor.GetStackParameterCount(), flags,
properties, MachineType::AnyTagged(), result_size); properties);
Node* stub_code = jsgraph()->HeapConstant(callable.code()); Node* stub_code = jsgraph()->HeapConstant(callable.code());
node->InsertInput(zone(), 0, stub_code); node->InsertInput(zone(), 0, stub_code);
NodeProperties::ChangeOp(node, common()->Call(call_descriptor)); NodeProperties::ChangeOp(node, common()->Call(call_descriptor));
...@@ -362,8 +361,7 @@ void JSGenericLowering::LowerJSCreateArray(Node* node) { ...@@ -362,8 +361,7 @@ void JSGenericLowering::LowerJSCreateArray(Node* node) {
Handle<AllocationSite> const site = p.site(); Handle<AllocationSite> const site = p.site();
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
zone(), ArrayConstructorDescriptor{}, arity + 1, zone(), ArrayConstructorDescriptor{}, arity + 1,
CallDescriptor::kNeedsFrameState, node->op()->properties(), CallDescriptor::kNeedsFrameState, node->op()->properties());
MachineType::AnyTagged());
Node* stub_code = jsgraph()->ArrayConstructorStubConstant(); Node* stub_code = jsgraph()->ArrayConstructorStubConstant();
Node* stub_arity = jsgraph()->Int32Constant(arity); Node* stub_arity = jsgraph()->Int32Constant(arity);
Node* type_info = site.is_null() ? jsgraph()->UndefinedConstant() Node* type_info = site.is_null() ? jsgraph()->UndefinedConstant()
......
...@@ -39,8 +39,7 @@ class JSGenericLowering final : public Reducer { ...@@ -39,8 +39,7 @@ class JSGenericLowering final : public Reducer {
// Helpers to replace existing nodes with a generic call. // Helpers to replace existing nodes with a generic call.
void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags); void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags);
void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags, void ReplaceWithStubCall(Node* node, Callable c, CallDescriptor::Flags flags,
Operator::Properties properties, Operator::Properties properties);
int result_size = 1);
void ReplaceWithRuntimeCall(Node* node, Runtime::FunctionId f, int args = -1); void ReplaceWithRuntimeCall(Node* node, Runtime::FunctionId f, int args = -1);
Zone* zone() const; Zone* zone() const;
......
...@@ -1767,7 +1767,7 @@ Node* JSNativeContextSpecialization::InlineApiCall( ...@@ -1767,7 +1767,7 @@ Node* JSNativeContextSpecialization::InlineApiCall(
call_interface_descriptor.GetStackParameterCount() + argc + call_interface_descriptor.GetStackParameterCount() + argc +
1 /* implicit receiver */, 1 /* implicit receiver */,
CallDescriptor::kNeedsFrameState, Operator::kNoProperties, CallDescriptor::kNeedsFrameState, Operator::kNoProperties,
MachineType::AnyTagged(), 1, Linkage::kNoContext); Linkage::kNoContext);
Node* data = jsgraph()->Constant(call_data_object); Node* data = jsgraph()->Constant(call_data_object);
ApiFunction function(v8::ToCData<Address>(call_handler_info->callback())); ApiFunction function(v8::ToCData<Address>(call_handler_info->callback()));
......
...@@ -346,8 +346,7 @@ CallDescriptor* Linkage::GetJSCallDescriptor(Zone* zone, bool is_osr, ...@@ -346,8 +346,7 @@ CallDescriptor* Linkage::GetJSCallDescriptor(Zone* zone, bool is_osr,
CallDescriptor* Linkage::GetStubCallDescriptor( CallDescriptor* Linkage::GetStubCallDescriptor(
Zone* zone, const CallInterfaceDescriptor& descriptor, Zone* zone, const CallInterfaceDescriptor& descriptor,
int stack_parameter_count, CallDescriptor::Flags flags, int stack_parameter_count, CallDescriptor::Flags flags,
Operator::Properties properties, MachineType return_type, Operator::Properties properties, Linkage::ContextSpecification context_spec,
size_t return_count, Linkage::ContextSpecification context_spec,
StubCallMode stub_mode) { StubCallMode stub_mode) {
const int register_parameter_count = descriptor.GetRegisterParameterCount(); const int register_parameter_count = descriptor.GetRegisterParameterCount();
const int js_parameter_count = const int js_parameter_count =
...@@ -356,17 +355,18 @@ CallDescriptor* Linkage::GetStubCallDescriptor( ...@@ -356,17 +355,18 @@ CallDescriptor* Linkage::GetStubCallDescriptor(
const size_t parameter_count = const size_t parameter_count =
static_cast<size_t>(js_parameter_count + context_count); static_cast<size_t>(js_parameter_count + context_count);
size_t return_count = descriptor.GetReturnCount();
LocationSignature::Builder locations(zone, return_count, parameter_count); LocationSignature::Builder locations(zone, return_count, parameter_count);
// Add returns. // Add returns.
if (locations.return_count_ > 0) { if (locations.return_count_ > 0) {
locations.AddReturn(regloc(kReturnRegister0, return_type)); locations.AddReturn(regloc(kReturnRegister0, descriptor.GetReturnType(0)));
} }
if (locations.return_count_ > 1) { if (locations.return_count_ > 1) {
locations.AddReturn(regloc(kReturnRegister1, return_type)); locations.AddReturn(regloc(kReturnRegister1, descriptor.GetReturnType(1)));
} }
if (locations.return_count_ > 2) { if (locations.return_count_ > 2) {
locations.AddReturn(regloc(kReturnRegister2, return_type)); locations.AddReturn(regloc(kReturnRegister2, descriptor.GetReturnType(2)));
} }
// Add parameters in registers and on the stack. // Add parameters in registers and on the stack.
...@@ -417,7 +417,10 @@ CallDescriptor* Linkage::GetBytecodeDispatchCallDescriptor( ...@@ -417,7 +417,10 @@ CallDescriptor* Linkage::GetBytecodeDispatchCallDescriptor(
const int register_parameter_count = descriptor.GetRegisterParameterCount(); const int register_parameter_count = descriptor.GetRegisterParameterCount();
const int parameter_count = register_parameter_count + stack_parameter_count; const int parameter_count = register_parameter_count + stack_parameter_count;
LocationSignature::Builder locations(zone, 0, parameter_count); DCHECK_EQ(descriptor.GetReturnCount(), 1);
LocationSignature::Builder locations(zone, 1, parameter_count);
locations.AddReturn(regloc(kReturnRegister0, descriptor.GetReturnType(0)));
// Add parameters in registers and on the stack. // Add parameters in registers and on the stack.
for (int i = 0; i < parameter_count; i++) { for (int i = 0; i < parameter_count; i++) {
......
...@@ -393,8 +393,7 @@ class V8_EXPORT_PRIVATE Linkage : public NON_EXPORTED_BASE(ZoneObject) { ...@@ -393,8 +393,7 @@ class V8_EXPORT_PRIVATE Linkage : public NON_EXPORTED_BASE(ZoneObject) {
Zone* zone, const CallInterfaceDescriptor& descriptor, Zone* zone, const CallInterfaceDescriptor& descriptor,
int stack_parameter_count, CallDescriptor::Flags flags, int stack_parameter_count, CallDescriptor::Flags flags,
Operator::Properties properties = Operator::kNoProperties, Operator::Properties properties = Operator::kNoProperties,
MachineType return_type = MachineType::AnyTagged(), ContextSpecification context_spec = kPassContext,
size_t return_count = 1, ContextSpecification context_spec = kPassContext,
StubCallMode stub_mode = StubCallMode::kCallOnHeapBuiltin); StubCallMode stub_mode = StubCallMode::kCallOnHeapBuiltin);
static CallDescriptor* GetBytecodeDispatchCallDescriptor( static CallDescriptor* GetBytecodeDispatchCallDescriptor(
......
...@@ -239,7 +239,7 @@ void MemoryOptimizer::VisitAllocateRaw(Node* node, ...@@ -239,7 +239,7 @@ void MemoryOptimizer::VisitAllocateRaw(Node* node,
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), AllocateDescriptor{}, 0, graph()->zone(), AllocateDescriptor{}, 0,
CallDescriptor::kCanUseRoots, Operator::kNoThrow, CallDescriptor::kCanUseRoots, Operator::kNoThrow,
MachineType::AnyTagged(), 1, Linkage::kNoContext); Linkage::kNoContext);
allocate_operator_.set(common()->Call(call_descriptor)); allocate_operator_.set(common()->Call(call_descriptor));
} }
Node* vfalse = __ Call(allocate_operator_.get(), target, size); Node* vfalse = __ Call(allocate_operator_.get(), target, size);
...@@ -296,7 +296,7 @@ void MemoryOptimizer::VisitAllocateRaw(Node* node, ...@@ -296,7 +296,7 @@ void MemoryOptimizer::VisitAllocateRaw(Node* node,
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), AllocateDescriptor{}, 0, graph()->zone(), AllocateDescriptor{}, 0,
CallDescriptor::kCanUseRoots, Operator::kNoThrow, CallDescriptor::kCanUseRoots, Operator::kNoThrow,
MachineType::AnyTagged(), 1, Linkage::kNoContext); Linkage::kNoContext);
allocate_operator_.set(common()->Call(call_descriptor)); allocate_operator_.set(common()->Call(call_descriptor));
} }
__ Goto(&done, __ Call(allocate_operator_.get(), target, size)); __ Goto(&done, __ Call(allocate_operator_.get(), target, size));
......
...@@ -270,8 +270,6 @@ void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position, ...@@ -270,8 +270,6 @@ void WasmGraphBuilder::StackCheck(wasm::WasmCodePosition position,
0, // stack parameter count 0, // stack parameter count
CallDescriptor::kNoFlags, // flags CallDescriptor::kNoFlags, // flags
Operator::kNoProperties, // properties Operator::kNoProperties, // properties
MachineType::None(), // return type
0, // return count
Linkage::kNoContext, // context specification Linkage::kNoContext, // context specification
StubCallMode::kCallWasmRuntimeStub); // stub call mode StubCallMode::kCallWasmRuntimeStub); // stub call mode
// A direct call to a wasm runtime stub defined in this module. // A direct call to a wasm runtime stub defined in this module.
...@@ -4034,8 +4032,8 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { ...@@ -4034,8 +4032,8 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
if (!allocate_heap_number_operator_.is_set()) { if (!allocate_heap_number_operator_.is_set()) {
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
mcgraph()->zone(), AllocateHeapNumberDescriptor(), 0, mcgraph()->zone(), AllocateHeapNumberDescriptor(), 0,
CallDescriptor::kNoFlags, Operator::kNoThrow, CallDescriptor::kNoFlags, Operator::kNoThrow, Linkage::kNoContext,
MachineType::AnyTagged(), 1, Linkage::kNoContext, stub_mode_); stub_mode_);
allocate_heap_number_operator_.set(common->Call(call_descriptor)); allocate_heap_number_operator_.set(common->Call(call_descriptor));
} }
Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(), Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(),
...@@ -4197,7 +4195,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { ...@@ -4197,7 +4195,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
auto call_descriptor = Linkage::GetStubCallDescriptor( auto call_descriptor = Linkage::GetStubCallDescriptor(
mcgraph()->zone(), TypeConversionDescriptor(), 0, mcgraph()->zone(), TypeConversionDescriptor(), 0,
CallDescriptor::kNoFlags, Operator::kNoProperties, CallDescriptor::kNoFlags, Operator::kNoProperties,
MachineType::AnyTagged(), 1, Linkage::kPassContext, stub_mode_); Linkage::kPassContext, stub_mode_);
Node* stub_code = Node* stub_code =
(stub_mode_ == StubCallMode::kCallWasmRuntimeStub) (stub_mode_ == StubCallMode::kCallWasmRuntimeStub)
? mcgraph()->RelocatableIntPtrConstant( ? mcgraph()->RelocatableIntPtrConstant(
...@@ -4517,8 +4515,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { ...@@ -4517,8 +4515,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
call_descriptor = Linkage::GetStubCallDescriptor( call_descriptor = Linkage::GetStubCallDescriptor(
mcgraph()->zone(), ArgumentAdaptorDescriptor{}, 1 + wasm_count, mcgraph()->zone(), ArgumentAdaptorDescriptor{}, 1 + wasm_count,
CallDescriptor::kNoFlags, Operator::kNoProperties, CallDescriptor::kNoFlags, Operator::kNoProperties,
MachineType::AnyTagged(), 1, Linkage::kPassContext, Linkage::kPassContext, StubCallMode::kCallWasmRuntimeStub);
StubCallMode::kCallWasmRuntimeStub);
// Convert wasm numbers to JS values. // Convert wasm numbers to JS values.
pos = AddArgumentNodes(args, pos, wasm_count, sig_); pos = AddArgumentNodes(args, pos, wasm_count, sig_);
...@@ -4543,8 +4540,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { ...@@ -4543,8 +4540,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
call_descriptor = Linkage::GetStubCallDescriptor( call_descriptor = Linkage::GetStubCallDescriptor(
graph()->zone(), CallTrampolineDescriptor{}, wasm_count + 1, graph()->zone(), CallTrampolineDescriptor{}, wasm_count + 1,
CallDescriptor::kNoFlags, Operator::kNoProperties, CallDescriptor::kNoFlags, Operator::kNoProperties,
MachineType::AnyTagged(), 1, Linkage::kPassContext, Linkage::kPassContext, StubCallMode::kCallWasmRuntimeStub);
StubCallMode::kCallWasmRuntimeStub);
// Convert wasm numbers to JS values. // Convert wasm numbers to JS values.
pos = AddArgumentNodes(args, pos, wasm_count, sig_); pos = AddArgumentNodes(args, pos, wasm_count, sig_);
......
...@@ -247,7 +247,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -247,7 +247,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
eax, // argument count (argc) eax, // argument count (argc)
...@@ -257,6 +259,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -257,6 +259,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -22,14 +22,16 @@ void CallInterfaceDescriptorData::InitializePlatformSpecific( ...@@ -22,14 +22,16 @@ void CallInterfaceDescriptorData::InitializePlatformSpecific(
} }
void CallInterfaceDescriptorData::InitializePlatformIndependent( void CallInterfaceDescriptorData::InitializePlatformIndependent(
int parameter_count, int extra_parameter_count, int return_count, int parameter_count, const MachineType* machine_types,
const MachineType* machine_types) { int machine_types_length) {
// InterfaceDescriptor owns a copy of the MachineType array. // InterfaceDescriptor owns a copy of the MachineType array.
// We only care about parameters, not receiver and result. // We only care about parameters, not receiver and result.
param_count_ = parameter_count + extra_parameter_count; return_count_ = return_count;
machine_types_ = NewArray<MachineType>(param_count_); param_count_ = parameter_count;
for (int i = 0; i < param_count_; i++) { int types_length = return_count_ + param_count_;
if (machine_types == nullptr || i >= parameter_count) { machine_types_ = NewArray<MachineType>(types_length);
for (int i = 0; i < types_length; i++) {
if (machine_types == nullptr || i >= machine_types_length) {
machine_types_[i] = MachineType::AnyTagged(); machine_types_[i] = MachineType::AnyTagged();
} else { } else {
machine_types_[i] = machine_types[i]; machine_types_[i] = machine_types[i];
......
This diff is collapsed.
...@@ -695,11 +695,6 @@ class V8_EXPORT_PRIVATE Bytecodes final : public AllStatic { ...@@ -695,11 +695,6 @@ class V8_EXPORT_PRIVATE Bytecodes final : public AllStatic {
#undef OR_BYTECODE #undef OR_BYTECODE
} }
// Returns the number of values which |bytecode| returns.
static constexpr size_t ReturnCount(Bytecode bytecode) {
return Returns(bytecode) ? 1 : 0;
}
// Returns the number of operands expected by |bytecode|. // Returns the number of operands expected by |bytecode|.
static int NumberOfOperands(Bytecode bytecode) { static int NumberOfOperands(Bytecode bytecode) {
DCHECK_LE(bytecode, Bytecode::kLast); DCHECK_LE(bytecode, Bytecode::kLast);
......
...@@ -3112,8 +3112,7 @@ Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode, ...@@ -3112,8 +3112,7 @@ Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode,
Bytecodes::ToString(bytecode), Bytecodes::ToString(bytecode),
FLAG_untrusted_code_mitigations FLAG_untrusted_code_mitigations
? PoisoningMitigationLevel::kPoisonCriticalOnly ? PoisoningMitigationLevel::kPoisonCriticalOnly
: PoisoningMitigationLevel::kDontPoison, : PoisoningMitigationLevel::kDontPoison);
Bytecodes::ReturnCount(bytecode));
switch (bytecode) { switch (bytecode) {
#define CALL_GENERATOR(Name, ...) \ #define CALL_GENERATOR(Name, ...) \
...@@ -3173,7 +3172,6 @@ class DeserializeLazyAssembler : public InterpreterAssembler { ...@@ -3173,7 +3172,6 @@ class DeserializeLazyAssembler : public InterpreterAssembler {
Handle<Code> GenerateDeserializeLazyHandler(Isolate* isolate, Handle<Code> GenerateDeserializeLazyHandler(Isolate* isolate,
OperandScale operand_scale) { OperandScale operand_scale) {
Zone zone(isolate->allocator(), ZONE_NAME); Zone zone(isolate->allocator(), ZONE_NAME);
const size_t return_count = 0;
std::string debug_name = std::string("DeserializeLazy"); std::string debug_name = std::string("DeserializeLazy");
if (operand_scale > OperandScale::kSingle) { if (operand_scale > OperandScale::kSingle) {
...@@ -3187,8 +3185,7 @@ Handle<Code> GenerateDeserializeLazyHandler(Isolate* isolate, ...@@ -3187,8 +3185,7 @@ Handle<Code> GenerateDeserializeLazyHandler(Isolate* isolate,
debug_name.c_str(), debug_name.c_str(),
FLAG_untrusted_code_mitigations FLAG_untrusted_code_mitigations
? PoisoningMitigationLevel::kPoisonCriticalOnly ? PoisoningMitigationLevel::kPoisonCriticalOnly
: PoisoningMitigationLevel::kDontPoison, : PoisoningMitigationLevel::kDontPoison);
return_count);
DeserializeLazyAssembler::Generate(&state, operand_scale); DeserializeLazyAssembler::Generate(&state, operand_scale);
Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state);
......
...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
a0, // argument count (argc) a0, // argument count (argc)
...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
a0, // argument count (argc) a0, // argument count (argc)
...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -246,7 +246,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
r3, // argument count (argc) r3, // argument count (argc)
...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -256,6 +258,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -244,7 +244,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -244,7 +244,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
r2, // argument count (argc) r2, // argument count (argc)
...@@ -254,6 +256,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -254,6 +256,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -247,7 +247,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific( ...@@ -247,7 +247,9 @@ void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
void InterpreterCEntryDescriptor::InitializePlatformSpecific( namespace {
void InterpreterCEntryDescriptor_InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
rax, // argument count (argc) rax, // argument count (argc)
...@@ -257,6 +259,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific( ...@@ -257,6 +259,18 @@ void InterpreterCEntryDescriptor::InitializePlatformSpecific(
data->InitializePlatformSpecific(arraysize(registers), registers); data->InitializePlatformSpecific(arraysize(registers), registers);
} }
} // namespace
void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
void ResumeGeneratorDescriptor::InitializePlatformSpecific( void ResumeGeneratorDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) { CallInterfaceDescriptorData* data) {
Register registers[] = { Register registers[] = {
......
...@@ -27,8 +27,7 @@ InterpreterAssemblerTestState::InterpreterAssemblerTestState( ...@@ -27,8 +27,7 @@ InterpreterAssemblerTestState::InterpreterAssemblerTestState(
: compiler::CodeAssemblerState( : compiler::CodeAssemblerState(
test->isolate(), test->zone(), InterpreterDispatchDescriptor{}, test->isolate(), test->zone(), InterpreterDispatchDescriptor{},
Code::BYTECODE_HANDLER, Bytecodes::ToString(bytecode), Code::BYTECODE_HANDLER, Bytecodes::ToString(bytecode),
PoisoningMitigationLevel::kPoisonCriticalOnly, PoisoningMitigationLevel::kPoisonCriticalOnly) {}
Bytecodes::ReturnCount(bytecode)) {}
const interpreter::Bytecode kBytecodes[] = { const interpreter::Bytecode kBytecodes[] = {
#define DEFINE_BYTECODE(Name, ...) interpreter::Bytecode::k##Name, #define DEFINE_BYTECODE(Name, ...) interpreter::Bytecode::k##Name,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment