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