ControlFlowGraph.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/RefCounted.h>
  8. #include <AK/RefPtr.h>
  9. #include <AK/Vector.h>
  10. #include "Forward.h"
  11. namespace JSSpecCompiler {
  12. class BasicBlock : public RefCounted<BasicBlock> {
  13. public:
  14. struct PhiNode {
  15. struct Branch {
  16. BasicBlockRef block;
  17. VariableRef value;
  18. };
  19. VariableRef var;
  20. Vector<Branch> branches;
  21. };
  22. BasicBlock(size_t index, NonnullRefPtr<ControlFlowOperator> continuation)
  23. : m_index(index)
  24. , m_continuation(move(continuation))
  25. , m_immediate_dominator(nullptr)
  26. {
  27. }
  28. size_t m_index;
  29. Vector<PhiNode> m_phi_nodes;
  30. Vector<Tree> m_expressions;
  31. NonnullRefPtr<ControlFlowOperator> m_continuation;
  32. BasicBlockRef m_immediate_dominator;
  33. };
  34. class ControlFlowGraph : public RefCounted<ControlFlowGraph> {
  35. public:
  36. ControlFlowGraph() { }
  37. size_t blocks_count() const { return blocks.size(); }
  38. Vector<NonnullRefPtr<BasicBlock>> blocks;
  39. BasicBlockRef start_block;
  40. BasicBlockRef end_block;
  41. };
  42. }
  43. namespace AK {
  44. template<>
  45. struct Formatter<JSSpecCompiler::ControlFlowGraph> : Formatter<StringView> {
  46. ErrorOr<void> format(FormatBuilder& builder, JSSpecCompiler::ControlFlowGraph const& control_flow_graph);
  47. };
  48. }