1 //===-- ThreadPlanRunToAddress.cpp ------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // Other libraries and framework includes
14 #include "lldb/Target/ThreadPlanRunToAddress.h"
15 #include "lldb/Core/Log.h"
16 #include "lldb/Core/Stream.h"
17 #include "lldb/Target/Target.h"
18 #include "lldb/Target/Process.h"
19 #include "lldb/Target/Thread.h"
20 #include "lldb/Target/RegisterContext.h"
23 using namespace lldb_private;
25 //----------------------------------------------------------------------
26 // ThreadPlanRunToAddress: Continue plan
27 //----------------------------------------------------------------------
29 ThreadPlanRunToAddress::ThreadPlanRunToAddress
35 ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
36 m_stop_others (stop_others),
40 m_addresses.push_back (address.GetOpcodeLoadAddress (m_thread.CalculateTarget().get()));
41 SetInitialBreakpoints();
44 ThreadPlanRunToAddress::ThreadPlanRunToAddress
50 ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
51 m_stop_others (stop_others),
55 m_addresses.push_back(m_thread.CalculateTarget()->GetOpcodeLoadAddress(address));
56 SetInitialBreakpoints();
59 ThreadPlanRunToAddress::ThreadPlanRunToAddress
62 const std::vector<lldb::addr_t> &addresses,
65 ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
66 m_stop_others (stop_others),
67 m_addresses (addresses),
70 // Convert all addresses into opcode addresses to make sure we set
71 // breakpoints at the correct address.
72 Target &target = thread.GetProcess()->GetTarget();
73 std::vector<lldb::addr_t>::iterator pos, end = m_addresses.end();
74 for (pos = m_addresses.begin(); pos != end; ++pos)
75 *pos = target.GetOpcodeLoadAddress (*pos);
77 SetInitialBreakpoints();
81 ThreadPlanRunToAddress::SetInitialBreakpoints ()
83 size_t num_addresses = m_addresses.size();
84 m_break_ids.resize(num_addresses);
86 for (size_t i = 0; i < num_addresses; i++)
88 Breakpoint *breakpoint;
89 breakpoint = m_thread.CalculateTarget()->CreateBreakpoint (m_addresses[i], true, false).get();
90 if (breakpoint != nullptr)
92 m_break_ids[i] = breakpoint->GetID();
93 breakpoint->SetThreadID(m_thread.GetID());
94 breakpoint->SetBreakpointKind("run-to-address");
99 ThreadPlanRunToAddress::~ThreadPlanRunToAddress ()
101 size_t num_break_ids = m_break_ids.size();
102 for (size_t i = 0; i < num_break_ids; i++)
104 m_thread.CalculateTarget()->RemoveBreakpointByID (m_break_ids[i]);
109 ThreadPlanRunToAddress::GetDescription (Stream *s, lldb::DescriptionLevel level)
111 size_t num_addresses = m_addresses.size();
113 if (level == lldb::eDescriptionLevelBrief)
115 if (num_addresses == 0)
117 s->Printf ("run to address with no addresses given.");
120 else if (num_addresses == 1)
121 s->Printf ("run to address: ");
123 s->Printf ("run to addresses: ");
125 for (size_t i = 0; i < num_addresses; i++)
127 s->Address (m_addresses[i], sizeof (addr_t));
133 if (num_addresses == 0)
135 s->Printf ("run to address with no addresses given.");
138 else if (num_addresses == 1)
139 s->Printf ("Run to address: ");
142 s->Printf ("Run to addresses: ");
145 for (size_t i = 0; i < num_addresses; i++)
147 if (num_addresses > 1)
153 s->Address(m_addresses[i], sizeof (addr_t));
154 s->Printf (" using breakpoint: %d - ", m_break_ids[i]);
155 Breakpoint *breakpoint = m_thread.CalculateTarget()->GetBreakpointByID (m_break_ids[i]).get();
157 breakpoint->Dump (s);
159 s->Printf ("but the breakpoint has been deleted.");
165 ThreadPlanRunToAddress::ValidatePlan (Stream *error)
167 // If we couldn't set the breakpoint for some reason, then this won't
169 bool all_bps_good = true;
170 size_t num_break_ids = m_break_ids.size();
172 for (size_t i = 0; i < num_break_ids; i++)
174 if (m_break_ids[i] == LLDB_INVALID_BREAK_ID)
176 all_bps_good = false;
179 error->Printf ("Could not set breakpoint for address: ");
180 error->Address (m_addresses[i], sizeof (addr_t));
181 error->Printf ("\n");
189 ThreadPlanRunToAddress::DoPlanExplainsStop (Event *event_ptr)
191 return AtOurAddress();
195 ThreadPlanRunToAddress::ShouldStop (Event *event_ptr)
197 return AtOurAddress();
201 ThreadPlanRunToAddress::StopOthers ()
203 return m_stop_others;
207 ThreadPlanRunToAddress::SetStopOthers (bool new_value)
209 m_stop_others = new_value;
213 ThreadPlanRunToAddress::GetPlanRunState ()
215 return eStateRunning;
219 ThreadPlanRunToAddress::WillStop ()
225 ThreadPlanRunToAddress::MischiefManaged ()
227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
231 // Remove the breakpoint
232 size_t num_break_ids = m_break_ids.size();
234 for (size_t i = 0; i < num_break_ids; i++)
236 if (m_break_ids[i] != LLDB_INVALID_BREAK_ID)
238 m_thread.CalculateTarget()->RemoveBreakpointByID (m_break_ids[i]);
239 m_break_ids[i] = LLDB_INVALID_BREAK_ID;
243 log->Printf("Completed run to address plan.");
244 ThreadPlan::MischiefManaged ();
252 ThreadPlanRunToAddress::AtOurAddress ()
254 lldb::addr_t current_address = m_thread.GetRegisterContext()->GetPC();
255 bool found_it = false;
256 size_t num_addresses = m_addresses.size();
257 for (size_t i = 0; i < num_addresses; i++)
259 if (m_addresses[i] == current_address)