124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectThread.cpp ---------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectThread.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 18f59388aa57559d7d074613d65b88abacfd699845Jim Ingham#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SourceManager.h" 21cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Interpreter/Options.h" 2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 2749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/LineTable.h" 2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/LineEntry.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInstruction.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOut.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInRange.h" 3849ce8969d3154e1560106cfe530444c09410f217Greg Clayton 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadBacktrace 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadBacktrace : public CommandObjectParsed 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 528ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham class CommandOptions : public Options 538ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 548ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham public: 558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 56f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 57f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 59143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 60143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 618ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 628ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual 648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ~CommandOptions () 658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Error 69143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham Error error; 726475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 748ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham switch (short_option) 758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 'c': 778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 788ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham int32_t input_count = Args::StringToSInt32 (option_arg, -1, 0, &success); 808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 819c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option); 828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (input_count < -1) 838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = UINT32_MAX; 848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham else 858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = input_count; 868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 's': 898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = Args::StringToUInt32 (option_arg, 0, 0, &success); 928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 939c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option); 948ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 968ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham default: 979c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 988ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 998ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1008ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1018ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return error; 1028ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1038ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1048ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham void 105143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 1068ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 107abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_count = UINT32_MAX; 1088ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = 0; 1098ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1108ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 111b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 1128ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetDefinitions () 1138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 1148ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return g_option_table; 1158ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1168ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1178ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Options table: Required for subclasses of Options. 1188ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 119b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 1208ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1218ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Instance variables to hold the values for command options. 1228ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_count; 1238ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_start; 1248ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham }; 1258ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 126238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadBacktrace (CommandInterpreter &interpreter) : 127da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 128ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton "thread backtrace", 129ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton "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.", 130ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 131ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 132ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 133ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 134ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 135ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 136f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options(interpreter) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 13943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 14043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 14243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 14343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatStar; 14443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 14643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 14743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 14943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadBacktrace() 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1568ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Options * 1578ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetOptions () 1588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 1598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return &m_options; 1608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 16363094e0bb161580564954dee512955c1c79d3476Greg Clayton virtual bool 164da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 165abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 166eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 167abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Stream &strm = result.GetOutputStream(); 168abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 169abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton // Don't show source context when doing backtraces. 170abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_frames_with_source = 0; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() == 0) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Thread *thread = m_exe_ctx.GetThreadPtr(); 174ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Thread::GetStatus() returns the number of frames shown. 175ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread->GetStatus (strm, 176ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_start, 177ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_count, 178ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames_with_source)) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham else if (command.GetArgumentCount() == 1 && ::strcmp (command.GetArgumentAtIndex(0), "all") == 0) 184eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 185ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 186b9950593807dad072c9cab77f2b84cb0e8004ffeJim Ingham Mutex::Locker locker (process->GetThreadList().GetMutex()); 187eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t num_threads = process->GetThreadList().GetSize(); 188eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_threads; i++) 189eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 190eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham ThreadSP thread_sp = process->GetThreadList().GetThreadAtIndex(i); 19105750a6bbaa2dc04340278154449c64daa667434Johnny Chen if (!thread_sp->GetStatus (strm, 19205750a6bbaa2dc04340278154449c64daa667434Johnny Chen m_options.m_start, 19305750a6bbaa2dc04340278154449c64daa667434Johnny Chen m_options.m_count, 19405750a6bbaa2dc04340278154449c64daa667434Johnny Chen num_frames_with_source)) 195eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 196f04d661d50bdf32a64f8fc5f84c7fcda72d4cd5aGreg Clayton result.AppendErrorWithFormat ("error displaying backtrace for thread: \"0x%4.4x\"\n", i); 197eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 198eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 199eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 2007868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham 2017868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham if (i < num_threads - 1) 2027868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham result.AppendMessage(""); 2037868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham 204eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 205eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_args = command.GetArgumentCount(); 209ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 210b9950593807dad072c9cab77f2b84cb0e8004ffeJim Ingham Mutex::Locker locker (process->GetThreadList().GetMutex()); 211eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham std::vector<ThreadSP> thread_sps; 212eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i = 0; i < num_args; i++) 214eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 215eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham bool success; 216eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 217eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t thread_idx = Args::StringToUInt32(command.GetArgumentAtIndex(i), 0, 0, &success); 218eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!success) 219eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 220eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("invalid thread specification: \"%s\"\n", command.GetArgumentAtIndex(i)); 221eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 222eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 223eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 224eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 225eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham thread_sps.push_back(process->GetThreadList().FindThreadByIndexID(thread_idx)); 226eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 227eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!thread_sps[i]) 228eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 229eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("no thread with index: \"%s\"\n", command.GetArgumentAtIndex(i)); 230eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 231eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 232eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 233eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 234eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 235eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 236eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_args; i++) 237eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 238abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (!thread_sps[i]->GetStatus (strm, 239abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_options.m_start, 240abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_options.m_count, 241abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source)) 242eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 243eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%s\"\n", command.GetArgumentAtIndex(i)); 244eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 245eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 246eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 247eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 248eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (i < num_args - 1) 249eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendMessage(""); 250eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254da26bd203cbb104291b39891febf7481794f205fJim Ingham 2558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham CommandOptions m_options; 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 2598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim InghamCommandObjectThreadBacktrace::CommandOptions::g_option_table[] = 2608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ 2614d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "How many frames to display (-1 for all)"}, 26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice{ LLDB_OPT_SET_1, false, "start", 's', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame in which to start the backtrace"}, 2634d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 2648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham}; 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266c0418155302e97d37571dfa41a38f6b33759a5e0Greg Claytonenum StepScope 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeSource, 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeInstruction 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadStepWithTypeAndScope : public CommandObjectParsed 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 281f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options (interpreter) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 284143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 293143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 2966475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3008d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'a': 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = Args::StringToBoolean (option_arg, true, &success); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 3059c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid boolean value for option '%c'", short_option); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 3088d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 3098d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'm': 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 31261aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 3158d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 3168d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'r': 317809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham { 318809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 319809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.assign(option_arg); 320809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham } 321809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham break; 3228d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 323f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham case 't': 324f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham { 325f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.clear(); 326f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.assign(option_arg); 327f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham 328f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham } 329f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham break; 3308d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton default: 3319c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 3328d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton break; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 339143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = true; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_mode = eOnlyDuringStepping; 343809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 344f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.clear(); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 347b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_avoid_no_debug; 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RunMode m_run_mode; 360809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham std::string m_avoid_regexp; 361f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham std::string m_step_in_target; 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadStepWithTypeAndScope (CommandInterpreter &interpreter, 365238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *name, 366238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *help, 367238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *syntax, 368238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton StepType step_type, 369238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton StepScope step_scope) : 370ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton CommandObjectParsed (interpreter, name, help, syntax, 371ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 372ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 373ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 374ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 375ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_type (step_type), 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_scope (step_scope), 378f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 38143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_id_arg; 38243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 38343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 38443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_id_arg.arg_type = eArgTypeThreadID; 38543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_id_arg.arg_repetition = eArgRepeatOptional; 38643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 38743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 38843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_id_arg); 38943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 39043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 39143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadStepWithTypeAndScope () 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 406da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 408da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 411238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous(); 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_threads = process->GetThreadList().GetSize(); 414ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Thread *thread = NULL; 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 416ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() == 0) 417ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 418ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread = process->GetThreadList().GetSelectedThread().get(); 419ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread == NULL) 420ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 421ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("no selected thread in process"); 422ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 423ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 424ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 428ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *thread_idx_cstr = command.GetArgumentAtIndex(0); 429ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t step_thread_idx = Args::StringToUInt32 (thread_idx_cstr, LLDB_INVALID_INDEX32); 430ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (step_thread_idx == LLDB_INVALID_INDEX32) 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 432ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("invalid thread index '%s'.\n", thread_idx_cstr); 433ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 434ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread = process->GetThreadList().FindThreadByIndexID(step_thread_idx).get(); 437ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread == NULL) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 439ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", 440ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton step_thread_idx, num_threads); 441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 442ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 444ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 446ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool abort_other_plans = false; 447ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const lldb::RunMode stop_other_threads = m_options.m_run_mode; 448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 449ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // This is a bit unfortunate, but not all the commands in this command object support 450ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // only while stepping, so I use the bool for them. 451ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool bool_stop_other_threads; 452ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_options.m_run_mode == eAllThreads) 453ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads = false; 454ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_options.m_run_mode == eOnlyDuringStepping) 455ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 456ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_step_type == eStepTypeOut) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = false; 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = true; 460ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 461ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 462ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads = true; 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 464008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham ThreadPlanSP new_plan_sp; 465ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 466ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_step_type == eStepTypeInto) 467ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 468ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 470ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame->HasDebugInformation ()) 471ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 472008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans, 473ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 474ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything), 475ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_step_in_target.c_str(), 476ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton stop_other_threads, 477ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_avoid_no_debug); 478008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham if (new_plan_sp && !m_options.m_avoid_regexp.empty()) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 480008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan_sp.get()); 481ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str()); 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 485008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 486ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 487ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 488ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeOver) 489ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 490ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 491ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 492ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame->HasDebugInformation()) 493008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans, 494ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 495ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything), 496ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton stop_other_threads); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 498008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true, 499ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton abort_other_plans, 500ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads); 50188e3de205708f14431559072ca258899b5ac31ccJim Ingham 502ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 503ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeTrace) 504ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 505008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 506ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 507ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeTraceOver) 508ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 509008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads); 510ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 511ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeOut) 512ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 513008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepOut (abort_other_plans, 514ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 515ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton false, 516ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads, 517ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eVoteYes, 518ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eVoteNoOpinion, 519ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread->GetSelectedFrameIndex()); 520ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 521ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 522ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 523ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("step type is not supported"); 524ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 525ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 526ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 527ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 528ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // If we got a new plan, then set it to be a master plan (User level Plans should be master plans 529ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // so that they can be interruptible). Then resume the process. 530ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 531008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham if (new_plan_sp) 532ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 533008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetIsMasterPlan (true); 534008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetOkayToDiscard (false); 53588e3de205708f14431559072ca258899b5ac31ccJim Ingham 536ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 537ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->Resume (); 538ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 539ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 540ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (synchronous_execution) 541ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 542ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StateType state = process->WaitForProcessToStop (NULL); 543ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 544ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //EventSP event_sp; 545ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //StateType state = process->WaitForStateChangedEvents (NULL, event_sp); 546ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //while (! StateIsStoppedState (state)) 547ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // { 548ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // state = process->WaitForStateChangedEvents (NULL, event_sp); 549ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // } 550ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 551ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetDidChangeProcessState (true); 552ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 553ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 55488e3de205708f14431559072ca258899b5ac31ccJim Ingham } 55588e3de205708f14431559072ca258899b5ac31ccJim Ingham else 55688e3de205708f14431559072ca258899b5ac31ccJim Ingham { 557ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessContinuingNoResult); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 560ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 561ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 562ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("Couldn't find thread plan to implement step type."); 563ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 564ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepType m_step_type; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepScope m_step_scope; 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 574b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonstatic OptionEnumValueElement 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_tri_running_mode[] = 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 577fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyThisThread, "this-thread", "Run only this thread"}, 578fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eAllThreads, "all-threads", "Run all threads"}, 579fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyDuringStepping, "while-stepping", "Run only this thread while stepping"}, 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 583b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonstatic OptionEnumValueElement 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_duo_running_mode[] = 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 586fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyThisThread, "this-thread", "Run only this thread"}, 587fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eAllThreads, "all-threads", "Run all threads"}, 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 591b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] = 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5944d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 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."}, 5954d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 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."}, 596f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham{ 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."}, 597f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham{ 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."}, 5984d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadContinue 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 606da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadContinue : public CommandObjectParsed 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 610238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadContinue (CommandInterpreter &interpreter) : 611da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 612da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread continue", 613da26bd203cbb104291b39891febf7481794f205fJim Ingham "Continue execution of one or more threads in an active process.", 614da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 615ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 616ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 617ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 618ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 62143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 62243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 62343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 62443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 62543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatPlus; 62643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 62743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 62843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 62943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 63043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 63143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadContinue () 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 641da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 643238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous (); 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 645238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (!m_interpreter.GetDebugger().GetSelectedTarget().get()) 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 647e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 652ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process exists. Cannot continue"); 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->GetState(); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((state == eStateCrashed) || (state == eStateStopped) || (state == eStateSuspended)) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 663edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Mutex::Locker locker (process->GetThreadList().GetMutex()); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = command.GetArgumentCount(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc > 0) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 668edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton std::vector<Thread *> resume_threads; 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<argc; ++i) 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 671d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham bool success; 672d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham const int base = 0; 673edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton uint32_t thread_idx = Args::StringToUInt32 (command.GetArgumentAtIndex(i), LLDB_INVALID_INDEX32, base, &success); 674edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (success) 675d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham { 676edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().FindThreadByIndexID(thread_idx).get(); 677edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 678edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (thread) 679edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton { 680edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton resume_threads.push_back(thread); 681edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton } 682edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton else 683edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton { 684edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.AppendErrorWithFormat("invalid thread index %u.\n", thread_idx); 685edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.SetStatus (eReturnStatusFailed); 686edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton return false; 687edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton } 688d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 690d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham { 691edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.AppendErrorWithFormat ("invalid thread index argument: \"%s\".\n", command.GetArgumentAtIndex(i)); 692d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.SetStatus (eReturnStatusFailed); 693d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham return false; 694d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham } 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 696edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 697edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.empty()) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no valid thread indexes were specified"); 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 705edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.size() == 1) 706d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("Resuming thread: "); 707d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham else 708d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("Resuming threads: "); 709edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 710edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton for (uint32_t idx=0; idx<num_threads; ++idx) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 712edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 713edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton std::vector<Thread *>::iterator this_thread_pos = find(resume_threads.begin(), resume_threads.end(), thread); 714d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham 715edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (this_thread_pos != resume_threads.end()) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 717edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton resume_threads.erase(this_thread_pos); 718edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.size() > 0) 719d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("%u, ", thread->GetIndexID()); 720d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham else 721d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("%u ", thread->GetIndexID()); 722d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7305f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("in process %" PRIu64 "\n", process->GetID()); 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 735c833295baeec641086f536e78050388af36784f8Jim Ingham Thread *current_thread = process->GetThreadList().GetSelectedThread().get(); 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (current_thread == NULL) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("the process doesn't have a current thread"); 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the actions that the threads should each take when resuming 743edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton for (uint32_t idx=0; idx<num_threads; ++idx) 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 745edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == current_thread) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7485f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Resuming thread 0x%4.4" PRIx64 " in process %" PRIu64 "\n", thread->GetID(), process->GetID()); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 757edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume()); 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID()); 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 764bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton state = process->WaitForProcessToStop (NULL); 765edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 7675f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s\n", error.AsCString()); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Process cannot be continued from its current state (%s).\n", 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadUntil 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 797da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadUntil : public CommandObjectParsed 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_thread_idx; 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_frame_idx; 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 807f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 808f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options (interpreter), 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx(LLDB_INVALID_THREAD_ID), 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx(LLDB_INVALID_FRAME_ID) 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 812143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 813143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 822143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 8256475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 't': 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 831bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton m_thread_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_INDEX32); 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_idx == LLDB_INVALID_INDEX32) 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8349c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid thread index '%s'", option_arg); 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'f': 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_FRAME_ID); 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_frame_idx == LLDB_INVALID_FRAME_ID) 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8439c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid frame index '%s'", option_arg); 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'm': 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 85061aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton lldb::RunMode run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error); 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85261aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton if (error.Success()) 85361aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton { 85461aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton if (run_mode == eAllThreads) 85561aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_stop_others = false; 85661aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton else 85761aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_stop_others = true; 85861aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton } 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 8629c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 870143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx = LLDB_INVALID_THREAD_ID; 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = 0; 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others = false; 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 877b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_step_thread_idx; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_stop_others; 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 888b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 893238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadUntil (CommandInterpreter &interpreter) : 894da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 895da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread until", 896da26bd203cbb104291b39891febf7481794f205fJim Ingham "Run the current or specified thread until it reaches a given line number or leaves the current function.", 897da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 898ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 899ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 900ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 901ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 902f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 90543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData line_num_arg; 90643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 90743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 90843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice line_num_arg.arg_type = eArgTypeLineNum; 90943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice line_num_arg.arg_repetition = eArgRepeatPlain; 91043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 91143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 91243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (line_num_arg); 91343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 91443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 91543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadUntil () 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 931da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 933da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 935238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous (); 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 937238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 938eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target == NULL) 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 940e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 945ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("need a valid process to step"); 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = NULL; 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t line_number; 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() != 1) 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax()); 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_number = Args::StringToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX); 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_number == UINT32_MAX) 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9679c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton result.AppendErrorWithFormat ("invalid line number: '%s'.\n", command.GetArgumentAtIndex(0)); 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 974c833295baeec641086f536e78050388af36784f8Jim Ingham thread = process->GetThreadList().GetSelectedThread().get(); 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 978a224377015d48e926408fd63b7f9b2d557b91d53Greg Clayton thread = process->GetThreadList().FindThreadByIndexID(m_options.m_thread_idx).get(); 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 984b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", 985b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx, 986b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham num_threads); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 991d82bc6d623930e796d596d190399ec2450980e0fJim Ingham const bool abort_other_plans = false; 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = thread->GetStackFrameAtIndex(m_options.m_frame_idx).get(); 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame == NULL) 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 997b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Frame index %u is out of range for thread %u.\n", 998b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_frame_idx, 999b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx); 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1004008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham ThreadPlanSP new_plan_sp; 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame->HasDebugInformation ()) 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Finally we got here... Translate the given line number to a bunch of addresses: 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc(frame->GetSymbolContext (eSymbolContextCompUnit)); 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineTable *line_table = NULL; 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table = sc.comp_unit->GetLineTable(); 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_table == NULL) 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Failed to resolve the line table for frame %u of thread index %u.\n", 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options.m_frame_idx, m_options.m_thread_idx); 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry function_start; 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_ptr = 0, end_ptr; 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<addr_t> address_list; 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Find the beginning & end index of the 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddressRange fun_addr_range = sc.function->GetAddressRange(); 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address fun_start_addr = fun_addr_range.GetBaseAddress(); 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_start_addr, function_start, &index_ptr); 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1031b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham Address fun_end_addr(fun_start_addr.GetSection(), 1032b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham fun_start_addr.GetOffset() + fun_addr_range.GetByteSize()); 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr); 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1035b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham bool all_in_function = true; 1036b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (index_ptr <= end_ptr) 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry line_entry; 1040d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham const bool exact = false; 1041d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, exact, &line_entry); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index_ptr == UINT32_MAX) 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1045eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(target); 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (address != LLDB_INVALID_ADDRESS) 1047b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham { 1048b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (fun_addr_range.ContainsLoadAddress (address, target)) 1049b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham address_list.push_back (address); 1050b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham else 1051b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham all_in_function = false; 1052b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham } 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index_ptr++; 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1056b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (address_list.size() == 0) 1057b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham { 1058b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (all_in_function) 1059b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("No line entries matching until target.\n"); 1060b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham else 1061b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Until target outside of the current function.\n"); 1062b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 1063b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.SetStatus (eReturnStatusFailed); 1064b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham return false; 1065b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham } 1066b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 1067008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp = thread->QueueThreadPlanForStepUntil (abort_other_plans, 1068b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham &address_list.front(), 1069b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham address_list.size(), 1070b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_stop_others, 1071fade78ab4f618cd2921e53e14a7c4db7484d470dJim Ingham m_options.m_frame_idx); 107288e3de205708f14431559072ca258899b5ac31ccJim Ingham // User level plans should be master plans so they can be interrupted (e.g. by hitting a breakpoint) 107388e3de205708f14431559072ca258899b5ac31ccJim Ingham // and other plans executed by the user (stepping around the breakpoint) and then a "continue" 107488e3de205708f14431559072ca258899b5ac31ccJim Ingham // will resume the original plan. 1075008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetIsMasterPlan (true); 1076008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetOkayToDiscard(false); 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1080b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Frame index %u of thread %u has no debug information.\n", 1081b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_frame_idx, 1082b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx); 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1088c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (m_options.m_thread_idx); 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume ()); 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10925f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID()); 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->WaitForProcessToStop (NULL); 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 10985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s.\n", error.AsCString()); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1115da26bd203cbb104291b39891febf7481794f205fJim Ingham 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1120b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadUntil::CommandOptions::g_option_table[] = 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice{ LLDB_OPT_SET_1, false, "frame", 'f', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame index for until operation - defaults to 0"}, 11244d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "thread", 't', required_argument, NULL, 0, eArgTypeThreadIndex, "Thread index for the thread for until operation"}, 11254d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 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"}, 11264d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadSelect 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1134da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadSelect : public CommandObjectParsed 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1138238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadSelect (CommandInterpreter &interpreter) : 1139da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1140da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread select", 1141da26bd203cbb104291b39891febf7481794f205fJim Ingham "Select a thread as the currently active thread.", 1142da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 1143ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 1144ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1145ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1146ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 114943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 115043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 115243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 115343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatPlain; 115443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 115643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 115743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 115943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadSelect () 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1168da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 1170da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1172ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process"); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (command.GetArgumentCount() != 1) 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11817e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda result.AppendErrorWithFormat("'%s' takes exactly one thread index argument:\nUsage: %s\n", m_cmd_name.c_str(), m_cmd_syntax.c_str()); 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_id = Args::StringToUInt32(command.GetArgumentAtIndex(0), 0, 0); 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *new_thread = process->GetThreadList().FindThreadByIndexID(index_id).get(); 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (new_thread == NULL) 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11919c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton result.AppendErrorWithFormat ("invalid thread #%s.\n", command.GetArgumentAtIndex(0)); 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11962e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham process->GetThreadList().SetSelectedThreadByID(new_thread->GetID(), true); 11978dbb6e84dd0595ae90656b6146ca19edcb0a54d0Johnny Chen result.SetStatus (eReturnStatusSuccessFinishNoResult); 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadList 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1209da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadList : public CommandObjectParsed 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 121163094e0bb161580564954dee512955c1c79d3476Greg Claytonpublic: 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1214238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadList (CommandInterpreter &interpreter): 1215da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1216da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread list", 1217da26bd203cbb104291b39891febf7481794f205fJim Ingham "Show a summary of all current threads in a process.", 1218da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread list", 1219ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 1220ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1222ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 122363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 122463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 122563094e0bb161580564954dee512955c1c79d3476Greg Clayton 122663094e0bb161580564954dee512955c1c79d3476Greg Clayton ~CommandObjectThreadList() 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122863094e0bb161580564954dee512955c1c79d3476Greg Clayton } 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1230da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 123163094e0bb161580564954dee512955c1c79d3476Greg Clayton bool 1232da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 123363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 12342e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham Stream &strm = result.GetOutputStream(); 123563094e0bb161580564954dee512955c1c79d3476Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 1236ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 1237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool only_threads_with_stop_reason = false; 1238ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t start_frame = 0; 1239ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_frames = 0; 1240ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_frames_with_source = 0; 1241ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetStatus(strm); 1242ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadStatus (strm, 1243ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton only_threads_with_stop_reason, 1244ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton start_frame, 1245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames, 1246ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames_with_source); 124763094e0bb161580564954dee512955c1c79d3476Greg Clayton return result.Succeeded(); 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124963094e0bb161580564954dee512955c1c79d3476Greg Clayton}; 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1251be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham//------------------------------------------------------------------------- 1252be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham// CommandObjectThreadReturn 1253be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham//------------------------------------------------------------------------- 1254be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1255f59388aa57559d7d074613d65b88abacfd699845Jim Inghamclass CommandObjectThreadReturn : public CommandObjectRaw 1256f59388aa57559d7d074613d65b88abacfd699845Jim Ingham{ 1257f59388aa57559d7d074613d65b88abacfd699845Jim Inghampublic: 1258be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham class CommandOptions : public Options 1259be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1260be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham public: 1261be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1262be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham CommandOptions (CommandInterpreter &interpreter) : 1263be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Options (interpreter), 1264be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham m_from_expression (false) 1265be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1266be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham // Keep default values of all options in one place: OptionParsingStarting () 1267be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham OptionParsingStarting (); 1268be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1269be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1270be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham virtual 1271be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham ~CommandOptions () 1272be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1273be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1274be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1275be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham virtual Error 1276be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham SetOptionValue (uint32_t option_idx, const char *option_arg) 1277be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1278be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Error error; 1279be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham const int short_option = m_getopt_table[option_idx].val; 1280be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1281be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham switch (short_option) 1282be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1283be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham case 'x': 1284be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1285be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool success; 1286be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool tmp_value = Args::StringToBoolean (option_arg, false, &success); 1287be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham if (success) 1288be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham m_from_expression = tmp_value; 1289be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham else 1290be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1291be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham error.SetErrorStringWithFormat ("invalid boolean value '%s' for 'x' option", option_arg); 1292be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1293be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1294be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham break; 1295be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham default: 1296be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 1297be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham break; 1298be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1299be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1300be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham return error; 1301be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1302be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1303be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham void 1304be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham OptionParsingStarting () 1305be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1306be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham m_from_expression = false; 1307be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1308be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1309be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham const OptionDefinition* 1310be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham GetDefinitions () 1311be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1312be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham return g_option_table; 1313be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1314be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1315be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool m_from_expression; 1316be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1317be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham // Options table: Required for subclasses of Options. 1318be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1319be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham static OptionDefinition g_option_table[]; 1320be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1321be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham // Instance variables to hold the values for command options. 1322be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham }; 1323be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1324be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham virtual 1325be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Options * 1326be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham GetOptions () 1327be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1328be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham return &m_options; 1329be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1330be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1331f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandObjectThreadReturn (CommandInterpreter &interpreter) : 1332f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandObjectRaw (interpreter, 1333f59388aa57559d7d074613d65b88abacfd699845Jim Ingham "thread return", 1334be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham "Return from the currently selected frame, short-circuiting execution of the frames below it, with an optional return value," 1335be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham " or with the -x option from the innermost function evaluation.", 1336f59388aa57559d7d074613d65b88abacfd699845Jim Ingham "thread return", 1337ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 1338ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1339ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1340be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham eFlagProcessMustBePaused ), 1341be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham m_options (interpreter) 1342f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1343f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandArgumentEntry arg; 1344f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandArgumentData expression_arg; 1345f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1346f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // Define the first (and only) variant of this arg. 1347f59388aa57559d7d074613d65b88abacfd699845Jim Ingham expression_arg.arg_type = eArgTypeExpression; 1348be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham expression_arg.arg_repetition = eArgRepeatOptional; 1349f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1350f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // There is only one variant this argument could be; put it into the argument entry. 1351f59388aa57559d7d074613d65b88abacfd699845Jim Ingham arg.push_back (expression_arg); 1352f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1353f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // Push the data for the first argument into the m_arguments vector. 1354f59388aa57559d7d074613d65b88abacfd699845Jim Ingham m_arguments.push_back (arg); 1355f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1356f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1357f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1358f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1359f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ~CommandObjectThreadReturn() 1360f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1361f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1362f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1363f59388aa57559d7d074613d65b88abacfd699845Jim Inghamprotected: 1364f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1365f59388aa57559d7d074613d65b88abacfd699845Jim Ingham bool DoExecute 1366f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ( 1367f59388aa57559d7d074613d65b88abacfd699845Jim Ingham const char *command, 1368f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandReturnObject &result 1369f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ) 1370f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1371be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham // I am going to handle this by hand, because I don't want you to have to say: 1372be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham // "thread return -- -5". 1373be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham if (command[0] == '-' && command[1] == 'x') 1374be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1375be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham if (command && command[2] != '\0') 1376be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.AppendWarning("Return values ignored when returning from user called expressions"); 1377be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1378be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Thread *thread = m_exe_ctx.GetThreadPtr(); 1379be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Error error; 1380be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham error = thread->UnwindInnermostExpression(); 1381be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham if (!error.Success()) 1382be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1383be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.AppendErrorWithFormat ("Unwinding expression failed - %s.", error.AsCString()); 1384be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.SetStatus (eReturnStatusFailed); 1385be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1386be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham else 1387be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1388be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool success = thread->SetSelectedFrameByIndexNoisily (0, result.GetOutputStream()); 1389be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham if (success) 1390be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1391be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham m_exe_ctx.SetFrameSP(thread->GetSelectedFrame ()); 1392be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 1393be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1394be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham else 1395be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham { 1396be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.AppendErrorWithFormat ("Could not select 0th frame after unwinding expression."); 1397be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham result.SetStatus (eReturnStatusFailed); 1398be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1399be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1400be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham return result.Succeeded(); 1401be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham } 1402be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1403f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ValueObjectSP return_valobj_sp; 1404f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1405ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrameSP frame_sp = m_exe_ctx.GetFrameSP(); 1406f59388aa57559d7d074613d65b88abacfd699845Jim Ingham uint32_t frame_idx = frame_sp->GetFrameIndex(); 1407f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1408f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (frame_sp->IsInlined()) 1409f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1410f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendError("Don't know how to return from inlined frames."); 1411f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1412f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1413f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1414f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1415f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (command && command[0] != '\0') 1416f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1417ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 141847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 1419f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1420f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options.SetUnwindOnError(true); 1421f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options.SetUseDynamic(eNoDynamicValues); 1422f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1423f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ExecutionResults exe_results = eExecutionSetupError; 1424f59388aa57559d7d074613d65b88abacfd699845Jim Ingham exe_results = target->EvaluateExpression (command, 1425f59388aa57559d7d074613d65b88abacfd699845Jim Ingham frame_sp.get(), 1426f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return_valobj_sp, 1427f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options); 1428f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (exe_results != eExecutionCompleted) 1429f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1430f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (return_valobj_sp) 1431f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Error evaluating result expression: %s", return_valobj_sp->GetError().AsCString()); 1432f59388aa57559d7d074613d65b88abacfd699845Jim Ingham else 1433f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Unknown error evaluating result expression."); 1434f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1435f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1436f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1437f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1438f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1439f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1440f59388aa57559d7d074613d65b88abacfd699845Jim Ingham Error error; 1441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ThreadSP thread_sp = m_exe_ctx.GetThreadSP(); 144294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham const bool broadcast = true; 144394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham error = thread_sp->ReturnFromFrame (frame_sp, return_valobj_sp, broadcast); 1444f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (!error.Success()) 1445f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1446f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Error returning from frame %d of thread %d: %s.", frame_idx, thread_sp->GetIndexID(), error.AsCString()); 1447f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1448f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1449f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1450f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1451f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 1452f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return true; 1453f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1454be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 1455be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham CommandOptions m_options; 1456f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1457f59388aa57559d7d074613d65b88abacfd699845Jim Ingham}; 1458be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim InghamOptionDefinition 1459be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim InghamCommandObjectThreadReturn::CommandOptions::g_option_table[] = 1460be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham{ 1461be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham{ LLDB_OPT_SET_ALL, false, "from-expression", 'x', no_argument, NULL, 0, eArgTypeNone, "Return from the innermost expression evaluation."}, 1462be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 1463be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham}; 1464f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordThread 146724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146963094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) : 1470238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 1471238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread", 1472c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for operating on one or more threads within a running process.", 147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread <subcommand> [<subcommand-options>]") 147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1475238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("backtrace", CommandObjectSP (new CommandObjectThreadBacktrace (interpreter))); 1476238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("continue", CommandObjectSP (new CommandObjectThreadContinue (interpreter))); 1477238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectThreadList (interpreter))); 1478f59388aa57559d7d074613d65b88abacfd699845Jim Ingham LoadSubCommand ("return", CommandObjectSP (new CommandObjectThreadReturn (interpreter))); 1479238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("select", CommandObjectSP (new CommandObjectThreadSelect (interpreter))); 1480238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("until", CommandObjectSP (new CommandObjectThreadUntil (interpreter))); 1481238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-in", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1482238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 148363094e0bb161580564954dee512955c1c79d3476Greg Clayton "thread step-in", 1484238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Source level single step in specified thread (current thread, if none specified).", 148543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1486238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeInto, 1487238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 148863094e0bb161580564954dee512955c1c79d3476Greg Clayton 1489238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-out", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1490238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1491238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-out", 14921586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham "Finish executing the function of the currently selected frame and return to its call site in specified thread (current thread, if none specified).", 149343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1494238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeOut, 1495238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 1496238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1497238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1498238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1499238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-over", 1500238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Source level single step in specified thread (current thread, if none specified), stepping over calls.", 150143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1502238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeOver, 1503238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 1504238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1505238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-inst", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1506238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1507238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-inst", 1508238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Single step one instruction in specified thread (current thread, if none specified).", 150943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1510238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeTrace, 1511238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeInstruction))); 1512238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1513238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1514238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1515238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-inst-over", 1516238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.", 151743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1518238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeTraceOver, 1519238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeInstruction))); 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordThread::~CommandObjectMultiwordThread () 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1527