1 //===-- BreakpointName.h --------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_BREAKPOINT_BREAKPOINTNAME_H
10 #define LLDB_BREAKPOINT_BREAKPOINTNAME_H
14 #include <unordered_set>
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"
28 namespace lldb_private {
30 class BreakpointName {
36 enum PermissionKinds { listPerm = 0, disablePerm = 1,
37 deletePerm = 2, allPerms = 3 };
39 Permissions(bool in_list, bool in_disable, bool in_delete)
41 m_permissions[listPerm] = in_list;
42 m_permissions[disablePerm] = in_disable;
43 m_permissions[deletePerm] = in_delete;
44 m_set_mask.Set(permissions_mask[allPerms]);
47 Permissions(const Permissions &rhs)
49 m_permissions[listPerm] = rhs.m_permissions[listPerm];
50 m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
51 m_permissions[deletePerm] = rhs.m_permissions[deletePerm];
52 m_set_mask = rhs.m_set_mask;
57 m_permissions[listPerm] = true;
58 m_permissions[disablePerm] = true;
59 m_permissions[deletePerm] = true;
63 const Permissions &operator= (const Permissions &rhs)
66 m_permissions[listPerm] = rhs.m_permissions[listPerm];
67 m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
68 m_permissions[deletePerm] = rhs.m_permissions[deletePerm];
69 m_set_mask = rhs.m_set_mask;
75 *this = Permissions();
78 // Merge the permissions from incoming into this set of permissions. Only
79 // merge set permissions, and most restrictive permission wins.
80 void MergeInto(const Permissions &incoming)
82 MergePermission(incoming, listPerm);
83 MergePermission(incoming, disablePerm);
84 MergePermission(incoming, deletePerm);
87 bool GetAllowList() const { return GetPermission(listPerm); }
88 bool SetAllowList(bool value) { return SetPermission(listPerm, value); }
90 bool GetAllowDelete() const { return GetPermission(deletePerm); }
91 bool SetAllowDelete(bool value) { return SetPermission(deletePerm, value); }
93 bool GetAllowDisable() const { return GetPermission(disablePerm); }
94 bool SetAllowDisable(bool value) { return SetPermission(disablePerm,
97 bool GetPermission(enum PermissionKinds permission) const
99 return m_permissions[permission];
102 bool GetDescription(Stream *s, lldb::DescriptionLevel level);
104 bool IsSet(enum PermissionKinds permission) const
106 return m_set_mask.Test(permissions_mask[permission]);
110 return m_set_mask.AnySet(permissions_mask[allPerms]);
114 static const Flags::ValueType permissions_mask[allPerms + 1];
116 bool m_permissions[allPerms];
119 bool SetPermission(enum PermissionKinds permission, bool value)
121 bool old_value = m_permissions[permission];
122 m_permissions[permission] = value;
123 m_set_mask.Set(permissions_mask[permission]);
127 // If either side disallows the permission, the resultant disallows it.
128 void MergePermission(const Permissions &incoming,
129 enum PermissionKinds permission)
131 if (incoming.IsSet(permission))
133 SetPermission(permission, !(m_permissions[permission] |
134 incoming.m_permissions[permission]));
139 BreakpointName(ConstString name, const char *help = nullptr) :
140 m_name(name), m_options(false)
145 BreakpointName(ConstString name,
146 BreakpointOptions &options,
147 const Permissions &permissions = Permissions(),
148 const char *help = nullptr) :
149 m_name(name), m_options(options),
150 m_permissions(permissions) {
154 BreakpointName(const BreakpointName &rhs) :
155 m_name(rhs.m_name), m_options(rhs.m_options),
156 m_permissions(rhs.m_permissions), m_help(rhs.m_help)
159 BreakpointName(ConstString name, const Breakpoint &bkpt,
162 ConstString GetName() const { return m_name; }
163 BreakpointOptions &GetOptions() { return m_options; }
164 const BreakpointOptions &GetOptions() const { return m_options; }
166 void SetOptions(const BreakpointOptions &options) {
170 Permissions &GetPermissions() { return m_permissions; }
171 const Permissions &GetPermissions() const { return m_permissions; }
172 void SetPermissions(const Permissions &permissions) {
173 m_permissions = permissions;
176 bool GetPermission(Permissions::PermissionKinds permission) const
178 return m_permissions.GetPermission(permission);
181 void SetHelp(const char *description)
184 m_help.assign(description);
189 const char *GetHelp()
191 return m_help.c_str();
194 // Returns true if any options were set in the name
195 bool GetDescription(Stream *s, lldb::DescriptionLevel level);
197 void ConfigureBreakpoint(lldb::BreakpointSP bp_sp);
201 BreakpointOptions m_options;
202 Permissions m_permissions;
206 } // namespace lldb_private
208 #endif // LLDB_BREAKPOINT_BREAKPOINTNAME_H