1 | //===- BreakpointManager.h - Breakpoint Manager Support ----*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef MLIR_TRACING_BREAKPOINTMANAGER_H |
10 | #define MLIR_TRACING_BREAKPOINTMANAGER_H |
11 | |
12 | #include "mlir/IR/Action.h" |
13 | #include "llvm/ADT/MapVector.h" |
14 | |
15 | namespace mlir { |
16 | namespace tracing { |
17 | |
18 | /// This abstract class represents a breakpoint. |
19 | class Breakpoint { |
20 | public: |
21 | virtual ~Breakpoint() = default; |
22 | |
23 | /// TypeID for the subclass, used for casting purpose. |
24 | TypeID getTypeID() const { return typeID; } |
25 | |
26 | bool isEnabled() const { return enableStatus; } |
27 | void enable() { enableStatus = true; } |
28 | void disable() { enableStatus = false; } |
29 | virtual void print(raw_ostream &os) const = 0; |
30 | |
31 | protected: |
32 | Breakpoint(TypeID typeID) : enableStatus(true), typeID(typeID) {} |
33 | |
34 | private: |
35 | /// The current state of the breakpoint. A breakpoint can be either enabled |
36 | /// or disabled. |
37 | bool enableStatus; |
38 | TypeID typeID; |
39 | }; |
40 | |
41 | inline raw_ostream &operator<<(raw_ostream &os, const Breakpoint &breakpoint) { |
42 | breakpoint.print(os); |
43 | return os; |
44 | } |
45 | |
46 | /// This class provides a CRTP wrapper around a base breakpoint class to define |
47 | /// a few necessary utility methods. |
48 | template <typename Derived> |
49 | class BreakpointBase : public Breakpoint { |
50 | public: |
51 | /// Support isa/dyn_cast functionality for the derived pass class. |
52 | static bool classof(const Breakpoint *breakpoint) { |
53 | return breakpoint->getTypeID() == TypeID::get<Derived>(); |
54 | } |
55 | |
56 | protected: |
57 | BreakpointBase() : Breakpoint(TypeID::get<Derived>()) {} |
58 | }; |
59 | |
60 | /// A breakpoint manager is responsible for managing a set of breakpoints and |
61 | /// matching them to a given action. |
62 | class BreakpointManager { |
63 | public: |
64 | virtual ~BreakpointManager() = default; |
65 | |
66 | /// TypeID for the subclass, used for casting purpose. |
67 | TypeID getTypeID() const { return typeID; } |
68 | |
69 | /// Try to match a Breakpoint to a given Action. If there is a match and |
70 | /// the breakpoint is enabled, return the breakpoint. Otherwise, return |
71 | /// nullptr. |
72 | virtual Breakpoint *match(const Action &action) const = 0; |
73 | |
74 | protected: |
75 | BreakpointManager(TypeID typeID) : typeID(typeID) {} |
76 | |
77 | TypeID typeID; |
78 | }; |
79 | |
80 | /// CRTP base class for BreakpointManager implementations. |
81 | template <typename Derived> |
82 | class BreakpointManagerBase : public BreakpointManager { |
83 | public: |
84 | BreakpointManagerBase() : BreakpointManager(TypeID::get<Derived>()) {} |
85 | |
86 | /// Provide classof to allow casting between breakpoint manager types. |
87 | static bool classof(const BreakpointManager *breakpointManager) { |
88 | return breakpointManager->getTypeID() == TypeID::get<Derived>(); |
89 | } |
90 | }; |
91 | |
92 | } // namespace tracing |
93 | } // namespace mlir |
94 | |
95 | #endif // MLIR_TRACING_BREAKPOINTMANAGER_H |
96 | |