BreakpointName.h 6.1 KB

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