CommandObjectThread.cpp revision eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbf
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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectThread.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SourceManager.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInstruction.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOut.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInRange.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineEntry.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayThreadInfo
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4263094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Stream &strm,
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread *thread,
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool only_threads_with_stop_reason,
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_source
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (thread)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (only_threads_with_stop_reason)
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            if (thread->GetStopInfo() == NULL)
54643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                return false;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        strm.Indent();
58c833295baeec641086f536e78050388af36784f8Jim Ingham        strm.Printf("%c ", thread->GetProcess().GetThreadList().GetSelectedThread().get() == thread ? '*' : ' ');
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Show one frame with only the first showing source
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_source)
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DisplayFramesForExecutionContext (thread,
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              interpreter,
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              strm,
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              0,    // Start at first frame
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              1,    // Number of frames to show
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              false,// Don't show the frame info since we already displayed most of it above...
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              1,    // Show source for the first frame
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              3,    // lines of source context before
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              3);   // lines of source context after
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            thread->DumpInfo (strm,
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              true, // Dump the stop reason?
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              true, // Dump the thread name?
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              true, // Dump the queue name?
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              0);   // Display context info for stack frame zero
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            strm.EOL();
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayThreadsInfo
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
9263094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext *exe_ctx,
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result,
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool only_threads_with_stop_reason,
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_source
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StreamString strm;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_thread_infos_dumped = 0;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ctx->process)
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t num_threads = exe_ctx->process->GetThreadList().GetSize();
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_threads > 0)
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t i = 0; i < num_threads; i++)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Thread *thread = exe_ctx->process->GetThreadList().GetThreadAtIndex(i).get();
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (thread)
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (DisplayThreadInfo (interpreter,
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       strm,
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       thread,
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       only_threads_with_stop_reason,
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       show_source))
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ++num_thread_infos_dumped;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_thread_infos_dumped > 0)
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_thread_infos_dumped < num_threads)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.GetOutputStream().Printf("%u of %u threads stopped with reasons:\n", num_thread_infos_dumped, num_threads);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.GetOutputStream().GetString().append(strm.GetString());
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus (eReturnStatusSuccessFinishNoResult);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_thread_infos_dumped;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayFramesForExecutionContext
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread *thread,
14163094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Stream& strm,
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t first_frame,
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_frames,
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_frame_info,
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_frames_with_source,
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t source_lines_before,
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t source_lines_after
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (thread == NULL)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_frames_displayed = 0;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_frames == 0)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    thread->DumpInfo (strm,
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      true,     // Dump the stop reason?
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      true,     // Dump the thread name?
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      true,     // Dump the queue name?
16333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton                      num_frames > 1 ? UINT32_MAX : first_frame);  // Dump info for the first stack frame if we are showing only on frame
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.EOL();
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentMore();
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StackFrameSP frame_sp;
16854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    uint32_t frame_idx = 0;
1698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    uint32_t last_frame;
1708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
1718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    // Don't let the last frame wrap around...
1728ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    if (num_frames == UINT32_MAX)
1738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        last_frame = UINT32_MAX;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
1758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        last_frame = first_frame + num_frames;
1768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
1778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx)
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        frame_sp = thread->GetStackFrameAtIndex (frame_idx);
1808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        if (frame_sp.get() == NULL)
1818ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            break;
1828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
1838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        if (DisplayFrameForExecutionContext (thread,
1848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             frame_sp.get(),
1858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             interpreter,
1868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             strm,
1878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             show_frame_info,
1888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             num_frames_with_source > first_frame - frame_idx,
1898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             source_lines_before,
1908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                             source_lines_after) == false)
1918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            break;
1928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
1938ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        ++num_frames_displayed;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentLess();
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_frames_displayed;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayFrameForExecutionContext
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread *thread,
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StackFrame *frame,
20563094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Stream& strm,
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_frame_info,
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool show_source,
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t source_lines_before,
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t source_lines_after
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // thread and frame must be filled in prior to calling this function
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (thread && frame)
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_frame_info)
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            strm.Indent();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            frame->Dump (&strm, true);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            strm.EOL();
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc (frame->GetSymbolContext(eSymbolContextCompUnit | eSymbolContextLineEntry));
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (show_source && sc.comp_unit && sc.line_entry.IsValid())
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
22763094e0bb161580564954dee512955c1c79d3476Greg Clayton            interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sc.line_entry.file,
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sc.line_entry.line,
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    3,
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    3,
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    "->",
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    &strm);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadBacktrace
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadBacktrace : public CommandObject
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2508ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    class CommandOptions : public Options
2518ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    {
2528ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    public:
2538ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
2548ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        CommandOptions () :
2558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            Options()
2568ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        {
2578ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            // Keep default values of all options in one place: ResetOptionValues ()
2588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            ResetOptionValues ();
2598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        }
2608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
2618ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        virtual
2628ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        ~CommandOptions ()
2638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        {
2648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        }
2658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
2668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        virtual Error
2678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        SetOptionValue (int option_idx, const char *option_arg)
2688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        {
2698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            Error error;
2708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            char short_option = (char) m_getopt_table[option_idx].val;
2718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
2728ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            switch (short_option)
2738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            {
2748ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                case 'c':
2758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                {
2768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    bool success;
2778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    int32_t input_count =  Args::StringToSInt32 (option_arg, -1, 0, &success);
2788ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    if (!success)
2798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                        error.SetErrorStringWithFormat("Invalid integer value for option '%c'.\n", short_option);
2808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    if (input_count < -1)
2818ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                        m_count = UINT32_MAX;
2828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    else
2838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                        m_count = input_count;
2848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                }
2858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                break;
2868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                case 's':
2878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                {
2888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    bool success;
2898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    m_start =  Args::StringToUInt32 (option_arg, 0, 0, &success);
2908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    if (!success)
2918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                        error.SetErrorStringWithFormat("Invalid integer value for option '%c'.\n", short_option);
2928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                }
2938ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                break;
2948ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                default:
2958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
2968ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    break;
2978ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
2988ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            }
2998ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            return error;
3008ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        }
3018ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
3028ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        void
3038ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        ResetOptionValues ()
3048ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        {
3058ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            Options::ResetOptionValues();
3068ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            m_count = -1;
3078ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            m_start = 0;
3088ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        }
3098ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
3108ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        const lldb::OptionDefinition*
3118ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        GetDefinitions ()
3128ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        {
3138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham            return g_option_table;
3148ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        }
3158ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
3168ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        // Options table: Required for subclasses of Options.
3178ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
3188ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        static lldb::OptionDefinition g_option_table[];
3198ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
3208ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        // Instance variables to hold the values for command options.
3218ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        uint32_t m_count;
3228ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        uint32_t m_start;
3238ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    };
3248ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectThreadBacktrace () :
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("thread backtrace",
327eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                       "Shows the stack for one or more threads.  If no threads are specified, shows the currently selected thread.  \nUse the thread-index \"all\" to see all threads.",
328eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                       "thread backtrace [<thread-index>] ...",
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
3308ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        m_options()
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectThreadBacktrace()
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3388ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    virtual Options *
3398ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    GetOptions ()
3408ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    {
3418ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham        return &m_options;
3428ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    }
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34463094e0bb161580564954dee512955c1c79d3476Greg Clayton    virtual bool
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Execute
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    (
34763094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Args& command,
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandReturnObject &result
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    )
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
352eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
353eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        bool show_frame_info = true;
354eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        uint32_t num_frames_with_source = 0; // Don't show any frames with source when backtracing
355eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
356eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        result.SetStatus (eReturnStatusSuccessFinishResult);
357eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (command.GetArgumentCount() == 0)
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36063094e0bb161580564954dee512955c1c79d3476Greg Clayton            ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx.thread)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (DisplayFramesForExecutionContext (exe_ctx.thread,
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      interpreter,
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      result.GetOutputStream(),
3668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                                      m_options.m_start,
3678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                                                      m_options.m_count,
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      show_frame_info,
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      num_frames_with_source,
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      3,
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                      3))
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishResult);
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("invalid thread");
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
382eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        else if (command.GetArgumentCount() == 1 && ::strcmp (command.GetArgumentAtIndex(0), "all") == 0)
383eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        {
384eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            Process *process = interpreter.GetDebugger().GetExecutionContext().process;
385eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            uint32_t num_threads = process->GetThreadList().GetSize();
386eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            for (uint32_t i = 0; i < num_threads; i++)
387eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            {
388eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                ThreadSP thread_sp = process->GetThreadList().GetThreadAtIndex(i);
389eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (!DisplayFramesForExecutionContext (thread_sp.get(),
390eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      interpreter,
391eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      result.GetOutputStream(),
392eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      m_options.m_start,
393eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      m_options.m_count,
394eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      show_frame_info,
395eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      num_frames_with_source,
396eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      3,
397eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      3))
398eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                {
399eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%d\"\n", i);
400eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.SetStatus (eReturnStatusFailed);
401eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    return false;
402eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                }
403eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (i < num_threads - 1)
404eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendMessage("");
405eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            }
406eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham        }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
409eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            uint32_t num_args = command.GetArgumentCount();
410eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            Process *process = interpreter.GetDebugger().GetExecutionContext().process;
411eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            std::vector<ThreadSP> thread_sps;
412eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
413eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            for (uint32_t i = 0; i < num_args; i++)
414eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            {
415eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                bool success;
416eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
417eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                uint32_t thread_idx = Args::StringToUInt32(command.GetArgumentAtIndex(i), 0, 0, &success);
418eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (!success)
419eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                {
420eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendErrorWithFormat ("invalid thread specification: \"%s\"\n", command.GetArgumentAtIndex(i));
421eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.SetStatus (eReturnStatusFailed);
422eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    return false;
423eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                }
424eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
425eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                thread_sps.push_back(process->GetThreadList().FindThreadByIndexID(thread_idx));
426eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
427eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (!thread_sps[i])
428eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                {
429eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendErrorWithFormat ("no thread with index: \"%s\"\n", command.GetArgumentAtIndex(i));
430eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.SetStatus (eReturnStatusFailed);
431eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    return false;
432eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                }
433eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
434eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            }
435eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
436eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            for (uint32_t i = 0; i < num_args; i++)
437eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            {
438eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (!DisplayFramesForExecutionContext (thread_sps[i].get(),
439eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      interpreter,
440eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      result.GetOutputStream(),
441eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      m_options.m_start,
442eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      m_options.m_count,
443eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      show_frame_info,
444eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      num_frames_with_source,
445eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      3,
446eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                                                      3))
447eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                {
448eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%s\"\n", command.GetArgumentAtIndex(i));
449eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.SetStatus (eReturnStatusFailed);
450eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    return false;
451eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                }
452eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham
453eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                if (i < num_args - 1)
454eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham                    result.AppendMessage("");
455eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham            }
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
4608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham    CommandOptions m_options;
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Inghamlldb::OptionDefinition
4648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim InghamCommandObjectThreadBacktrace::CommandOptions::g_option_table[] =
4658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{
4668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL,               0, "<count>", "How many frames to display (-1 for all)"},
4678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ LLDB_OPT_SET_1, false, "start",       's', required_argument, NULL, 0, "<start>",       "Where to start the backtrace"},
4688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
4698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham};
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
471c0418155302e97d37571dfa41a38f6b33759a5e0Greg Claytonenum StepScope
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    eStepScopeSource,
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    eStepScopeInstruction
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadStepWithTypeAndScope : public CommandObject
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandOptions () :
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options()
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Keep default values of all options in one place: ResetOptionValues ()
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ResetOptionValues ();
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetOptionValue (int option_idx, const char *option_arg)
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char short_option = (char) m_getopt_table[option_idx].val;
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case 'a':
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    bool success;
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_avoid_no_debug =  Args::StringToBoolean (option_arg, true, &success);
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!success)
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorStringWithFormat("Invalid boolean value for option '%c'.\n", short_option);
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case 'm':
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    bool found_one = false;
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values;
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, &found_one);
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!found_one)
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorStringWithFormat("Invalid enumeration value for option '%c'.\n", short_option);
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
522809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                case 'r':
523809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                {
524809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                    m_avoid_regexp.clear();
525809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                    m_avoid_regexp.assign(option_arg);
526809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                }
527809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                break;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ResetOptionValues ()
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options::ResetOptionValues();
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_avoid_no_debug = true;
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_run_mode = eOnlyDuringStepping;
542809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham            m_avoid_regexp.clear();
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::OptionDefinition*
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static lldb::OptionDefinition g_option_table[];
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool m_avoid_no_debug;
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RunMode m_run_mode;
558809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham        std::string m_avoid_regexp;
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectThreadStepWithTypeAndScope (const char *name,
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         const char *help,
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         const char *syntax,
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         uint32_t flags,
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         StepType step_type,
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         StepScope step_scope) :
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject (name, help, syntax, flags),
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_step_type (step_type),
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_step_scope (step_scope),
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_options ()
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectThreadStepWithTypeAndScope ()
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
58763094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute
58863094e0bb161580564954dee512955c1c79d3476Greg Clayton    (
58963094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
59063094e0bb161580564954dee512955c1c79d3476Greg Clayton        Args& command,
59163094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandReturnObject &result
59263094e0bb161580564954dee512955c1c79d3476Greg Clayton    )
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
59463094e0bb161580564954dee512955c1c79d3476Greg Clayton        Process *process = interpreter.GetDebugger().GetExecutionContext().process;
59563094e0bb161580564954dee512955c1c79d3476Greg Clayton        bool synchronous_execution = interpreter.GetSynchronous();
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process == NULL)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("need a valid process to step");
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint32_t num_threads = process->GetThreadList().GetSize();
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Thread *thread = NULL;
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (command.GetArgumentCount() == 0)
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
610c833295baeec641086f536e78050388af36784f8Jim Ingham                thread = process->GetThreadList().GetSelectedThread().get();
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (thread == NULL)
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham                    result.AppendError ("no selected thread in process");
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *thread_idx_cstr = command.GetArgumentAtIndex(0);
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t step_thread_idx = Args::StringToUInt32 (thread_idx_cstr, LLDB_INVALID_INDEX32);
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (step_thread_idx == LLDB_INVALID_INDEX32)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat ("Invalid thread index '%s'.\n", thread_idx_cstr);
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                thread = process->GetThreadList().FindThreadByIndexID(step_thread_idx).get();
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (thread == NULL)
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n",
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  step_thread_idx, 0, num_threads);
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const bool abort_other_plans = false;
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const lldb::RunMode stop_other_threads = m_options.m_run_mode;
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // This is a bit unfortunate, but not all the commands in this command object support
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // only while stepping, so I use the bool for them.
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool bool_stop_other_threads;
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_options.m_run_mode == eAllThreads)
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool_stop_other_threads = false;
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool_stop_other_threads = true;
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_step_type == eStepTypeInto)
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ThreadPlan *new_plan;
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (frame->HasDebugInformation ())
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans, m_step_type,
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    frame->GetSymbolContext(eSymbolContextEverything).line_entry.range,
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    frame->GetSymbolContext(eSymbolContextEverything),
6598f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                                                    stop_other_threads,
6608f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                                                    m_options.m_avoid_no_debug);
661809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                    if (new_plan && !m_options.m_avoid_regexp.empty())
662809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                    {
663809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                        ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan);
664809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                        step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str());
665809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham                    }
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads);
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
670c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process->Resume ();
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (m_step_type == eStepTypeOver)
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StackFrame *frame = thread->GetStackFrameAtIndex(0).get();
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ThreadPlan *new_plan;
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (frame->HasDebugInformation())
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans,
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    m_step_type,
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    frame->GetSymbolContext(eSymbolContextEverything).line_entry.range,
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    frame->GetSymbolContext(eSymbolContextEverything),
6838f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                                                    stop_other_threads,
6848f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                                                    false);
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    new_plan = thread->QueueThreadPlanForStepSingleInstruction (true,
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                abort_other_plans,
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                bool_stop_other_threads);
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // FIXME: This will keep the step plan on the thread stack when we hit a breakpoint while stepping over.
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Maybe there should be a parameter to control this.
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_plan->SetOkayToDiscard(false);
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
694c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process->Resume ();
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (m_step_type == eStepTypeTrace)
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads);
700c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process->Resume ();
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (m_step_type == eStepTypeTraceOver)
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads);
706c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process->Resume ();
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (m_step_type == eStepTypeOut)
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ThreadPlan *new_plan;
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, bool_stop_other_threads, eVoteYes, eVoteNoOpinion);
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // FIXME: This will keep the step plan on the thread stack when we hit a breakpoint while stepping over.
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Maybe there should be a parameter to control this.
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_plan->SetOkayToDiscard(false);
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
718c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process->Resume ();
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("step type is not supported");
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (synchronous_execution)
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StateType state = process->WaitForProcessToStop (NULL);
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //EventSP event_sp;
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //StateType state = process->WaitForStateChangedEvents (NULL, event_sp);
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //while (! StateIsStoppedState (state))
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //  {
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //    state = process->WaitForStateChangedEvents (NULL, event_sp);
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //  }
736c833295baeec641086f536e78050388af36784f8Jim Ingham                process->GetThreadList().SetSelectedThreadByID (thread->GetID());
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetDidChangeProcessState (true);
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state));
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusSuccessFinishNoResult);
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepType m_step_type;
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepScope m_step_scope;
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::OptionEnumValueElement
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_tri_running_mode[] =
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyThisThread,     "thisThread",    "Run only this thread"},
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eAllThreads,         "allThreads",    "Run all threads"},
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyDuringStepping, "whileStepping", "Run only this thread while stepping"},
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL }
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::OptionEnumValueElement
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_duo_running_mode[] =
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyThisThread,     "thisThread",    "Run only this thread"},
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eAllThreads,         "allThreads",    "Run all threads"},
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL }
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] =
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
77112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "avoid_no_debug", 'a', required_argument, NULL,               0, "<avoid_no_debug>", "Should step-in step over functions with no debug information"},
77212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "run_mode",       'm', required_argument, g_tri_running_mode, 0, "<run_mode>",       "Determine how to run other threads while stepping this one"},
773809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham{ LLDB_OPT_SET_1, false, "regexp_to_avoid",'r', required_argument, NULL, 0, "<avoid_regexp>",       "Should step-in step over functions matching this regexp"},
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadContinue
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadContinue : public CommandObject
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectThreadContinue () :
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("thread continue",
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Continues execution of one or more threads in an active process.",
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "thread continue <thread-index> [<thread-index> ...]",
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectThreadContinue ()
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
80163094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute
80263094e0bb161580564954dee512955c1c79d3476Greg Clayton    (
80363094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
80463094e0bb161580564954dee512955c1c79d3476Greg Clayton        Args& command,
80563094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandReturnObject &result
80663094e0bb161580564954dee512955c1c79d3476Greg Clayton    )
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
80863094e0bb161580564954dee512955c1c79d3476Greg Clayton        bool synchronous_execution = interpreter.GetSynchronous ();
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
810c833295baeec641086f536e78050388af36784f8Jim Ingham        if (!interpreter.GetDebugger().GetSelectedTarget().get())
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target, set executable file using 'file' command");
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81763094e0bb161580564954dee512955c1c79d3476Greg Clayton        Process *process = interpreter.GetDebugger().GetExecutionContext().process;
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process == NULL)
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("no process exists. Cannot continue");
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StateType state = process->GetState();
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if ((state == eStateCrashed) || (state == eStateStopped) || (state == eStateSuspended))
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint32_t num_threads = process->GetThreadList().GetSize();
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t idx;
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const size_t argc = command.GetArgumentCount();
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (argc > 0)
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::vector<uint32_t> resume_thread_indexes;
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t i=0; i<argc; ++i)
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    idx = Args::StringToUInt32 (command.GetArgumentAtIndex(0), LLDB_INVALID_INDEX32);
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx < num_threads)
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        resume_thread_indexes.push_back(idx);
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendWarningWithFormat("Thread index %u out of range.\n", idx);
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (resume_thread_indexes.empty())
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendError ("no valid thread indexes were specified");
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendMessage ("Resuming thread ");
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (idx=0; idx<num_threads; ++idx)
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get();
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (find(resume_thread_indexes.begin(), resume_thread_indexes.end(), idx) != resume_thread_indexes.end())
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            result.AppendMessageWithFormat ("%u ", idx);
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            thread->SetResumeState (eStateRunning);
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            thread->SetResumeState (eStateSuspended);
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendMessageWithFormat ("in process %i\n", process->GetID());
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
870c833295baeec641086f536e78050388af36784f8Jim Ingham                Thread *current_thread = process->GetThreadList().GetSelectedThread().get();
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (current_thread == NULL)
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendError ("the process doesn't have a current thread");
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Set the actions that the threads should each take when resuming
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (idx=0; idx<num_threads; ++idx)
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get();
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (thread == current_thread)
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendMessageWithFormat ("Resuming thread 0x%4.4x in process %i\n", thread->GetID(), process->GetID());
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        thread->SetResumeState (eStateRunning);
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        thread->SetResumeState (eStateSuspended);
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error (process->Resume());
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error.Success())
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendMessageWithFormat ("Resuming process %i\n", process->GetID());
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (synchronous_execution)
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
899bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                    state = process->WaitForProcessToStop (NULL);
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetDidChangeProcessState (true);
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state));
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishNoResult);
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessContinuingNoResult);
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat("Failed to resume process: %s\n", error.AsCString());
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat ("Process cannot be continued from its current state (%s).\n",
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                          StateAsCString(state));
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadUntil
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadUntil : public CommandObject
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class CommandOptions : public Options
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t m_thread_idx;
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t m_frame_idx;
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandOptions () :
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options(),
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_thread_idx(LLDB_INVALID_THREAD_ID),
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_frame_idx(LLDB_INVALID_FRAME_ID)
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Keep default values of all options in one place: ResetOptionValues ()
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ResetOptionValues ();
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~CommandOptions ()
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual Error
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetOptionValue (int option_idx, const char *option_arg)
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char short_option = (char) m_getopt_table[option_idx].val;
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (short_option)
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case 't':
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
966bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                    m_thread_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_INDEX32);
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (m_thread_idx == LLDB_INVALID_INDEX32)
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorStringWithFormat ("Invalid thread index '%s'.\n", option_arg);
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case 'f':
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_frame_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_FRAME_ID);
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (m_frame_idx == LLDB_INVALID_FRAME_ID)
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorStringWithFormat ("Invalid frame index '%s'.\n", option_arg);
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case 'm':
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    bool found_one = false;
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values;
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::RunMode run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, &found_one);
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!found_one)
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorStringWithFormat("Invalid enumeration value for option '%c'.\n", short_option);
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (run_mode == eAllThreads)
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_stop_others = false;
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_stop_others = true;
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ResetOptionValues ()
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Options::ResetOptionValues();
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_thread_idx = LLDB_INVALID_THREAD_ID;
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_frame_idx = 0;
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stop_others = false;
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::OptionDefinition*
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetDefinitions ()
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return g_option_table;
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t m_step_thread_idx;
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool m_stop_others;
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Options table: Required for subclasses of Options.
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static lldb::OptionDefinition g_option_table[];
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Instance variables to hold the values for command options.
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectThreadUntil () :
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("thread until",
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Runs the current or specified thread until it reaches a given line number or leaves the current function.",
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "thread until [<cmd-options>] <line-number>",
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_options ()
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectThreadUntil ()
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ()
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &m_options;
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
105363094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute
105463094e0bb161580564954dee512955c1c79d3476Greg Clayton    (
105563094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
105663094e0bb161580564954dee512955c1c79d3476Greg Clayton        Args& command,
105763094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandReturnObject &result
105863094e0bb161580564954dee512955c1c79d3476Greg Clayton    )
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
106063094e0bb161580564954dee512955c1c79d3476Greg Clayton        bool synchronous_execution = interpreter.GetSynchronous ();
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1062c833295baeec641086f536e78050388af36784f8Jim Ingham        if (!interpreter.GetDebugger().GetSelectedTarget().get())
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("invalid target, set executable file using 'file' command");
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106963094e0bb161580564954dee512955c1c79d3476Greg Clayton        Process *process = interpreter.GetDebugger().GetExecutionContext().process;
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process == NULL)
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("need a valid process to step");
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Thread *thread = NULL;
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t line_number;
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (command.GetArgumentCount() != 1)
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax());
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            line_number = Args::StringToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX);
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (line_number == UINT32_MAX)
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat ("Invalid line number: '%s'.\n", command.GetArgumentAtIndex(0));
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID)
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1098c833295baeec641086f536e78050388af36784f8Jim Ingham                thread = process->GetThreadList().GetSelectedThread().get();
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                thread = process->GetThreadList().GetThreadAtIndex(m_options.m_thread_idx).get();
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (thread == NULL)
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint32_t num_threads = process->GetThreadList().GetSize();
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", m_options.m_thread_idx, 0, num_threads);
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const bool abort_other_plans = true;
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StackFrame *frame = thread->GetStackFrameAtIndex(m_options.m_frame_idx).get();
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (frame == NULL)
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat ("Frame index %u is out of range for thread %u.\n", m_options.m_frame_idx, m_options.m_thread_idx);
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ThreadPlan *new_plan;
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (frame->HasDebugInformation ())
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Finally we got here...  Translate the given line number to a bunch of addresses:
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolContext sc(frame->GetSymbolContext (eSymbolContextCompUnit));
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LineTable *line_table = NULL;
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (sc.comp_unit)
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    line_table = sc.comp_unit->GetLineTable();
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (line_table == NULL)
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendErrorWithFormat ("Failed to resolve the line table for frame %u of thread index %u.\n",
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 m_options.m_frame_idx, m_options.m_thread_idx);
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusFailed);
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return false;
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LineEntry function_start;
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t index_ptr = 0, end_ptr;
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::vector<addr_t> address_list;
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Find the beginning & end index of the
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                AddressRange fun_addr_range = sc.function->GetAddressRange();
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Address fun_start_addr = fun_addr_range.GetBaseAddress();
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                line_table->FindLineEntryByAddress (fun_start_addr, function_start, &index_ptr);
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Address fun_end_addr(fun_start_addr.GetSection(), fun_start_addr.GetOffset() + fun_addr_range.GetByteSize());
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr);
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (index_ptr <= end_ptr)
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    LineEntry line_entry;
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, &line_entry);
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (index_ptr == UINT32_MAX)
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(process);
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (address != LLDB_INVALID_ADDRESS)
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        address_list.push_back (address);
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    index_ptr++;
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116753d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                new_plan = thread->QueueThreadPlanForStepUntil (abort_other_plans, &address_list.front(), address_list.size(), m_options.m_stop_others);
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_plan->SetOkayToDiscard(false);
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat ("Frame index %u of thread %u has no debug information.\n", m_options.m_frame_idx, m_options.m_thread_idx);
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1178c833295baeec641086f536e78050388af36784f8Jim Ingham            process->GetThreadList().SetSelectedThreadByID (m_options.m_thread_idx);
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error (process->Resume ());
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error.Success())
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendMessageWithFormat ("Resuming process %i\n", process->GetID());
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (synchronous_execution)
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    StateType state = process->WaitForProcessToStop (NULL);
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetDidChangeProcessState (true);
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state));
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessFinishNoResult);
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    result.SetStatus (eReturnStatusSuccessContinuingNoResult);
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendErrorWithFormat("Failed to resume process: %s.\n", error.AsCString());
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandOptions m_options;
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadUntil::CommandOptions::g_option_table[] =
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
121312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "frame",   'f', required_argument, NULL,               0, "<frame>",   "Frame index for until operation - defaults to 0"},
121412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "thread",  't', required_argument, NULL,               0, "<thread>",  "Thread index for the thread for until operation"},
121512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "run_mode",'m', required_argument, g_duo_running_mode, 0, "<run_mode>","Determine how to run other threads while stepping this one"},
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadSelect
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadSelect : public CommandObject
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectThreadSelect () :
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject ("thread select",
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         "Selects a threads as the currently active thread.",
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         "thread select <thread-index>",
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~CommandObjectThreadSelect ()
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
124363094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute
124463094e0bb161580564954dee512955c1c79d3476Greg Clayton    (
124563094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
124663094e0bb161580564954dee512955c1c79d3476Greg Clayton        Args& command,
124763094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandReturnObject &result
124863094e0bb161580564954dee512955c1c79d3476Greg Clayton    )
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
125063094e0bb161580564954dee512955c1c79d3476Greg Clayton        Process *process = interpreter.GetDebugger().GetExecutionContext().process;
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process == NULL)
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("no process");
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (command.GetArgumentCount() != 1)
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat("'%s' takes exactly one thread index argument:\nUsage: \n", m_cmd_name.c_str(), m_cmd_syntax.c_str());
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t index_id = Args::StringToUInt32(command.GetArgumentAtIndex(0), 0, 0);
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Thread *new_thread = process->GetThreadList().FindThreadByIndexID(index_id).get();
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (new_thread == NULL)
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendErrorWithFormat ("Invalid thread #%s.\n", command.GetArgumentAtIndex(0));
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1274c833295baeec641086f536e78050388af36784f8Jim Ingham        process->GetThreadList().SetSelectedThreadByID(new_thread->GetID());
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisplayThreadInfo (interpreter,
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           result.GetOutputStream(),
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           new_thread,
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           false,
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           true);
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.Succeeded();
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadList
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129263094e0bb161580564954dee512955c1c79d3476Greg Claytonclass CommandObjectThreadList : public CommandObject
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
129463094e0bb161580564954dee512955c1c79d3476Greg Claytonpublic:
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129763094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandObjectThreadList ():
129863094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandObject ("thread list",
129963094e0bb161580564954dee512955c1c79d3476Greg Clayton                       "Shows a summary of all current threads in a process.",
130063094e0bb161580564954dee512955c1c79d3476Greg Clayton                       "thread list",
130163094e0bb161580564954dee512955c1c79d3476Greg Clayton                       eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
130263094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
130363094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
130463094e0bb161580564954dee512955c1c79d3476Greg Clayton
130563094e0bb161580564954dee512955c1c79d3476Greg Clayton    ~CommandObjectThreadList()
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
130763094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130963094e0bb161580564954dee512955c1c79d3476Greg Clayton    bool
131063094e0bb161580564954dee512955c1c79d3476Greg Clayton    Execute
131163094e0bb161580564954dee512955c1c79d3476Greg Clayton    (
131263094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandInterpreter &interpreter,
131363094e0bb161580564954dee512955c1c79d3476Greg Clayton        Args& command,
131463094e0bb161580564954dee512955c1c79d3476Greg Clayton        CommandReturnObject &result
131563094e0bb161580564954dee512955c1c79d3476Greg Clayton    )
131663094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
131763094e0bb161580564954dee512955c1c79d3476Greg Clayton        StreamString &strm = result.GetOutputStream();
131863094e0bb161580564954dee512955c1c79d3476Greg Clayton        result.SetStatus (eReturnStatusSuccessFinishNoResult);
131963094e0bb161580564954dee512955c1c79d3476Greg Clayton        ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
132063094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (exe_ctx.process)
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
132263094e0bb161580564954dee512955c1c79d3476Greg Clayton            const StateType state = exe_ctx.process->GetState();
132363094e0bb161580564954dee512955c1c79d3476Greg Clayton
132463094e0bb161580564954dee512955c1c79d3476Greg Clayton            if (StateIsStoppedState(state))
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
132663094e0bb161580564954dee512955c1c79d3476Greg Clayton                if (state == eStateExited)
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
132863094e0bb161580564954dee512955c1c79d3476Greg Clayton                    int exit_status = exe_ctx.process->GetExitStatus();
132963094e0bb161580564954dee512955c1c79d3476Greg Clayton                    const char *exit_description = exe_ctx.process->GetExitDescription();
133063094e0bb161580564954dee512955c1c79d3476Greg Clayton                    strm.Printf ("Process %d exited with status = %i (0x%8.8x) %s\n",
133163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                          exe_ctx.process->GetID(),
133263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                          exit_status,
133363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                          exit_status,
133463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                          exit_description ? exit_description : "");
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
133863094e0bb161580564954dee512955c1c79d3476Greg Clayton                    strm.Printf ("Process %d state is %s\n", exe_ctx.process->GetID(), StateAsCString (state));
133963094e0bb161580564954dee512955c1c79d3476Greg Clayton                    if (exe_ctx.thread == NULL)
134063094e0bb161580564954dee512955c1c79d3476Greg Clayton                        exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
134163094e0bb161580564954dee512955c1c79d3476Greg Clayton                    if (exe_ctx.thread != NULL)
134263094e0bb161580564954dee512955c1c79d3476Greg Clayton                    {
134363094e0bb161580564954dee512955c1c79d3476Greg Clayton                        DisplayThreadsInfo (interpreter, &exe_ctx, result, false, false);
134463094e0bb161580564954dee512955c1c79d3476Greg Clayton                    }
134563094e0bb161580564954dee512955c1c79d3476Greg Clayton                    else
134663094e0bb161580564954dee512955c1c79d3476Greg Clayton                    {
134763094e0bb161580564954dee512955c1c79d3476Greg Clayton                        result.AppendError ("no valid thread found in current process");
134863094e0bb161580564954dee512955c1c79d3476Greg Clayton                        result.SetStatus (eReturnStatusFailed);
134963094e0bb161580564954dee512955c1c79d3476Greg Clayton                    }
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
135263094e0bb161580564954dee512955c1c79d3476Greg Clayton            else
135363094e0bb161580564954dee512955c1c79d3476Greg Clayton            {
135463094e0bb161580564954dee512955c1c79d3476Greg Clayton                result.AppendError ("process is currently running");
135563094e0bb161580564954dee512955c1c79d3476Greg Clayton                result.SetStatus (eReturnStatusFailed);
135663094e0bb161580564954dee512955c1c79d3476Greg Clayton            }
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
136063094e0bb161580564954dee512955c1c79d3476Greg Clayton            result.AppendError ("no current location or status available");
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
136363094e0bb161580564954dee512955c1c79d3476Greg Clayton        return result.Succeeded();
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
136563094e0bb161580564954dee512955c1c79d3476Greg Clayton};
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordThread
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137163094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) :
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectMultiword ("thread",
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "A set of commands for operating on one or more thread within a running process.",
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            "thread <subcommand> [<subcommand-options>]")
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
137663094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "backtrace",  CommandObjectSP (new CommandObjectThreadBacktrace ()));
137763094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "continue",   CommandObjectSP (new CommandObjectThreadContinue ()));
137863094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "list",       CommandObjectSP (new CommandObjectThreadList ()));
137963094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "select",     CommandObjectSP (new CommandObjectThreadSelect ()));
138063094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "until",      CommandObjectSP (new CommandObjectThreadUntil ()));
138163094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "step-in",    CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope (
138263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                    "thread step-in",
138363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                     "Source level single step in in specified thread (current thread, if none specified).",
138463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                     "thread step-in [<thread-id>]",
138563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                     eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
138663094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                     eStepTypeInto,
138763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                     eStepScopeSource)));
138863094e0bb161580564954dee512955c1c79d3476Greg Clayton
138963094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "step-out",    CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-out",
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "Source level single step out in specified thread (current thread, if none specified).",
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "thread step-out [<thread-id>]",
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eStepTypeOut,
139463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                                      eStepScopeSource)));
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139663094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "step-over",   CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-over",
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "Source level single step over in specified thread (current thread, if none specified).",
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "thread step-over [<thread-id>]",
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eStepTypeOver,
140163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                                      eStepScopeSource)));
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140363094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "step-inst",   CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-inst",
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "Single step one instruction in specified thread (current thread, if none specified).",
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "thread step-inst [<thread-id>]",
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eStepTypeTrace,
140863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                                      eStepScopeInstruction)));
140963094e0bb161580564954dee512955c1c79d3476Greg Clayton
141063094e0bb161580564954dee512955c1c79d3476Greg Clayton    LoadSubCommand (interpreter, "step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-inst-over",
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.",
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      "thread step-inst-over [<thread-id>]",
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eFlagProcessMustBeLaunched | eFlagProcessMustBePaused,
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      eStepTypeTraceOver,
141563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                                      eStepScopeInstruction)));
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordThread::~CommandObjectMultiwordThread ()
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1423