%PDF- %PDF-
| Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/compiler/ |
| Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/compiler/wasm-js-lowering.cc |
// Copyright 2023 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/compiler/wasm-js-lowering.h"
#include "src/compiler/common-operator.h"
#include "src/compiler/compiler-source-position-table.h"
#include "src/compiler/node-properties.h"
#include "src/compiler/opcodes.h"
#include "src/compiler/operator.h"
namespace v8::internal::compiler {
WasmJSLowering::WasmJSLowering(Editor* editor, MachineGraph* mcgraph,
SourcePositionTable* source_position_table)
: AdvancedReducer(editor),
gasm_(mcgraph, mcgraph->zone()),
mcgraph_(mcgraph),
source_position_table_(source_position_table) {}
Reduction WasmJSLowering::Reduce(Node* node) {
switch (node->opcode()) {
case IrOpcode::kTrapIf:
case IrOpcode::kTrapUnless: {
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
Node* trap_condition = NodeProperties::GetValueInput(node, 0);
auto ool_trap = gasm_.MakeDeferredLabel();
gasm_.InitializeEffectControl(effect, control);
if (node->opcode() == IrOpcode::kTrapIf) {
gasm_.GotoIf(trap_condition, &ool_trap);
} else {
DCHECK_EQ(node->opcode(), IrOpcode::kTrapUnless);
gasm_.GotoIfNot(trap_condition, &ool_trap);
}
effect = gasm_.effect();
control = gasm_.control();
Node* goto_node = control;
// Generate out of line code.
gasm_.InitializeEffectControl(nullptr, nullptr);
gasm_.Bind(&ool_trap);
TrapId trap_id = TrapIdOf(node->op());
Builtin trap = static_cast<Builtin>(trap_id);
// Create new FrameState with the correct source position (the position
// of the trap location).
Node* frame_state = NodeProperties::GetValueInput(node, 1);
const FrameStateInfo& info = FrameState(frame_state).frame_state_info();
SourcePosition position = source_position_table_->GetSourcePosition(node);
Node* new_frame_state = mcgraph_->graph()->CloneNode(frame_state);
BytecodeOffset bailout_id(position.ScriptOffset());
const Operator* frame_state_op = mcgraph_->common()->FrameState(
bailout_id, info.state_combine(), info.function_info());
NodeProperties::ChangeOp(new_frame_state, frame_state_op);
gasm_.CallBuiltinWithFrameState(trap, Operator::kNoProperties,
new_frame_state);
Node* terminate = mcgraph_->graph()->NewNode(
mcgraph_->common()->Throw(), gasm_.effect(), gasm_.control());
MergeControlToEnd(mcgraph_->graph(), mcgraph_->common(), terminate);
// Replace the trap node with the conditional branch.
gasm_.InitializeEffectControl(effect, control);
ReplaceWithValue(node, goto_node, gasm_.effect(), gasm_.control());
node->Kill();
return Replace(goto_node);
}
default:
return NoChange();
}
}
} // namespace v8::internal::compiler