/* * Copyright (c) 2023, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include "Forward.h" namespace JSSpecCompiler { class BasicBlock : public RefCounted { public: struct PhiNode { struct Branch { BasicBlockRef block; VariableRef value; }; VariableRef var; Vector branches; }; BasicBlock(size_t index, NonnullRefPtr continuation) : m_index(index) , m_continuation(move(continuation)) , m_immediate_dominator(nullptr) { } size_t m_index; Vector m_phi_nodes; Vector m_expressions; NonnullRefPtr m_continuation; BasicBlockRef m_immediate_dominator; }; class ControlFlowGraph : public RefCounted { public: ControlFlowGraph() { } size_t blocks_count() const { return blocks.size(); } Vector> blocks; BasicBlockRef start_block; BasicBlockRef end_block; }; } namespace AK { template<> struct Formatter : Formatter { ErrorOr format(FormatBuilder& builder, JSSpecCompiler::ControlFlowGraph const& control_flow_graph); }; }