CommandObjectThread.cpp revision 36da2aa6dc5ad9994b638ed09eb81c44cc05540b
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
464ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        ThreadPlan *new_plan = NULL;
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            {
472ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                new_plan = 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);
478ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                if (new_plan && !m_options.m_avoid_regexp.empty())
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
480ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan);
481ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str());
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
484ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            else
48588e3de205708f14431559072ca258899b5ac31ccJim Ingham                new_plan = 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())
493ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                new_plan = 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
498ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                new_plan = 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        {
505ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads);
506ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
507ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        else if (m_step_type == eStepTypeTraceOver)
508ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
509ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads);
510ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
511ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        else if (m_step_type == eStepTypeOut)
512ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
513ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            new_plan = 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
531ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (new_plan != NULL)
532ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
533ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            new_plan->SetIsMasterPlan (true);
534ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            new_plan->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
100488e3de205708f14431559072ca258899b5ac31ccJim Ingham            ThreadPlan *new_plan = NULL;
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
1067b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                new_plan = 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.
107588e3de205708f14431559072ca258899b5ac31ccJim Ingham                new_plan->SetIsMasterPlan (true);
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_plan->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
1251f59388aa57559d7d074613d65b88abacfd699845Jim Inghamclass CommandObjectThreadReturn : public CommandObjectRaw
1252f59388aa57559d7d074613d65b88abacfd699845Jim Ingham{
1253f59388aa57559d7d074613d65b88abacfd699845Jim Inghampublic:
1254f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    CommandObjectThreadReturn (CommandInterpreter &interpreter) :
1255f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        CommandObjectRaw (interpreter,
1256f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                          "thread return",
1257f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                          "Return from the currently selected frame, short-circuiting execution of the frames below it, with an optional return value.",
1258f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                          "thread return",
1259ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                          eFlagRequiresFrame         |
1260ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                          eFlagTryTargetAPILock      |
1261ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                          eFlagProcessMustBeLaunched |
1262ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                          eFlagProcessMustBePaused   )
1263f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    {
1264f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        CommandArgumentEntry arg;
1265f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        CommandArgumentData expression_arg;
1266f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1267f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        // Define the first (and only) variant of this arg.
1268f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        expression_arg.arg_type = eArgTypeExpression;
1269f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        expression_arg.arg_repetition = eArgRepeatPlain;
1270f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1271f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        // There is only one variant this argument could be; put it into the argument entry.
1272f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        arg.push_back (expression_arg);
1273f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1274f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        // Push the data for the first argument into the m_arguments vector.
1275f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        m_arguments.push_back (arg);
1276f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1277f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1278f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    }
1279f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1280f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    ~CommandObjectThreadReturn()
1281f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    {
1282f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    }
1283f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1284f59388aa57559d7d074613d65b88abacfd699845Jim Inghamprotected:
1285f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1286f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    bool DoExecute
1287f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    (
1288f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        const char *command,
1289f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        CommandReturnObject &result
1290f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    )
1291f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    {
1292f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        ValueObjectSP return_valobj_sp;
1293f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1294ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        StackFrameSP frame_sp = m_exe_ctx.GetFrameSP();
1295f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        uint32_t frame_idx = frame_sp->GetFrameIndex();
1296f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1297f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        if (frame_sp->IsInlined())
1298f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        {
1299f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            result.AppendError("Don't know how to return from inlined frames.");
1300f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            result.SetStatus (eReturnStatusFailed);
1301f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            return false;
1302f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        }
1303f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1304f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        if (command && command[0] != '\0')
1305f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        {
1306ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            Target *target = m_exe_ctx.GetTargetPtr();
130747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham            EvaluateExpressionOptions options;
1308f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1309f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            options.SetUnwindOnError(true);
1310f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            options.SetUseDynamic(eNoDynamicValues);
1311f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1312f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            ExecutionResults exe_results = eExecutionSetupError;
1313f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            exe_results = target->EvaluateExpression (command,
1314f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                                                      frame_sp.get(),
1315f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                                                      return_valobj_sp,
1316f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                                                      options);
1317f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            if (exe_results != eExecutionCompleted)
1318f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            {
1319f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                if (return_valobj_sp)
1320f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                    result.AppendErrorWithFormat("Error evaluating result expression: %s", return_valobj_sp->GetError().AsCString());
1321f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                else
1322f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                    result.AppendErrorWithFormat("Unknown error evaluating result expression.");
1323f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                result.SetStatus (eReturnStatusFailed);
1324f59388aa57559d7d074613d65b88abacfd699845Jim Ingham                return false;
1325f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1326f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            }
1327f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        }
1328f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1329f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        Error error;
1330ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        ThreadSP thread_sp = m_exe_ctx.GetThreadSP();
133194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        const bool broadcast = true;
133294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        error = thread_sp->ReturnFromFrame (frame_sp, return_valobj_sp, broadcast);
1333f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        if (!error.Success())
1334f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        {
1335f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            result.AppendErrorWithFormat("Error returning from frame %d of thread %d: %s.", frame_idx, thread_sp->GetIndexID(), error.AsCString());
1336f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            result.SetStatus (eReturnStatusFailed);
1337f59388aa57559d7d074613d65b88abacfd699845Jim Ingham            return false;
1338f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        }
1339f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1340f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        result.SetStatus (eReturnStatusSuccessFinishResult);
1341f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        return true;
1342f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    }
1343f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
1344f59388aa57559d7d074613d65b88abacfd699845Jim Ingham};
1345f59388aa57559d7d074613d65b88abacfd699845Jim Ingham
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordThread
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135063094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) :
1351238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
1352238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                            "thread",
1353c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for operating on one or more threads within a running process.",
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "thread <subcommand> [<subcommand-options>]")
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1356238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("backtrace",  CommandObjectSP (new CommandObjectThreadBacktrace (interpreter)));
1357238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("continue",   CommandObjectSP (new CommandObjectThreadContinue (interpreter)));
1358238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("list",       CommandObjectSP (new CommandObjectThreadList (interpreter)));
1359f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    LoadSubCommand ("return",     CommandObjectSP (new CommandObjectThreadReturn (interpreter)));
1360238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("select",     CommandObjectSP (new CommandObjectThreadSelect (interpreter)));
1361238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("until",      CommandObjectSP (new CommandObjectThreadUntil (interpreter)));
1362238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("step-in",    CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1363238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    interpreter,
136463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                    "thread step-in",
1365238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "Source level single step in specified thread (current thread, if none specified).",
136643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                                                    NULL,
1367238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepTypeInto,
1368238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepScopeSource)));
136963094e0bb161580564954dee512955c1c79d3476Greg Clayton
1370238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("step-out",   CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1371238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    interpreter,
1372238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "thread step-out",
13731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                    "Finish executing the function of the currently selected frame and return to its call site in specified thread (current thread, if none specified).",
137443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                                                    NULL,
1375238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepTypeOut,
1376238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepScopeSource)));
1377238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton
1378238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("step-over",   CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1379238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    interpreter,
1380238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "thread step-over",
1381238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "Source level single step in specified thread (current thread, if none specified), stepping over calls.",
138243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                                                    NULL,
1383238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepTypeOver,
1384238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepScopeSource)));
1385238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton
1386238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("step-inst",   CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1387238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    interpreter,
1388238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "thread step-inst",
1389238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "Single step one instruction in specified thread (current thread, if none specified).",
139043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                                                    NULL,
1391238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepTypeTrace,
1392238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepScopeInstruction)));
1393238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton
1394238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
1395238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    interpreter,
1396238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "thread step-inst-over",
1397238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.",
139843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                                                    NULL,
1399238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepTypeTraceOver,
1400238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                                                    eStepScopeInstruction)));
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordThread::~CommandObjectMultiwordThread ()
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1408