xref: /freebsd/contrib/llvm-project/lldb/include/lldb/Breakpoint/BreakpointName.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===-- BreakpointName.h ----------------------------------------*- 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 LLDB_BREAKPOINT_BREAKPOINTNAME_H
10 #define LLDB_BREAKPOINT_BREAKPOINTNAME_H
11 
12 #include <memory>
13 #include <string>
14 #include <unordered_set>
15 #include <vector>
16 
17 #include "lldb/Breakpoint/BreakpointID.h"
18 #include "lldb/Breakpoint/BreakpointLocationCollection.h"
19 #include "lldb/Breakpoint/BreakpointLocationList.h"
20 #include "lldb/Breakpoint/BreakpointOptions.h"
21 #include "lldb/Breakpoint/Stoppoint.h"
22 #include "lldb/Core/SearchFilter.h"
23 #include "lldb/Utility/Event.h"
24 #include "lldb/Utility/Flags.h"
25 #include "lldb/Utility/StringList.h"
26 #include "lldb/Utility/StructuredData.h"
27 
28 namespace lldb_private {
29 
30 class BreakpointName {
31 public:
32   class Permissions
33   {
34   public:
35     enum PermissionKinds {
36       listPerm = 0,
37       disablePerm = 1,
38       deletePerm = 2,
39       allPerms = 3
40     };
41 
Permissions(bool in_list,bool in_disable,bool in_delete)42     Permissions(bool in_list, bool in_disable, bool in_delete) {
43       m_permissions[listPerm]    = in_list;
44       m_permissions[disablePerm] = in_disable;
45       m_permissions[deletePerm]  = in_delete;
46       m_set_mask.Set(permissions_mask[allPerms]);
47     }
48 
Permissions(const Permissions & rhs)49     Permissions(const Permissions &rhs)
50     {
51       m_permissions[listPerm]    = rhs.m_permissions[listPerm];
52       m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
53       m_permissions[deletePerm]  = rhs.m_permissions[deletePerm];
54       m_set_mask = rhs.m_set_mask;
55     }
56 
Permissions()57     Permissions() {
58       m_permissions[listPerm]    = true;
59       m_permissions[disablePerm] = true;
60       m_permissions[deletePerm]  = true;
61       m_set_mask.Clear();
62     }
63 
64     const Permissions &operator= (const Permissions &rhs)
65     {
66       if (this != &rhs) {
67         m_permissions[listPerm]    = rhs.m_permissions[listPerm];
68         m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
69         m_permissions[deletePerm]  = rhs.m_permissions[deletePerm];
70         m_set_mask = rhs.m_set_mask;
71       }
72       return *this;
73     }
74 
Clear()75     void Clear() {
76       *this = Permissions();
77     }
78 
79     // Merge the permissions from incoming into this set of permissions. Only
80     // merge set permissions, and most restrictive permission wins.
MergeInto(const Permissions & incoming)81     void MergeInto(const Permissions &incoming)
82     {
83       MergePermission(incoming, listPerm);
84       MergePermission(incoming, disablePerm);
85       MergePermission(incoming, deletePerm);
86     }
87 
GetAllowList()88     bool GetAllowList() const { return GetPermission(listPerm); }
SetAllowList(bool value)89     bool SetAllowList(bool value) { return SetPermission(listPerm, value); }
90 
GetAllowDelete()91     bool GetAllowDelete() const { return GetPermission(deletePerm); }
SetAllowDelete(bool value)92     bool SetAllowDelete(bool value) { return SetPermission(deletePerm, value); }
93 
GetAllowDisable()94     bool GetAllowDisable() const { return GetPermission(disablePerm); }
SetAllowDisable(bool value)95     bool SetAllowDisable(bool value) {
96       return SetPermission(disablePerm, value);
97     }
98 
GetPermission(enum PermissionKinds permission)99     bool GetPermission(enum PermissionKinds permission) const
100     {
101       return m_permissions[permission];
102     }
103 
104     bool GetDescription(Stream *s, lldb::DescriptionLevel level);
105 
IsSet(enum PermissionKinds permission)106     bool IsSet(enum PermissionKinds permission) const
107     {
108       return m_set_mask.Test(permissions_mask[permission]);
109     }
110 
AnySet()111     bool AnySet() {
112       return m_set_mask.AnySet(permissions_mask[allPerms]);
113     }
114 
115   private:
116     static const Flags::ValueType permissions_mask[allPerms + 1];
117 
118     bool m_permissions[allPerms];
119     Flags m_set_mask;
120 
SetPermission(enum PermissionKinds permission,bool value)121     bool SetPermission(enum PermissionKinds permission, bool value)
122     {
123       bool old_value = m_permissions[permission];
124       m_permissions[permission] = value;
125       m_set_mask.Set(permissions_mask[permission]);
126       return old_value;
127     }
128 
129     // If either side disallows the permission, the resultant disallows it.
MergePermission(const Permissions & incoming,enum PermissionKinds permission)130     void MergePermission(const Permissions &incoming,
131                          enum PermissionKinds permission) {
132       if (incoming.IsSet(permission))
133       {
134         SetPermission(permission, !(m_permissions[permission] |
135             incoming.m_permissions[permission]));
136       }
137     }
138   };
139 
140   BreakpointName(ConstString name, const char *help = nullptr) :
m_name(name)141       m_name(name), m_options(false)
142    {
143      SetHelp(help);
144    }
145 
BreakpointName(const BreakpointName & rhs)146   BreakpointName(const BreakpointName &rhs) :
147       m_name(rhs.m_name), m_options(rhs.m_options),
148       m_permissions(rhs.m_permissions), m_help(rhs.m_help)
149   {}
150 
GetName()151   ConstString GetName() const { return m_name; }
GetOptions()152   BreakpointOptions &GetOptions() { return m_options; }
GetOptions()153   const BreakpointOptions &GetOptions() const { return m_options; }
154 
SetOptions(const BreakpointOptions & options)155   void SetOptions(const BreakpointOptions &options) {
156     m_options = options;
157   }
158 
GetPermissions()159   Permissions &GetPermissions() { return m_permissions; }
GetPermissions()160   const Permissions &GetPermissions() const { return m_permissions; }
SetPermissions(const Permissions & permissions)161   void SetPermissions(const Permissions &permissions) {
162     m_permissions = permissions;
163   }
164 
GetPermission(Permissions::PermissionKinds permission)165   bool GetPermission(Permissions::PermissionKinds permission) const
166   {
167     return m_permissions.GetPermission(permission);
168   }
169 
SetHelp(const char * description)170   void SetHelp(const char *description)
171   {
172     if (description)
173       m_help.assign(description);
174     else
175       m_help.clear();
176   }
177 
GetHelp()178   const char *GetHelp()
179   {
180     return m_help.c_str();
181   }
182 
183   // Returns true if any options were set in the name
184   bool GetDescription(Stream *s, lldb::DescriptionLevel level);
185 
186   void ConfigureBreakpoint(lldb::BreakpointSP bp_sp);
187 
188 private:
189   ConstString        m_name;
190   BreakpointOptions  m_options;
191   Permissions        m_permissions;
192   std::string        m_help;
193 };
194 
195 } // namespace lldb_private
196 
197 #endif // LLDB_BREAKPOINT_BREAKPOINTNAME_H
198