blob: 7a58441fb3ce25e4fc2d5a12c9135e3bd91d86d6 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- CommandObjectThread.cpp ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner24943d22010-06-08 16:52:24 +000012#include "CommandObjectThread.h"
13
14// C Includes
15// C++ Includes
16// Other libraries and framework includes
17// Project includes
Jim Inghamf59388a2012-09-14 02:14:15 +000018#include "lldb/lldb-private.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/State.h"
20#include "lldb/Core/SourceManager.h"
Greg Claytoncd548032011-02-01 01:31:41 +000021#include "lldb/Host/Host.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Interpreter/CommandInterpreter.h"
23#include "lldb/Interpreter/CommandReturnObject.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000024#include "lldb/Interpreter/Options.h"
25#include "lldb/Symbol/CompileUnit.h"
26#include "lldb/Symbol/Function.h"
27#include "lldb/Symbol/LineTable.h"
28#include "lldb/Symbol/LineEntry.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Target/Process.h"
30#include "lldb/Target/RegisterContext.h"
31#include "lldb/Target/Target.h"
32#include "lldb/Target/Thread.h"
33#include "lldb/Target/ThreadPlan.h"
Chris Lattner24943d22010-06-08 16:52:24 +000034#include "lldb/Target/ThreadPlanStepInstruction.h"
35#include "lldb/Target/ThreadPlanStepOut.h"
36#include "lldb/Target/ThreadPlanStepRange.h"
37#include "lldb/Target/ThreadPlanStepInRange.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000038
Chris Lattner24943d22010-06-08 16:52:24 +000039
40using namespace lldb;
41using namespace lldb_private;
42
43
Chris Lattner24943d22010-06-08 16:52:24 +000044//-------------------------------------------------------------------------
45// CommandObjectThreadBacktrace
46//-------------------------------------------------------------------------
47
Jim Inghamda26bd22012-06-08 21:56:10 +000048class CommandObjectThreadBacktrace : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +000049{
50public:
51
Jim Ingham8ab1a802010-08-26 23:36:03 +000052 class CommandOptions : public Options
53 {
54 public:
55
Greg Claytonf15996e2011-04-07 22:46:35 +000056 CommandOptions (CommandInterpreter &interpreter) :
57 Options(interpreter)
Jim Ingham8ab1a802010-08-26 23:36:03 +000058 {
Greg Clayton143fcc32011-04-13 00:18:08 +000059 // Keep default values of all options in one place: OptionParsingStarting ()
60 OptionParsingStarting ();
Jim Ingham8ab1a802010-08-26 23:36:03 +000061 }
62
63 virtual
64 ~CommandOptions ()
65 {
66 }
67
68 virtual Error
Greg Clayton143fcc32011-04-13 00:18:08 +000069 SetOptionValue (uint32_t option_idx, const char *option_arg)
Jim Ingham8ab1a802010-08-26 23:36:03 +000070 {
71 Error error;
Greg Clayton6475c422012-12-04 00:32:51 +000072 const int short_option = m_getopt_table[option_idx].val;
Jim Ingham8ab1a802010-08-26 23:36:03 +000073
74 switch (short_option)
75 {
76 case 'c':
77 {
78 bool success;
79 int32_t input_count = Args::StringToSInt32 (option_arg, -1, 0, &success);
80 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +000081 error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option);
Jim Ingham8ab1a802010-08-26 23:36:03 +000082 if (input_count < -1)
83 m_count = UINT32_MAX;
84 else
85 m_count = input_count;
86 }
87 break;
88 case 's':
89 {
90 bool success;
91 m_start = Args::StringToUInt32 (option_arg, 0, 0, &success);
92 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +000093 error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option);
Jim Ingham8ab1a802010-08-26 23:36:03 +000094 }
95 break;
96 default:
Greg Clayton9c236732011-10-26 00:56:27 +000097 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
Jim Ingham8ab1a802010-08-26 23:36:03 +000098 break;
99
100 }
101 return error;
102 }
103
104 void
Greg Clayton143fcc32011-04-13 00:18:08 +0000105 OptionParsingStarting ()
Jim Ingham8ab1a802010-08-26 23:36:03 +0000106 {
Greg Claytonabe0fed2011-04-18 08:33:37 +0000107 m_count = UINT32_MAX;
Jim Ingham8ab1a802010-08-26 23:36:03 +0000108 m_start = 0;
109 }
110
Greg Claytonb3448432011-03-24 21:19:54 +0000111 const OptionDefinition*
Jim Ingham8ab1a802010-08-26 23:36:03 +0000112 GetDefinitions ()
113 {
114 return g_option_table;
115 }
116
117 // Options table: Required for subclasses of Options.
118
Greg Claytonb3448432011-03-24 21:19:54 +0000119 static OptionDefinition g_option_table[];
Jim Ingham8ab1a802010-08-26 23:36:03 +0000120
121 // Instance variables to hold the values for command options.
122 uint32_t m_count;
123 uint32_t m_start;
124 };
125
Greg Clayton238c0a12010-09-18 01:14:36 +0000126 CommandObjectThreadBacktrace (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000127 CommandObjectParsed (interpreter,
128 "thread backtrace",
129 "Show the stack for one or more threads. If no threads are specified, show the currently selected thread. Use the thread-index \"all\" to see all threads.",
130 NULL,
131 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
Greg Claytonf15996e2011-04-07 22:46:35 +0000132 m_options(interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000133 {
Caroline Tice43b014a2010-10-04 22:28:36 +0000134 CommandArgumentEntry arg;
135 CommandArgumentData thread_idx_arg;
136
137 // Define the first (and only) variant of this arg.
138 thread_idx_arg.arg_type = eArgTypeThreadIndex;
139 thread_idx_arg.arg_repetition = eArgRepeatStar;
140
141 // There is only one variant this argument could be; put it into the argument entry.
142 arg.push_back (thread_idx_arg);
143
144 // Push the data for the first argument into the m_arguments vector.
145 m_arguments.push_back (arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000146 }
147
148 ~CommandObjectThreadBacktrace()
149 {
150 }
151
Jim Ingham8ab1a802010-08-26 23:36:03 +0000152 virtual Options *
153 GetOptions ()
154 {
155 return &m_options;
156 }
Chris Lattner24943d22010-06-08 16:52:24 +0000157
Jim Inghamda26bd22012-06-08 21:56:10 +0000158protected:
Greg Clayton63094e02010-06-23 01:19:29 +0000159 virtual bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000160 DoExecute (Args& command, CommandReturnObject &result)
Greg Claytonabe0fed2011-04-18 08:33:37 +0000161 {
Jim Inghameb10f7b2010-08-27 00:58:05 +0000162 result.SetStatus (eReturnStatusSuccessFinishResult);
Greg Claytonabe0fed2011-04-18 08:33:37 +0000163 Stream &strm = result.GetOutputStream();
164
165 // Don't show source context when doing backtraces.
166 const uint32_t num_frames_with_source = 0;
Chris Lattner24943d22010-06-08 16:52:24 +0000167 if (command.GetArgumentCount() == 0)
168 {
Greg Claytonb72d0f02011-04-12 05:54:46 +0000169 ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
Greg Clayton567e7f32011-09-22 04:58:26 +0000170 Thread *thread = exe_ctx.GetThreadPtr();
171 if (thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000172 {
Johnny Chen2d268cb2011-06-02 18:02:15 +0000173 // Thread::GetStatus() returns the number of frames shown.
Greg Clayton567e7f32011-09-22 04:58:26 +0000174 if (thread->GetStatus (strm,
175 m_options.m_start,
176 m_options.m_count,
177 num_frames_with_source))
Chris Lattner24943d22010-06-08 16:52:24 +0000178 {
179 result.SetStatus (eReturnStatusSuccessFinishResult);
180 }
181 }
182 else
183 {
184 result.AppendError ("invalid thread");
185 result.SetStatus (eReturnStatusFailed);
186 }
187 }
Jim Inghameb10f7b2010-08-27 00:58:05 +0000188 else if (command.GetArgumentCount() == 1 && ::strcmp (command.GetArgumentAtIndex(0), "all") == 0)
189 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000190 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Jim Inghamb9950592012-09-10 20:50:15 +0000191 Mutex::Locker locker (process->GetThreadList().GetMutex());
Jim Inghameb10f7b2010-08-27 00:58:05 +0000192 uint32_t num_threads = process->GetThreadList().GetSize();
193 for (uint32_t i = 0; i < num_threads; i++)
194 {
195 ThreadSP thread_sp = process->GetThreadList().GetThreadAtIndex(i);
Johnny Chen05750a62011-06-01 23:19:52 +0000196 if (!thread_sp->GetStatus (strm,
197 m_options.m_start,
198 m_options.m_count,
199 num_frames_with_source))
Jim Inghameb10f7b2010-08-27 00:58:05 +0000200 {
Greg Claytonf04d6612010-09-03 22:45:01 +0000201 result.AppendErrorWithFormat ("error displaying backtrace for thread: \"0x%4.4x\"\n", i);
Jim Inghameb10f7b2010-08-27 00:58:05 +0000202 result.SetStatus (eReturnStatusFailed);
203 return false;
204 }
Jim Ingham7868bcc2011-07-26 02:39:59 +0000205
206 if (i < num_threads - 1)
207 result.AppendMessage("");
208
Jim Inghameb10f7b2010-08-27 00:58:05 +0000209 }
210 }
Chris Lattner24943d22010-06-08 16:52:24 +0000211 else
212 {
Jim Inghameb10f7b2010-08-27 00:58:05 +0000213 uint32_t num_args = command.GetArgumentCount();
Greg Clayton567e7f32011-09-22 04:58:26 +0000214 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Jim Inghamb9950592012-09-10 20:50:15 +0000215 Mutex::Locker locker (process->GetThreadList().GetMutex());
Jim Inghameb10f7b2010-08-27 00:58:05 +0000216 std::vector<ThreadSP> thread_sps;
217
218 for (uint32_t i = 0; i < num_args; i++)
219 {
220 bool success;
221
222 uint32_t thread_idx = Args::StringToUInt32(command.GetArgumentAtIndex(i), 0, 0, &success);
223 if (!success)
224 {
225 result.AppendErrorWithFormat ("invalid thread specification: \"%s\"\n", command.GetArgumentAtIndex(i));
226 result.SetStatus (eReturnStatusFailed);
227 return false;
228 }
229
230 thread_sps.push_back(process->GetThreadList().FindThreadByIndexID(thread_idx));
231
232 if (!thread_sps[i])
233 {
234 result.AppendErrorWithFormat ("no thread with index: \"%s\"\n", command.GetArgumentAtIndex(i));
235 result.SetStatus (eReturnStatusFailed);
236 return false;
237 }
238
239 }
240
241 for (uint32_t i = 0; i < num_args; i++)
242 {
Greg Claytonabe0fed2011-04-18 08:33:37 +0000243 if (!thread_sps[i]->GetStatus (strm,
244 m_options.m_start,
245 m_options.m_count,
246 num_frames_with_source))
Jim Inghameb10f7b2010-08-27 00:58:05 +0000247 {
248 result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%s\"\n", command.GetArgumentAtIndex(i));
249 result.SetStatus (eReturnStatusFailed);
250 return false;
251 }
252
253 if (i < num_args - 1)
254 result.AppendMessage("");
255 }
Chris Lattner24943d22010-06-08 16:52:24 +0000256 }
257 return result.Succeeded();
258 }
Jim Inghamda26bd22012-06-08 21:56:10 +0000259
Jim Ingham8ab1a802010-08-26 23:36:03 +0000260 CommandOptions m_options;
Chris Lattner24943d22010-06-08 16:52:24 +0000261};
262
Greg Claytonb3448432011-03-24 21:19:54 +0000263OptionDefinition
Jim Ingham8ab1a802010-08-26 23:36:03 +0000264CommandObjectThreadBacktrace::CommandOptions::g_option_table[] =
265{
Caroline Tice4d6675c2010-10-01 19:59:14 +0000266{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "How many frames to display (-1 for all)"},
Caroline Tice43b014a2010-10-04 22:28:36 +0000267{ LLDB_OPT_SET_1, false, "start", 's', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame in which to start the backtrace"},
Caroline Tice4d6675c2010-10-01 19:59:14 +0000268{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
Jim Ingham8ab1a802010-08-26 23:36:03 +0000269};
Chris Lattner24943d22010-06-08 16:52:24 +0000270
Greg Claytonc0418152010-07-07 17:07:17 +0000271enum StepScope
Chris Lattner24943d22010-06-08 16:52:24 +0000272{
273 eStepScopeSource,
274 eStepScopeInstruction
275};
276
Jim Inghamda26bd22012-06-08 21:56:10 +0000277class CommandObjectThreadStepWithTypeAndScope : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +0000278{
279public:
280
281 class CommandOptions : public Options
282 {
283 public:
284
Greg Claytonf15996e2011-04-07 22:46:35 +0000285 CommandOptions (CommandInterpreter &interpreter) :
286 Options (interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000287 {
Greg Clayton143fcc32011-04-13 00:18:08 +0000288 // Keep default values of all options in one place: OptionParsingStarting ()
289 OptionParsingStarting ();
Chris Lattner24943d22010-06-08 16:52:24 +0000290 }
291
292 virtual
293 ~CommandOptions ()
294 {
295 }
296
297 virtual Error
Greg Clayton143fcc32011-04-13 00:18:08 +0000298 SetOptionValue (uint32_t option_idx, const char *option_arg)
Chris Lattner24943d22010-06-08 16:52:24 +0000299 {
300 Error error;
Greg Clayton6475c422012-12-04 00:32:51 +0000301 const int short_option = m_getopt_table[option_idx].val;
Chris Lattner24943d22010-06-08 16:52:24 +0000302
303 switch (short_option)
304 {
Greg Clayton8d3802d2010-10-08 04:20:14 +0000305 case 'a':
Chris Lattner24943d22010-06-08 16:52:24 +0000306 {
307 bool success;
308 m_avoid_no_debug = Args::StringToBoolean (option_arg, true, &success);
309 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +0000310 error.SetErrorStringWithFormat("invalid boolean value for option '%c'", short_option);
Chris Lattner24943d22010-06-08 16:52:24 +0000311 }
312 break;
Greg Clayton8d3802d2010-10-08 04:20:14 +0000313
314 case 'm':
Chris Lattner24943d22010-06-08 16:52:24 +0000315 {
Chris Lattner24943d22010-06-08 16:52:24 +0000316 OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values;
Greg Clayton61aca5d2011-10-07 18:58:12 +0000317 m_run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000318 }
319 break;
Greg Clayton8d3802d2010-10-08 04:20:14 +0000320
321 case 'r':
Jim Ingham809ab9b2010-07-10 02:27:39 +0000322 {
323 m_avoid_regexp.clear();
324 m_avoid_regexp.assign(option_arg);
325 }
326 break;
Greg Clayton8d3802d2010-10-08 04:20:14 +0000327
Jim Inghamf2ca5732012-12-12 19:58:40 +0000328 case 't':
329 {
330 m_step_in_target.clear();
331 m_step_in_target.assign(option_arg);
332
333 }
334 break;
Greg Clayton8d3802d2010-10-08 04:20:14 +0000335 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000336 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
Greg Clayton8d3802d2010-10-08 04:20:14 +0000337 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000338
339 }
340 return error;
341 }
342
343 void
Greg Clayton143fcc32011-04-13 00:18:08 +0000344 OptionParsingStarting ()
Chris Lattner24943d22010-06-08 16:52:24 +0000345 {
Chris Lattner24943d22010-06-08 16:52:24 +0000346 m_avoid_no_debug = true;
347 m_run_mode = eOnlyDuringStepping;
Jim Ingham809ab9b2010-07-10 02:27:39 +0000348 m_avoid_regexp.clear();
Jim Inghamf2ca5732012-12-12 19:58:40 +0000349 m_step_in_target.clear();
Chris Lattner24943d22010-06-08 16:52:24 +0000350 }
351
Greg Claytonb3448432011-03-24 21:19:54 +0000352 const OptionDefinition*
Chris Lattner24943d22010-06-08 16:52:24 +0000353 GetDefinitions ()
354 {
355 return g_option_table;
356 }
357
358 // Options table: Required for subclasses of Options.
359
Greg Claytonb3448432011-03-24 21:19:54 +0000360 static OptionDefinition g_option_table[];
Chris Lattner24943d22010-06-08 16:52:24 +0000361
362 // Instance variables to hold the values for command options.
363 bool m_avoid_no_debug;
364 RunMode m_run_mode;
Jim Ingham809ab9b2010-07-10 02:27:39 +0000365 std::string m_avoid_regexp;
Jim Inghamf2ca5732012-12-12 19:58:40 +0000366 std::string m_step_in_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000367 };
368
Greg Clayton238c0a12010-09-18 01:14:36 +0000369 CommandObjectThreadStepWithTypeAndScope (CommandInterpreter &interpreter,
370 const char *name,
371 const char *help,
372 const char *syntax,
373 uint32_t flags,
374 StepType step_type,
375 StepScope step_scope) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000376 CommandObjectParsed (interpreter, name, help, syntax, flags),
Chris Lattner24943d22010-06-08 16:52:24 +0000377 m_step_type (step_type),
378 m_step_scope (step_scope),
Greg Claytonf15996e2011-04-07 22:46:35 +0000379 m_options (interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000380 {
Caroline Tice43b014a2010-10-04 22:28:36 +0000381 CommandArgumentEntry arg;
382 CommandArgumentData thread_id_arg;
383
384 // Define the first (and only) variant of this arg.
385 thread_id_arg.arg_type = eArgTypeThreadID;
386 thread_id_arg.arg_repetition = eArgRepeatOptional;
387
388 // There is only one variant this argument could be; put it into the argument entry.
389 arg.push_back (thread_id_arg);
390
391 // Push the data for the first argument into the m_arguments vector.
392 m_arguments.push_back (arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000393 }
394
395 virtual
396 ~CommandObjectThreadStepWithTypeAndScope ()
397 {
398 }
399
400 virtual
401 Options *
402 GetOptions ()
403 {
404 return &m_options;
405 }
406
Jim Inghamda26bd22012-06-08 21:56:10 +0000407protected:
Chris Lattner24943d22010-06-08 16:52:24 +0000408 virtual bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000409 DoExecute (Args& command, CommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000410 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000411 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Greg Clayton238c0a12010-09-18 01:14:36 +0000412 bool synchronous_execution = m_interpreter.GetSynchronous();
Chris Lattner24943d22010-06-08 16:52:24 +0000413
414 if (process == NULL)
415 {
416 result.AppendError ("need a valid process to step");
417 result.SetStatus (eReturnStatusFailed);
418
419 }
420 else
421 {
422 const uint32_t num_threads = process->GetThreadList().GetSize();
423 Thread *thread = NULL;
424
425 if (command.GetArgumentCount() == 0)
426 {
Jim Inghamc8332952010-08-26 21:32:51 +0000427 thread = process->GetThreadList().GetSelectedThread().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000428 if (thread == NULL)
429 {
Jim Ingham8ab1a802010-08-26 23:36:03 +0000430 result.AppendError ("no selected thread in process");
Chris Lattner24943d22010-06-08 16:52:24 +0000431 result.SetStatus (eReturnStatusFailed);
432 return false;
433 }
434 }
435 else
436 {
437 const char *thread_idx_cstr = command.GetArgumentAtIndex(0);
438 uint32_t step_thread_idx = Args::StringToUInt32 (thread_idx_cstr, LLDB_INVALID_INDEX32);
439 if (step_thread_idx == LLDB_INVALID_INDEX32)
440 {
Greg Clayton9c236732011-10-26 00:56:27 +0000441 result.AppendErrorWithFormat ("invalid thread index '%s'.\n", thread_idx_cstr);
Chris Lattner24943d22010-06-08 16:52:24 +0000442 result.SetStatus (eReturnStatusFailed);
443 return false;
444 }
445 thread = process->GetThreadList().FindThreadByIndexID(step_thread_idx).get();
446 if (thread == NULL)
447 {
448 result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n",
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000449 step_thread_idx, num_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000450 result.SetStatus (eReturnStatusFailed);
451 return false;
452 }
453 }
454
455 const bool abort_other_plans = false;
456 const lldb::RunMode stop_other_threads = m_options.m_run_mode;
457
458 // This is a bit unfortunate, but not all the commands in this command object support
459 // only while stepping, so I use the bool for them.
460 bool bool_stop_other_threads;
461 if (m_options.m_run_mode == eAllThreads)
462 bool_stop_other_threads = false;
Jim Inghambb9ce3e2012-09-14 21:04:15 +0000463 else if (m_options.m_run_mode == eOnlyDuringStepping)
464 {
465 if (m_step_type == eStepTypeOut)
466 bool_stop_other_threads = false;
467 else
468 bool_stop_other_threads = true;
469 }
Chris Lattner24943d22010-06-08 16:52:24 +0000470 else
471 bool_stop_other_threads = true;
472
Jim Ingham88e3de22012-05-03 21:19:36 +0000473 ThreadPlan *new_plan = NULL;
474
Chris Lattner24943d22010-06-08 16:52:24 +0000475 if (m_step_type == eStepTypeInto)
476 {
477 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
Chris Lattner24943d22010-06-08 16:52:24 +0000478
479 if (frame->HasDebugInformation ())
480 {
Jim Inghamf2ca5732012-12-12 19:58:40 +0000481 new_plan = thread->QueueThreadPlanForStepInRange (abort_other_plans,
Chris Lattner24943d22010-06-08 16:52:24 +0000482 frame->GetSymbolContext(eSymbolContextEverything).line_entry.range,
Jim Inghamf2ca5732012-12-12 19:58:40 +0000483 frame->GetSymbolContext(eSymbolContextEverything),
484 m_options.m_step_in_target.c_str(),
Greg Clayton8f5fd6b2010-06-12 18:59:55 +0000485 stop_other_threads,
486 m_options.m_avoid_no_debug);
Jim Ingham809ab9b2010-07-10 02:27:39 +0000487 if (new_plan && !m_options.m_avoid_regexp.empty())
488 {
489 ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan);
490 step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str());
491 }
Chris Lattner24943d22010-06-08 16:52:24 +0000492 }
493 else
494 new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads);
Jim Ingham88e3de22012-05-03 21:19:36 +0000495
Chris Lattner24943d22010-06-08 16:52:24 +0000496 }
497 else if (m_step_type == eStepTypeOver)
498 {
499 StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
Chris Lattner24943d22010-06-08 16:52:24 +0000500
501 if (frame->HasDebugInformation())
Jim Inghamf2ca5732012-12-12 19:58:40 +0000502 new_plan = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
503 frame->GetSymbolContext(eSymbolContextEverything).line_entry.range,
504 frame->GetSymbolContext(eSymbolContextEverything),
505 stop_other_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000506 else
507 new_plan = thread->QueueThreadPlanForStepSingleInstruction (true,
508 abort_other_plans,
509 bool_stop_other_threads);
510
Chris Lattner24943d22010-06-08 16:52:24 +0000511 }
512 else if (m_step_type == eStepTypeTrace)
513 {
Jim Ingham88e3de22012-05-03 21:19:36 +0000514 new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000515 }
516 else if (m_step_type == eStepTypeTraceOver)
517 {
Jim Ingham88e3de22012-05-03 21:19:36 +0000518 new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000519 }
520 else if (m_step_type == eStepTypeOut)
521 {
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000522 new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans,
523 NULL,
524 false,
525 bool_stop_other_threads,
526 eVoteYes,
527 eVoteNoOpinion,
528 thread->GetSelectedFrameIndex());
Chris Lattner24943d22010-06-08 16:52:24 +0000529 }
530 else
531 {
532 result.AppendError ("step type is not supported");
533 result.SetStatus (eReturnStatusFailed);
Jim Ingham88e3de22012-05-03 21:19:36 +0000534 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000535 }
Jim Ingham88e3de22012-05-03 21:19:36 +0000536
537 // If we got a new plan, then set it to be a master plan (User level Plans should be master plans
538 // so that they can be interruptible). Then resume the process.
539
540 if (new_plan != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000541 {
Jim Ingham88e3de22012-05-03 21:19:36 +0000542 new_plan->SetIsMasterPlan (true);
543 new_plan->SetOkayToDiscard (false);
544
Jim Inghamc8332952010-08-26 21:32:51 +0000545 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
Jim Ingham88e3de22012-05-03 21:19:36 +0000546 process->Resume ();
547
548
549 if (synchronous_execution)
550 {
551 StateType state = process->WaitForProcessToStop (NULL);
552
553 //EventSP event_sp;
554 //StateType state = process->WaitForStateChangedEvents (NULL, event_sp);
555 //while (! StateIsStoppedState (state))
556 // {
557 // state = process->WaitForStateChangedEvents (NULL, event_sp);
558 // }
559 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
560 result.SetDidChangeProcessState (true);
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000561 result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state));
Jim Ingham88e3de22012-05-03 21:19:36 +0000562 result.SetStatus (eReturnStatusSuccessFinishNoResult);
563 }
Jim Ingham53628e72012-05-16 00:37:40 +0000564 else
565 {
566 result.SetStatus (eReturnStatusSuccessContinuingNoResult);
567 }
Jim Ingham88e3de22012-05-03 21:19:36 +0000568 }
569 else
570 {
571 result.AppendError ("Couldn't find thread plan to implement step type.");
572 result.SetStatus (eReturnStatusFailed);
Chris Lattner24943d22010-06-08 16:52:24 +0000573 }
574 }
575 return result.Succeeded();
576 }
577
578protected:
579 StepType m_step_type;
580 StepScope m_step_scope;
581 CommandOptions m_options;
582};
583
Greg Claytonb3448432011-03-24 21:19:54 +0000584static OptionEnumValueElement
Chris Lattner24943d22010-06-08 16:52:24 +0000585g_tri_running_mode[] =
586{
Greg Claytonfe424a92010-09-18 03:37:20 +0000587{ eOnlyThisThread, "this-thread", "Run only this thread"},
588{ eAllThreads, "all-threads", "Run all threads"},
589{ eOnlyDuringStepping, "while-stepping", "Run only this thread while stepping"},
Chris Lattner24943d22010-06-08 16:52:24 +0000590{ 0, NULL, NULL }
591};
592
Greg Claytonb3448432011-03-24 21:19:54 +0000593static OptionEnumValueElement
Chris Lattner24943d22010-06-08 16:52:24 +0000594g_duo_running_mode[] =
595{
Greg Claytonfe424a92010-09-18 03:37:20 +0000596{ eOnlyThisThread, "this-thread", "Run only this thread"},
597{ eAllThreads, "all-threads", "Run all threads"},
Chris Lattner24943d22010-06-08 16:52:24 +0000598{ 0, NULL, NULL }
599};
600
Greg Claytonb3448432011-03-24 21:19:54 +0000601OptionDefinition
Chris Lattner24943d22010-06-08 16:52:24 +0000602CommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] =
603{
Caroline Tice4d6675c2010-10-01 19:59:14 +0000604{ LLDB_OPT_SET_1, false, "avoid-no-debug", 'a', required_argument, NULL, 0, eArgTypeBoolean, "A boolean value that sets whether step-in will step over functions with no debug information."},
605{ LLDB_OPT_SET_1, false, "run-mode", 'm', required_argument, g_tri_running_mode, 0, eArgTypeRunMode, "Determine how to run other threads while stepping the current thread."},
Jim Inghamf2ca5732012-12-12 19:58:40 +0000606{ LLDB_OPT_SET_1, false, "step-over-regexp",'r', required_argument, NULL, 0, eArgTypeRegularExpression, "A regular expression that defines function names to not to stop at when stepping in."},
607{ LLDB_OPT_SET_1, false, "step-in-target", 't', required_argument, NULL, 0, eArgTypeFunctionName, "The name of the directly called function step in should stop at when stepping into."},
Caroline Tice4d6675c2010-10-01 19:59:14 +0000608{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
Chris Lattner24943d22010-06-08 16:52:24 +0000609};
610
611
612//-------------------------------------------------------------------------
613// CommandObjectThreadContinue
614//-------------------------------------------------------------------------
615
Jim Inghamda26bd22012-06-08 21:56:10 +0000616class CommandObjectThreadContinue : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +0000617{
618public:
619
Greg Clayton238c0a12010-09-18 01:14:36 +0000620 CommandObjectThreadContinue (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000621 CommandObjectParsed (interpreter,
622 "thread continue",
623 "Continue execution of one or more threads in an active process.",
624 NULL,
625 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
Chris Lattner24943d22010-06-08 16:52:24 +0000626 {
Caroline Tice43b014a2010-10-04 22:28:36 +0000627 CommandArgumentEntry arg;
628 CommandArgumentData thread_idx_arg;
629
630 // Define the first (and only) variant of this arg.
631 thread_idx_arg.arg_type = eArgTypeThreadIndex;
632 thread_idx_arg.arg_repetition = eArgRepeatPlus;
633
634 // There is only one variant this argument could be; put it into the argument entry.
635 arg.push_back (thread_idx_arg);
636
637 // Push the data for the first argument into the m_arguments vector.
638 m_arguments.push_back (arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000639 }
640
641
642 virtual
643 ~CommandObjectThreadContinue ()
644 {
645 }
646
647 virtual bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000648 DoExecute (Args& command, CommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000649 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000650 bool synchronous_execution = m_interpreter.GetSynchronous ();
Chris Lattner24943d22010-06-08 16:52:24 +0000651
Greg Clayton238c0a12010-09-18 01:14:36 +0000652 if (!m_interpreter.GetDebugger().GetSelectedTarget().get())
Chris Lattner24943d22010-06-08 16:52:24 +0000653 {
Greg Claytone1f50b92011-05-03 22:09:39 +0000654 result.AppendError ("invalid target, create a debug target using the 'target create' command");
Chris Lattner24943d22010-06-08 16:52:24 +0000655 result.SetStatus (eReturnStatusFailed);
656 return false;
657 }
658
Greg Clayton567e7f32011-09-22 04:58:26 +0000659 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000660 if (process == NULL)
661 {
662 result.AppendError ("no process exists. Cannot continue");
663 result.SetStatus (eReturnStatusFailed);
664 return false;
665 }
666
667 StateType state = process->GetState();
668 if ((state == eStateCrashed) || (state == eStateStopped) || (state == eStateSuspended))
669 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000670 Mutex::Locker locker (process->GetThreadList().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000671 const uint32_t num_threads = process->GetThreadList().GetSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000672 const size_t argc = command.GetArgumentCount();
673 if (argc > 0)
674 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000675 std::vector<Thread *> resume_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000676 for (uint32_t i=0; i<argc; ++i)
677 {
Jim Inghamd07b4f52012-05-31 20:48:41 +0000678 bool success;
679 const int base = 0;
Greg Claytonedd601a2012-07-03 20:54:16 +0000680 uint32_t thread_idx = Args::StringToUInt32 (command.GetArgumentAtIndex(i), LLDB_INVALID_INDEX32, base, &success);
681 if (success)
Jim Inghamd07b4f52012-05-31 20:48:41 +0000682 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000683 Thread *thread = process->GetThreadList().FindThreadByIndexID(thread_idx).get();
684
685 if (thread)
686 {
687 resume_threads.push_back(thread);
688 }
689 else
690 {
691 result.AppendErrorWithFormat("invalid thread index %u.\n", thread_idx);
692 result.SetStatus (eReturnStatusFailed);
693 return false;
694 }
Jim Inghamd07b4f52012-05-31 20:48:41 +0000695 }
Chris Lattner24943d22010-06-08 16:52:24 +0000696 else
Jim Inghamd07b4f52012-05-31 20:48:41 +0000697 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000698 result.AppendErrorWithFormat ("invalid thread index argument: \"%s\".\n", command.GetArgumentAtIndex(i));
Jim Inghamd07b4f52012-05-31 20:48:41 +0000699 result.SetStatus (eReturnStatusFailed);
700 return false;
701 }
Chris Lattner24943d22010-06-08 16:52:24 +0000702 }
Greg Claytonedd601a2012-07-03 20:54:16 +0000703
704 if (resume_threads.empty())
Chris Lattner24943d22010-06-08 16:52:24 +0000705 {
706 result.AppendError ("no valid thread indexes were specified");
707 result.SetStatus (eReturnStatusFailed);
708 return false;
709 }
710 else
711 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000712 if (resume_threads.size() == 1)
Jim Inghamd07b4f52012-05-31 20:48:41 +0000713 result.AppendMessageWithFormat ("Resuming thread: ");
714 else
715 result.AppendMessageWithFormat ("Resuming threads: ");
Greg Claytonedd601a2012-07-03 20:54:16 +0000716
717 for (uint32_t idx=0; idx<num_threads; ++idx)
Chris Lattner24943d22010-06-08 16:52:24 +0000718 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000719 Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get();
720 std::vector<Thread *>::iterator this_thread_pos = find(resume_threads.begin(), resume_threads.end(), thread);
Jim Inghamd07b4f52012-05-31 20:48:41 +0000721
Greg Claytonedd601a2012-07-03 20:54:16 +0000722 if (this_thread_pos != resume_threads.end())
Chris Lattner24943d22010-06-08 16:52:24 +0000723 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000724 resume_threads.erase(this_thread_pos);
725 if (resume_threads.size() > 0)
Jim Inghamd07b4f52012-05-31 20:48:41 +0000726 result.AppendMessageWithFormat ("%u, ", thread->GetIndexID());
727 else
728 result.AppendMessageWithFormat ("%u ", thread->GetIndexID());
729
Chris Lattner24943d22010-06-08 16:52:24 +0000730 thread->SetResumeState (eStateRunning);
731 }
732 else
733 {
734 thread->SetResumeState (eStateSuspended);
735 }
736 }
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000737 result.AppendMessageWithFormat ("in process %" PRIu64 "\n", process->GetID());
Chris Lattner24943d22010-06-08 16:52:24 +0000738 }
739 }
740 else
741 {
Jim Inghamc8332952010-08-26 21:32:51 +0000742 Thread *current_thread = process->GetThreadList().GetSelectedThread().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000743 if (current_thread == NULL)
744 {
745 result.AppendError ("the process doesn't have a current thread");
746 result.SetStatus (eReturnStatusFailed);
747 return false;
748 }
749 // Set the actions that the threads should each take when resuming
Greg Claytonedd601a2012-07-03 20:54:16 +0000750 for (uint32_t idx=0; idx<num_threads; ++idx)
Chris Lattner24943d22010-06-08 16:52:24 +0000751 {
Greg Claytonedd601a2012-07-03 20:54:16 +0000752 Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get();
Chris Lattner24943d22010-06-08 16:52:24 +0000753 if (thread == current_thread)
754 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000755 result.AppendMessageWithFormat ("Resuming thread 0x%4.4" PRIx64 " in process %" PRIu64 "\n", thread->GetID(), process->GetID());
Chris Lattner24943d22010-06-08 16:52:24 +0000756 thread->SetResumeState (eStateRunning);
757 }
758 else
759 {
760 thread->SetResumeState (eStateSuspended);
761 }
762 }
763 }
Greg Claytonedd601a2012-07-03 20:54:16 +0000764
Chris Lattner24943d22010-06-08 16:52:24 +0000765 Error error (process->Resume());
766 if (error.Success())
767 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000768 result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID());
Chris Lattner24943d22010-06-08 16:52:24 +0000769 if (synchronous_execution)
770 {
Greg Claytonbef15832010-07-14 00:18:15 +0000771 state = process->WaitForProcessToStop (NULL);
Greg Claytonedd601a2012-07-03 20:54:16 +0000772
Chris Lattner24943d22010-06-08 16:52:24 +0000773 result.SetDidChangeProcessState (true);
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000774 result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state));
Chris Lattner24943d22010-06-08 16:52:24 +0000775 result.SetStatus (eReturnStatusSuccessFinishNoResult);
776 }
777 else
778 {
779 result.SetStatus (eReturnStatusSuccessContinuingNoResult);
780 }
781 }
782 else
783 {
784 result.AppendErrorWithFormat("Failed to resume process: %s\n", error.AsCString());
785 result.SetStatus (eReturnStatusFailed);
786 }
787 }
788 else
789 {
790 result.AppendErrorWithFormat ("Process cannot be continued from its current state (%s).\n",
791 StateAsCString(state));
792 result.SetStatus (eReturnStatusFailed);
793 }
794
795 return result.Succeeded();
796 }
797
798};
799
800//-------------------------------------------------------------------------
801// CommandObjectThreadUntil
802//-------------------------------------------------------------------------
803
Jim Inghamda26bd22012-06-08 21:56:10 +0000804class CommandObjectThreadUntil : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +0000805{
806public:
807
808 class CommandOptions : public Options
809 {
810 public:
811 uint32_t m_thread_idx;
812 uint32_t m_frame_idx;
813
Greg Claytonf15996e2011-04-07 22:46:35 +0000814 CommandOptions (CommandInterpreter &interpreter) :
815 Options (interpreter),
Chris Lattner24943d22010-06-08 16:52:24 +0000816 m_thread_idx(LLDB_INVALID_THREAD_ID),
817 m_frame_idx(LLDB_INVALID_FRAME_ID)
818 {
Greg Clayton143fcc32011-04-13 00:18:08 +0000819 // Keep default values of all options in one place: OptionParsingStarting ()
820 OptionParsingStarting ();
Chris Lattner24943d22010-06-08 16:52:24 +0000821 }
822
823 virtual
824 ~CommandOptions ()
825 {
826 }
827
828 virtual Error
Greg Clayton143fcc32011-04-13 00:18:08 +0000829 SetOptionValue (uint32_t option_idx, const char *option_arg)
Chris Lattner24943d22010-06-08 16:52:24 +0000830 {
831 Error error;
Greg Clayton6475c422012-12-04 00:32:51 +0000832 const int short_option = m_getopt_table[option_idx].val;
Chris Lattner24943d22010-06-08 16:52:24 +0000833
834 switch (short_option)
835 {
836 case 't':
837 {
Greg Claytonbef15832010-07-14 00:18:15 +0000838 m_thread_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_INDEX32);
Chris Lattner24943d22010-06-08 16:52:24 +0000839 if (m_thread_idx == LLDB_INVALID_INDEX32)
840 {
Greg Clayton9c236732011-10-26 00:56:27 +0000841 error.SetErrorStringWithFormat ("invalid thread index '%s'", option_arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000842 }
843 }
844 break;
845 case 'f':
846 {
847 m_frame_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_FRAME_ID);
848 if (m_frame_idx == LLDB_INVALID_FRAME_ID)
849 {
Greg Clayton9c236732011-10-26 00:56:27 +0000850 error.SetErrorStringWithFormat ("invalid frame index '%s'", option_arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000851 }
852 }
853 break;
854 case 'm':
855 {
Chris Lattner24943d22010-06-08 16:52:24 +0000856 OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values;
Greg Clayton61aca5d2011-10-07 18:58:12 +0000857 lldb::RunMode run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000858
Greg Clayton61aca5d2011-10-07 18:58:12 +0000859 if (error.Success())
860 {
861 if (run_mode == eAllThreads)
862 m_stop_others = false;
863 else
864 m_stop_others = true;
865 }
Chris Lattner24943d22010-06-08 16:52:24 +0000866 }
867 break;
868 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000869 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
Chris Lattner24943d22010-06-08 16:52:24 +0000870 break;
871
872 }
873 return error;
874 }
875
876 void
Greg Clayton143fcc32011-04-13 00:18:08 +0000877 OptionParsingStarting ()
Chris Lattner24943d22010-06-08 16:52:24 +0000878 {
Chris Lattner24943d22010-06-08 16:52:24 +0000879 m_thread_idx = LLDB_INVALID_THREAD_ID;
880 m_frame_idx = 0;
881 m_stop_others = false;
882 }
883
Greg Claytonb3448432011-03-24 21:19:54 +0000884 const OptionDefinition*
Chris Lattner24943d22010-06-08 16:52:24 +0000885 GetDefinitions ()
886 {
887 return g_option_table;
888 }
889
890 uint32_t m_step_thread_idx;
891 bool m_stop_others;
892
893 // Options table: Required for subclasses of Options.
894
Greg Claytonb3448432011-03-24 21:19:54 +0000895 static OptionDefinition g_option_table[];
Chris Lattner24943d22010-06-08 16:52:24 +0000896
897 // Instance variables to hold the values for command options.
898 };
899
Greg Clayton238c0a12010-09-18 01:14:36 +0000900 CommandObjectThreadUntil (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000901 CommandObjectParsed (interpreter,
902 "thread until",
903 "Run the current or specified thread until it reaches a given line number or leaves the current function.",
904 NULL,
905 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
Greg Claytonf15996e2011-04-07 22:46:35 +0000906 m_options (interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000907 {
Caroline Tice43b014a2010-10-04 22:28:36 +0000908 CommandArgumentEntry arg;
909 CommandArgumentData line_num_arg;
910
911 // Define the first (and only) variant of this arg.
912 line_num_arg.arg_type = eArgTypeLineNum;
913 line_num_arg.arg_repetition = eArgRepeatPlain;
914
915 // There is only one variant this argument could be; put it into the argument entry.
916 arg.push_back (line_num_arg);
917
918 // Push the data for the first argument into the m_arguments vector.
919 m_arguments.push_back (arg);
Chris Lattner24943d22010-06-08 16:52:24 +0000920 }
921
922
923 virtual
924 ~CommandObjectThreadUntil ()
925 {
926 }
927
928 virtual
929 Options *
930 GetOptions ()
931 {
932 return &m_options;
933 }
934
Jim Inghamda26bd22012-06-08 21:56:10 +0000935protected:
Chris Lattner24943d22010-06-08 16:52:24 +0000936 virtual bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000937 DoExecute (Args& command, CommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000938 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000939 bool synchronous_execution = m_interpreter.GetSynchronous ();
Chris Lattner24943d22010-06-08 16:52:24 +0000940
Greg Clayton238c0a12010-09-18 01:14:36 +0000941 Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
Greg Claytoneea26402010-09-14 23:36:40 +0000942 if (target == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000943 {
Greg Claytone1f50b92011-05-03 22:09:39 +0000944 result.AppendError ("invalid target, create a debug target using the 'target create' command");
Chris Lattner24943d22010-06-08 16:52:24 +0000945 result.SetStatus (eReturnStatusFailed);
946 return false;
947 }
948
Greg Clayton567e7f32011-09-22 04:58:26 +0000949 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000950 if (process == NULL)
951 {
952 result.AppendError ("need a valid process to step");
953 result.SetStatus (eReturnStatusFailed);
954
955 }
956 else
957 {
958 Thread *thread = NULL;
959 uint32_t line_number;
960
961 if (command.GetArgumentCount() != 1)
962 {
963 result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax());
964 result.SetStatus (eReturnStatusFailed);
965 return false;
966 }
967
968 line_number = Args::StringToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX);
969 if (line_number == UINT32_MAX)
970 {
Greg Clayton9c236732011-10-26 00:56:27 +0000971 result.AppendErrorWithFormat ("invalid line number: '%s'.\n", command.GetArgumentAtIndex(0));
Chris Lattner24943d22010-06-08 16:52:24 +0000972 result.SetStatus (eReturnStatusFailed);
973 return false;
974 }
975
976 if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID)
977 {
Jim Inghamc8332952010-08-26 21:32:51 +0000978 thread = process->GetThreadList().GetSelectedThread().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000979 }
980 else
981 {
Greg Claytona2243772012-05-31 00:29:20 +0000982 thread = process->GetThreadList().FindThreadByIndexID(m_options.m_thread_idx).get();
Chris Lattner24943d22010-06-08 16:52:24 +0000983 }
984
985 if (thread == NULL)
986 {
987 const uint32_t num_threads = process->GetThreadList().GetSize();
Jim Inghamb07c62a2011-05-08 00:56:32 +0000988 result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n",
989 m_options.m_thread_idx,
Jim Inghamb07c62a2011-05-08 00:56:32 +0000990 num_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000991 result.SetStatus (eReturnStatusFailed);
992 return false;
993 }
994
Jim Inghamd82bc6d2012-05-11 23:47:32 +0000995 const bool abort_other_plans = false;
Chris Lattner24943d22010-06-08 16:52:24 +0000996
997 StackFrame *frame = thread->GetStackFrameAtIndex(m_options.m_frame_idx).get();
998 if (frame == NULL)
999 {
1000
Jim Inghamb07c62a2011-05-08 00:56:32 +00001001 result.AppendErrorWithFormat ("Frame index %u is out of range for thread %u.\n",
1002 m_options.m_frame_idx,
1003 m_options.m_thread_idx);
Chris Lattner24943d22010-06-08 16:52:24 +00001004 result.SetStatus (eReturnStatusFailed);
1005 return false;
1006 }
1007
Jim Ingham88e3de22012-05-03 21:19:36 +00001008 ThreadPlan *new_plan = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001009
1010 if (frame->HasDebugInformation ())
1011 {
1012 // Finally we got here... Translate the given line number to a bunch of addresses:
1013 SymbolContext sc(frame->GetSymbolContext (eSymbolContextCompUnit));
1014 LineTable *line_table = NULL;
1015 if (sc.comp_unit)
1016 line_table = sc.comp_unit->GetLineTable();
1017
1018 if (line_table == NULL)
1019 {
1020 result.AppendErrorWithFormat ("Failed to resolve the line table for frame %u of thread index %u.\n",
1021 m_options.m_frame_idx, m_options.m_thread_idx);
1022 result.SetStatus (eReturnStatusFailed);
1023 return false;
1024 }
1025
1026 LineEntry function_start;
1027 uint32_t index_ptr = 0, end_ptr;
1028 std::vector<addr_t> address_list;
1029
1030 // Find the beginning & end index of the
1031 AddressRange fun_addr_range = sc.function->GetAddressRange();
1032 Address fun_start_addr = fun_addr_range.GetBaseAddress();
1033 line_table->FindLineEntryByAddress (fun_start_addr, function_start, &index_ptr);
1034
Jim Inghamb07c62a2011-05-08 00:56:32 +00001035 Address fun_end_addr(fun_start_addr.GetSection(),
1036 fun_start_addr.GetOffset() + fun_addr_range.GetByteSize());
Chris Lattner24943d22010-06-08 16:52:24 +00001037 line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr);
1038
Jim Inghamb07c62a2011-05-08 00:56:32 +00001039 bool all_in_function = true;
1040
Chris Lattner24943d22010-06-08 16:52:24 +00001041 while (index_ptr <= end_ptr)
1042 {
1043 LineEntry line_entry;
Jim Inghamd6d47972011-09-23 00:54:11 +00001044 const bool exact = false;
1045 index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, exact, &line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +00001046 if (index_ptr == UINT32_MAX)
1047 break;
1048
Greg Claytoneea26402010-09-14 23:36:40 +00001049 addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00001050 if (address != LLDB_INVALID_ADDRESS)
Jim Inghamb07c62a2011-05-08 00:56:32 +00001051 {
1052 if (fun_addr_range.ContainsLoadAddress (address, target))
1053 address_list.push_back (address);
1054 else
1055 all_in_function = false;
1056 }
Chris Lattner24943d22010-06-08 16:52:24 +00001057 index_ptr++;
1058 }
1059
Jim Inghamb07c62a2011-05-08 00:56:32 +00001060 if (address_list.size() == 0)
1061 {
1062 if (all_in_function)
1063 result.AppendErrorWithFormat ("No line entries matching until target.\n");
1064 else
1065 result.AppendErrorWithFormat ("Until target outside of the current function.\n");
1066
1067 result.SetStatus (eReturnStatusFailed);
1068 return false;
1069 }
1070
1071 new_plan = thread->QueueThreadPlanForStepUntil (abort_other_plans,
1072 &address_list.front(),
1073 address_list.size(),
1074 m_options.m_stop_others,
Jim Inghamfade78a2012-09-14 20:48:14 +00001075 m_options.m_frame_idx);
Jim Ingham88e3de22012-05-03 21:19:36 +00001076 // User level plans should be master plans so they can be interrupted (e.g. by hitting a breakpoint)
1077 // and other plans executed by the user (stepping around the breakpoint) and then a "continue"
1078 // will resume the original plan.
1079 new_plan->SetIsMasterPlan (true);
Chris Lattner24943d22010-06-08 16:52:24 +00001080 new_plan->SetOkayToDiscard(false);
1081 }
1082 else
1083 {
Jim Inghamb07c62a2011-05-08 00:56:32 +00001084 result.AppendErrorWithFormat ("Frame index %u of thread %u has no debug information.\n",
1085 m_options.m_frame_idx,
1086 m_options.m_thread_idx);
Chris Lattner24943d22010-06-08 16:52:24 +00001087 result.SetStatus (eReturnStatusFailed);
1088 return false;
1089
1090 }
1091
Jim Inghamc8332952010-08-26 21:32:51 +00001092 process->GetThreadList().SetSelectedThreadByID (m_options.m_thread_idx);
Chris Lattner24943d22010-06-08 16:52:24 +00001093 Error error (process->Resume ());
1094 if (error.Success())
1095 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001096 result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID());
Chris Lattner24943d22010-06-08 16:52:24 +00001097 if (synchronous_execution)
1098 {
1099 StateType state = process->WaitForProcessToStop (NULL);
1100
1101 result.SetDidChangeProcessState (true);
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001102 result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state));
Chris Lattner24943d22010-06-08 16:52:24 +00001103 result.SetStatus (eReturnStatusSuccessFinishNoResult);
1104 }
1105 else
1106 {
1107 result.SetStatus (eReturnStatusSuccessContinuingNoResult);
1108 }
1109 }
1110 else
1111 {
1112 result.AppendErrorWithFormat("Failed to resume process: %s.\n", error.AsCString());
1113 result.SetStatus (eReturnStatusFailed);
1114 }
1115
1116 }
1117 return result.Succeeded();
1118 }
Jim Inghamda26bd22012-06-08 21:56:10 +00001119
Chris Lattner24943d22010-06-08 16:52:24 +00001120 CommandOptions m_options;
1121
1122};
1123
Greg Claytonb3448432011-03-24 21:19:54 +00001124OptionDefinition
Chris Lattner24943d22010-06-08 16:52:24 +00001125CommandObjectThreadUntil::CommandOptions::g_option_table[] =
1126{
Caroline Tice43b014a2010-10-04 22:28:36 +00001127{ LLDB_OPT_SET_1, false, "frame", 'f', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame index for until operation - defaults to 0"},
Caroline Tice4d6675c2010-10-01 19:59:14 +00001128{ LLDB_OPT_SET_1, false, "thread", 't', required_argument, NULL, 0, eArgTypeThreadIndex, "Thread index for the thread for until operation"},
1129{ LLDB_OPT_SET_1, false, "run-mode",'m', required_argument, g_duo_running_mode, 0, eArgTypeRunMode,"Determine how to run other threads while stepping this one"},
1130{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
Chris Lattner24943d22010-06-08 16:52:24 +00001131};
1132
1133
1134//-------------------------------------------------------------------------
1135// CommandObjectThreadSelect
1136//-------------------------------------------------------------------------
1137
Jim Inghamda26bd22012-06-08 21:56:10 +00001138class CommandObjectThreadSelect : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +00001139{
1140public:
1141
Greg Clayton238c0a12010-09-18 01:14:36 +00001142 CommandObjectThreadSelect (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +00001143 CommandObjectParsed (interpreter,
1144 "thread select",
1145 "Select a thread as the currently active thread.",
1146 NULL,
1147 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
Chris Lattner24943d22010-06-08 16:52:24 +00001148 {
Caroline Tice43b014a2010-10-04 22:28:36 +00001149 CommandArgumentEntry arg;
1150 CommandArgumentData thread_idx_arg;
1151
1152 // Define the first (and only) variant of this arg.
1153 thread_idx_arg.arg_type = eArgTypeThreadIndex;
1154 thread_idx_arg.arg_repetition = eArgRepeatPlain;
1155
1156 // There is only one variant this argument could be; put it into the argument entry.
1157 arg.push_back (thread_idx_arg);
1158
1159 // Push the data for the first argument into the m_arguments vector.
1160 m_arguments.push_back (arg);
Chris Lattner24943d22010-06-08 16:52:24 +00001161 }
1162
1163
1164 virtual
1165 ~CommandObjectThreadSelect ()
1166 {
1167 }
1168
Jim Inghamda26bd22012-06-08 21:56:10 +00001169protected:
Chris Lattner24943d22010-06-08 16:52:24 +00001170 virtual bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001171 DoExecute (Args& command, CommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +00001172 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001173 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Chris Lattner24943d22010-06-08 16:52:24 +00001174 if (process == NULL)
1175 {
1176 result.AppendError ("no process");
1177 result.SetStatus (eReturnStatusFailed);
1178 return false;
1179 }
1180 else if (command.GetArgumentCount() != 1)
1181 {
Jason Molenda7e5fa7f2011-09-20 21:44:10 +00001182 result.AppendErrorWithFormat("'%s' takes exactly one thread index argument:\nUsage: %s\n", m_cmd_name.c_str(), m_cmd_syntax.c_str());
Chris Lattner24943d22010-06-08 16:52:24 +00001183 result.SetStatus (eReturnStatusFailed);
1184 return false;
1185 }
1186
1187 uint32_t index_id = Args::StringToUInt32(command.GetArgumentAtIndex(0), 0, 0);
1188
1189 Thread *new_thread = process->GetThreadList().FindThreadByIndexID(index_id).get();
1190 if (new_thread == NULL)
1191 {
Greg Clayton9c236732011-10-26 00:56:27 +00001192 result.AppendErrorWithFormat ("invalid thread #%s.\n", command.GetArgumentAtIndex(0));
Chris Lattner24943d22010-06-08 16:52:24 +00001193 result.SetStatus (eReturnStatusFailed);
1194 return false;
1195 }
1196
Jim Ingham2e281232012-12-11 02:31:48 +00001197 process->GetThreadList().SetSelectedThreadByID(new_thread->GetID(), true);
Johnny Chen8dbb6e82010-09-14 00:53:53 +00001198 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Chris Lattner24943d22010-06-08 16:52:24 +00001199
Chris Lattner24943d22010-06-08 16:52:24 +00001200 return result.Succeeded();
1201 }
1202
1203};
1204
1205
1206//-------------------------------------------------------------------------
1207// CommandObjectThreadList
1208//-------------------------------------------------------------------------
1209
Jim Inghamda26bd22012-06-08 21:56:10 +00001210class CommandObjectThreadList : public CommandObjectParsed
Chris Lattner24943d22010-06-08 16:52:24 +00001211{
Greg Clayton63094e02010-06-23 01:19:29 +00001212public:
Chris Lattner24943d22010-06-08 16:52:24 +00001213
Chris Lattner24943d22010-06-08 16:52:24 +00001214
Greg Clayton238c0a12010-09-18 01:14:36 +00001215 CommandObjectThreadList (CommandInterpreter &interpreter):
Jim Inghamda26bd22012-06-08 21:56:10 +00001216 CommandObjectParsed (interpreter,
1217 "thread list",
1218 "Show a summary of all current threads in a process.",
1219 "thread list",
1220 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
Chris Lattner24943d22010-06-08 16:52:24 +00001221 {
Greg Clayton63094e02010-06-23 01:19:29 +00001222 }
Chris Lattner24943d22010-06-08 16:52:24 +00001223
Greg Clayton63094e02010-06-23 01:19:29 +00001224 ~CommandObjectThreadList()
1225 {
1226 }
1227
Jim Inghamda26bd22012-06-08 21:56:10 +00001228protected:
Greg Clayton63094e02010-06-23 01:19:29 +00001229 bool
Jim Inghamda26bd22012-06-08 21:56:10 +00001230 DoExecute (Args& command, CommandReturnObject &result)
Greg Clayton63094e02010-06-23 01:19:29 +00001231 {
Jim Ingham2e8cb8a2011-02-19 02:53:09 +00001232 Stream &strm = result.GetOutputStream();
Greg Clayton63094e02010-06-23 01:19:29 +00001233 result.SetStatus (eReturnStatusSuccessFinishNoResult);
Greg Claytonb72d0f02011-04-12 05:54:46 +00001234 ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
Greg Clayton567e7f32011-09-22 04:58:26 +00001235 Process *process = exe_ctx.GetProcessPtr();
1236 if (process)
Chris Lattner24943d22010-06-08 16:52:24 +00001237 {
Greg Claytonabe0fed2011-04-18 08:33:37 +00001238 const bool only_threads_with_stop_reason = false;
1239 const uint32_t start_frame = 0;
1240 const uint32_t num_frames = 0;
1241 const uint32_t num_frames_with_source = 0;
Greg Clayton567e7f32011-09-22 04:58:26 +00001242 process->GetStatus(strm);
1243 process->GetThreadStatus (strm,
1244 only_threads_with_stop_reason,
1245 start_frame,
1246 num_frames,
1247 num_frames_with_source);
Chris Lattner24943d22010-06-08 16:52:24 +00001248 }
1249 else
1250 {
Greg Clayton63094e02010-06-23 01:19:29 +00001251 result.AppendError ("no current location or status available");
Chris Lattner24943d22010-06-08 16:52:24 +00001252 result.SetStatus (eReturnStatusFailed);
1253 }
Greg Clayton63094e02010-06-23 01:19:29 +00001254 return result.Succeeded();
Chris Lattner24943d22010-06-08 16:52:24 +00001255 }
Greg Clayton63094e02010-06-23 01:19:29 +00001256};
Chris Lattner24943d22010-06-08 16:52:24 +00001257
Jim Inghamf59388a2012-09-14 02:14:15 +00001258class CommandObjectThreadReturn : public CommandObjectRaw
1259{
1260public:
1261 CommandObjectThreadReturn (CommandInterpreter &interpreter) :
1262 CommandObjectRaw (interpreter,
1263 "thread return",
1264 "Return from the currently selected frame, short-circuiting execution of the frames below it, with an optional return value.",
1265 "thread return",
1266 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
1267 {
1268 CommandArgumentEntry arg;
1269 CommandArgumentData expression_arg;
1270
1271 // Define the first (and only) variant of this arg.
1272 expression_arg.arg_type = eArgTypeExpression;
1273 expression_arg.arg_repetition = eArgRepeatPlain;
1274
1275 // There is only one variant this argument could be; put it into the argument entry.
1276 arg.push_back (expression_arg);
1277
1278 // Push the data for the first argument into the m_arguments vector.
1279 m_arguments.push_back (arg);
1280
1281
1282 }
1283
1284 ~CommandObjectThreadReturn()
1285 {
1286 }
1287
1288protected:
1289
1290 bool DoExecute
1291 (
1292 const char *command,
1293 CommandReturnObject &result
1294 )
1295 {
1296 // If there is a command string, pass it to the expression parser:
1297 ExecutionContext exe_ctx = m_interpreter.GetExecutionContext();
1298 if (!(exe_ctx.HasProcessScope() && exe_ctx.HasThreadScope() && exe_ctx.HasFrameScope()))
1299 {
1300 result.AppendError("Must have selected process, thread and frame for thread return.");
1301 result.SetStatus (eReturnStatusFailed);
1302 return false;
1303 }
1304
1305 ValueObjectSP return_valobj_sp;
1306
1307 StackFrameSP frame_sp = exe_ctx.GetFrameSP();
1308 uint32_t frame_idx = frame_sp->GetFrameIndex();
1309
1310 if (frame_sp->IsInlined())
1311 {
1312 result.AppendError("Don't know how to return from inlined frames.");
1313 result.SetStatus (eReturnStatusFailed);
1314 return false;
1315 }
1316
1317 if (command && command[0] != '\0')
1318 {
1319 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham47beabb2012-10-16 21:41:58 +00001320 EvaluateExpressionOptions options;
Jim Inghamf59388a2012-09-14 02:14:15 +00001321
1322 options.SetUnwindOnError(true);
1323 options.SetUseDynamic(eNoDynamicValues);
1324
1325 ExecutionResults exe_results = eExecutionSetupError;
1326 exe_results = target->EvaluateExpression (command,
1327 frame_sp.get(),
1328 return_valobj_sp,
1329 options);
1330 if (exe_results != eExecutionCompleted)
1331 {
1332 if (return_valobj_sp)
1333 result.AppendErrorWithFormat("Error evaluating result expression: %s", return_valobj_sp->GetError().AsCString());
1334 else
1335 result.AppendErrorWithFormat("Unknown error evaluating result expression.");
1336 result.SetStatus (eReturnStatusFailed);
1337 return false;
1338
1339 }
1340 }
1341
1342 Error error;
1343 ThreadSP thread_sp = exe_ctx.GetThreadSP();
Jim Ingham94a5d0d2012-10-10 18:32:14 +00001344 const bool broadcast = true;
1345 error = thread_sp->ReturnFromFrame (frame_sp, return_valobj_sp, broadcast);
Jim Inghamf59388a2012-09-14 02:14:15 +00001346 if (!error.Success())
1347 {
1348 result.AppendErrorWithFormat("Error returning from frame %d of thread %d: %s.", frame_idx, thread_sp->GetIndexID(), error.AsCString());
1349 result.SetStatus (eReturnStatusFailed);
1350 return false;
1351 }
1352
Jim Inghamf59388a2012-09-14 02:14:15 +00001353 result.SetStatus (eReturnStatusSuccessFinishResult);
1354 return true;
1355 }
1356
1357};
1358
Chris Lattner24943d22010-06-08 16:52:24 +00001359//-------------------------------------------------------------------------
1360// CommandObjectMultiwordThread
1361//-------------------------------------------------------------------------
1362
Greg Clayton63094e02010-06-23 01:19:29 +00001363CommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) :
Greg Clayton238c0a12010-09-18 01:14:36 +00001364 CommandObjectMultiword (interpreter,
1365 "thread",
Caroline Ticec1ad82e2010-09-07 22:38:08 +00001366 "A set of commands for operating on one or more threads within a running process.",
Chris Lattner24943d22010-06-08 16:52:24 +00001367 "thread <subcommand> [<subcommand-options>]")
1368{
Greg Clayton238c0a12010-09-18 01:14:36 +00001369 LoadSubCommand ("backtrace", CommandObjectSP (new CommandObjectThreadBacktrace (interpreter)));
1370 LoadSubCommand ("continue", CommandObjectSP (new CommandObjectThreadContinue (interpreter)));
1371 LoadSubCommand ("list", CommandObjectSP (new CommandObjectThreadList (interpreter)));
Jim Inghamf59388a2012-09-14 02:14:15 +00001372 LoadSubCommand ("return", CommandObjectSP (new CommandObjectThreadReturn (interpreter)));
Greg Clayton238c0a12010-09-18 01:14:36 +00001373 LoadSubCommand ("select", CommandObjectSP (new CommandObjectThreadSelect (interpreter)));
1374 LoadSubCommand ("until", CommandObjectSP (new CommandObjectThreadUntil (interpreter)));
1375 LoadSubCommand ("step-in", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1376 interpreter,
Greg Clayton63094e02010-06-23 01:19:29 +00001377 "thread step-in",
Greg Clayton238c0a12010-09-18 01:14:36 +00001378 "Source level single step in specified thread (current thread, if none specified).",
Caroline Tice43b014a2010-10-04 22:28:36 +00001379 NULL,
Greg Clayton238c0a12010-09-18 01:14:36 +00001380 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
1381 eStepTypeInto,
1382 eStepScopeSource)));
Greg Clayton63094e02010-06-23 01:19:29 +00001383
Greg Clayton238c0a12010-09-18 01:14:36 +00001384 LoadSubCommand ("step-out", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1385 interpreter,
1386 "thread step-out",
Jim Ingham1586d972011-12-17 01:35:57 +00001387 "Finish executing the function of the currently selected frame and return to its call site in specified thread (current thread, if none specified).",
Caroline Tice43b014a2010-10-04 22:28:36 +00001388 NULL,
Greg Clayton238c0a12010-09-18 01:14:36 +00001389 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
1390 eStepTypeOut,
1391 eStepScopeSource)));
Chris Lattner24943d22010-06-08 16:52:24 +00001392
Greg Clayton238c0a12010-09-18 01:14:36 +00001393 LoadSubCommand ("step-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1394 interpreter,
1395 "thread step-over",
1396 "Source level single step in specified thread (current thread, if none specified), stepping over calls.",
Caroline Tice43b014a2010-10-04 22:28:36 +00001397 NULL,
Greg Clayton238c0a12010-09-18 01:14:36 +00001398 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
1399 eStepTypeOver,
1400 eStepScopeSource)));
Chris Lattner24943d22010-06-08 16:52:24 +00001401
Greg Clayton238c0a12010-09-18 01:14:36 +00001402 LoadSubCommand ("step-inst", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1403 interpreter,
1404 "thread step-inst",
1405 "Single step one instruction in specified thread (current thread, if none specified).",
Caroline Tice43b014a2010-10-04 22:28:36 +00001406 NULL,
Greg Clayton238c0a12010-09-18 01:14:36 +00001407 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
1408 eStepTypeTrace,
1409 eStepScopeInstruction)));
Greg Clayton63094e02010-06-23 01:19:29 +00001410
Greg Clayton238c0a12010-09-18 01:14:36 +00001411 LoadSubCommand ("step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1412 interpreter,
1413 "thread step-inst-over",
1414 "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.",
Caroline Tice43b014a2010-10-04 22:28:36 +00001415 NULL,
Greg Clayton238c0a12010-09-18 01:14:36 +00001416 eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
1417 eStepTypeTraceOver,
1418 eStepScopeInstruction)));
Chris Lattner24943d22010-06-08 16:52:24 +00001419}
1420
1421CommandObjectMultiwordThread::~CommandObjectMultiwordThread ()
1422{
1423}
1424
1425