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