LLDB mainline
BreakpointList.cpp
Go to the documentation of this file.
1//===-- BreakpointList.cpp ------------------------------------------------===//
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
10
11#include "lldb/Target/Target.h"
12
13#include "llvm/Support/Errc.h"
14
15using namespace lldb;
16using namespace lldb_private;
17
18static void NotifyChange(const BreakpointSP &bp, BreakpointEventType event) {
19 Target &target = bp->GetTarget();
22 new Breakpoint::BreakpointEventData(event, bp));
23}
24
26 : m_next_break_id(0), m_is_internal(is_internal) {}
27
29
31 std::lock_guard<std::recursive_mutex> guard(m_mutex);
32
33 // Internal breakpoint IDs are negative, normal ones are positive
34 bp_sp->SetID(m_is_internal ? --m_next_break_id : ++m_next_break_id);
35
36 m_breakpoints.push_back(bp_sp);
37
38 if (notify)
39 NotifyChange(bp_sp, eBreakpointEventTypeAdded);
40
41 return bp_sp->GetID();
42}
43
44bool BreakpointList::Remove(break_id_t break_id, bool notify) {
45 std::lock_guard<std::recursive_mutex> guard(m_mutex);
46
47 auto it = std::find_if(
48 m_breakpoints.begin(), m_breakpoints.end(),
49 [&](const BreakpointSP &bp) { return bp->GetID() == break_id; });
50
51 if (it == m_breakpoints.end())
52 return false;
53
54 if (notify)
55 NotifyChange(*it, eBreakpointEventTypeRemoved);
56
57 m_breakpoints.erase(it);
58
59 return true;
60}
61
63 std::lock_guard<std::recursive_mutex> guard(m_mutex);
64 for (const auto &bp_sp : m_breakpoints)
65 bp_sp->RemoveInvalidLocations(arch);
66}
67
69 std::lock_guard<std::recursive_mutex> guard(m_mutex);
70 for (const auto &bp_sp : m_breakpoints)
71 bp_sp->SetEnabled(enabled);
72}
73
75 std::lock_guard<std::recursive_mutex> guard(m_mutex);
76 for (const auto &bp_sp : m_breakpoints)
77 if (bp_sp->AllowDisable())
78 bp_sp->SetEnabled(enabled);
79}
80
81void BreakpointList::RemoveAll(bool notify) {
82 std::lock_guard<std::recursive_mutex> guard(m_mutex);
84
85 if (notify) {
86 for (const auto &bp_sp : m_breakpoints)
87 NotifyChange(bp_sp, eBreakpointEventTypeRemoved);
88 }
89
90 m_breakpoints.clear();
91}
92
94 std::lock_guard<std::recursive_mutex> guard(m_mutex);
95
96 for (const auto &bp_sp : m_breakpoints) {
97 if (bp_sp->AllowDelete())
98 bp_sp->ClearAllBreakpointSites();
99 if (notify)
100 NotifyChange(bp_sp, eBreakpointEventTypeRemoved);
101 }
102
103 llvm::erase_if(m_breakpoints,
104 [&](const BreakpointSP &bp) { return bp->AllowDelete(); });
105}
106
107BreakpointList::bp_collection::iterator
109 return std::find_if(
110 m_breakpoints.begin(), m_breakpoints.end(),
111 [&](const BreakpointSP &bp) { return bp->GetID() == break_id; });
112}
113
114BreakpointList::bp_collection::const_iterator
116 return std::find_if(
117 m_breakpoints.begin(), m_breakpoints.end(),
118 [&](const BreakpointSP &bp) { return bp->GetID() == break_id; });
119}
120
122 std::lock_guard<std::recursive_mutex> guard(m_mutex);
123
124 auto it = GetBreakpointIDConstIterator(break_id);
125 if (it != m_breakpoints.end())
126 return *it;
127 return {};
128}
129
130llvm::Expected<std::vector<lldb::BreakpointSP>>
132 if (!name)
133 return llvm::createStringError(llvm::errc::invalid_argument,
134 "FindBreakpointsByName requires a name");
135
137 if (!BreakpointID::StringIsBreakpointName(llvm::StringRef(name), error))
138 return error.ToError();
139
140 std::vector<lldb::BreakpointSP> matching_bps;
141 for (BreakpointSP bkpt_sp : Breakpoints()) {
142 if (bkpt_sp->MatchesName(name)) {
143 matching_bps.push_back(bkpt_sp);
144 }
145 }
146
147 return matching_bps;
148}
149
151 std::lock_guard<std::recursive_mutex> guard(m_mutex);
152 s->Printf("%p: ", static_cast<const void *>(this));
153 s->Indent();
154 s->Printf("BreakpointList with %u Breakpoints:\n",
155 (uint32_t)m_breakpoints.size());
156 s->IndentMore();
157 for (const auto &bp_sp : m_breakpoints)
158 bp_sp->Dump(s);
159 s->IndentLess();
160}
161
163 std::lock_guard<std::recursive_mutex> guard(m_mutex);
164 if (i < m_breakpoints.size())
165 return m_breakpoints[i];
166 return {};
167}
168
169void BreakpointList::UpdateBreakpoints(ModuleList &module_list, bool added,
170 bool delete_locations) {
171 std::lock_guard<std::recursive_mutex> guard(m_mutex);
172 for (const auto &bp_sp : m_breakpoints)
173 bp_sp->ModulesChanged(module_list, added, delete_locations);
174}
175
177 ModuleSP old_module_sp, ModuleSP new_module_sp) {
178 std::lock_guard<std::recursive_mutex> guard(m_mutex);
179 for (const auto &bp_sp : m_breakpoints)
180 bp_sp->ModuleReplaced(old_module_sp, new_module_sp);
181}
182
184 std::lock_guard<std::recursive_mutex> guard(m_mutex);
185 for (const auto &bp_sp : m_breakpoints)
186 bp_sp->ClearAllBreakpointSites();
187}
188
190 std::lock_guard<std::recursive_mutex> guard(m_mutex);
191 for (const auto &bp_sp : m_breakpoints)
192 bp_sp->ResetHitCount();
193}
194
196 std::unique_lock<std::recursive_mutex> &lock) {
197 lock = std::unique_lock<std::recursive_mutex>(m_mutex);
198}
static void NotifyChange(const BreakpointSP &bp, BreakpointEventType event)
static llvm::raw_ostream & error(Stream &strm)
An architecture specification class.
Definition: ArchSpec.h:31
static bool StringIsBreakpointName(llvm::StringRef str, Status &error)
Takes an input string and checks to see whether it is a breakpoint name.
BreakpointIterable Breakpoints()
void RemoveInvalidLocations(const ArchSpec &arch)
Removes all invalid breakpoint locations.
lldb::BreakpointSP FindBreakpointByID(lldb::break_id_t breakID) const
Returns a shared pointer to the breakpoint with id breakID.
void GetListMutex(std::unique_lock< std::recursive_mutex > &lock)
Sets the passed in Locker to hold the Breakpoint List mutex.
bp_collection::const_iterator GetBreakpointIDConstIterator(lldb::break_id_t breakID) const
lldb::break_id_t Add(lldb::BreakpointSP &bp_sp, bool notify)
Add the breakpoint bp_sp to the list.
void SetEnabledAllowed(bool enabled)
bp_collection::iterator GetBreakpointIDIterator(lldb::break_id_t breakID)
BreakpointList(bool is_internal)
void ResetHitCounts()
Resets the hit count of all breakpoints.
void UpdateBreakpointsWhenModuleIsReplaced(lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp)
void RemoveAll(bool notify)
Removes all the breakpoints from this list.
void UpdateBreakpoints(ModuleList &module_list, bool load, bool delete_locations)
Tell all the breakpoints to update themselves due to a change in the modules in module_list.
std::recursive_mutex m_mutex
llvm::Expected< std::vector< lldb::BreakpointSP > > FindBreakpointsByName(const char *name)
Find all the breakpoints with a given name.
void Dump(Stream *s) const
Standard "Dump" method. At present it does nothing.
bool Remove(lldb::break_id_t breakID, bool notify)
Removes the breakpoint given by breakID from this list.
lldb::break_id_t m_next_break_id
void RemoveAllowed(bool notify)
Removes all the breakpoints from this list - first checking the ePermDelete on the breakpoints.
lldb::BreakpointSP GetBreakpointAtIndex(size_t i) const
Returns a shared pointer to the breakpoint with index i.
void SetEnabledAll(bool enabled)
bool EventTypeHasListeners(uint32_t event_type)
Definition: Broadcaster.h:251
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
Definition: Broadcaster.h:167
A collection class for Module objects.
Definition: ModuleList.h:82
An error handling class.
Definition: Status.h:44
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
Definition: Stream.cpp:130
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:107
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
Definition: Stream.cpp:171
void IndentMore(unsigned amount=2)
Increment the current indentation level.
Definition: Stream.cpp:168
@ eBroadcastBitBreakpointChanged
Definition: Target.h:490
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
Definition: SBAddress.h:15
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
Definition: lldb-forward.h:303
int32_t break_id_t
Definition: lldb-types.h:84
std::shared_ptr< lldb_private::Module > ModuleSP
Definition: lldb-forward.h:354