Process.cpp revision d21d98b3cd51d9109631ad1605ee7f7dbac3cfbb
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Process.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 "lldb/Target/Process.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h"
17861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
23f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Expression/ClangUserExpression.h"
246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h"
270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h"
2837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "lldb/Target/OperatingSystem.h"
29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h"
30642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h"
31642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
39d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham#include "lldb/Target/ThreadPlanBase.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid
45b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
4624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
4724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *cstr;
48ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (m_pid != LLDB_INVALID_PROCESS_ID)
49d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton        s.Printf ("    pid = %llu\n", m_pid);
50ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
51ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
52d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton        s.Printf (" parent = %llu\n", m_parent_pid);
53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (m_executable)
55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.Printf ("   name = %s\n", m_executable.GetFilename().GetCString());
57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.PutCString ("   file = ");
58ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        m_executable.Dump(&s);
59ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.EOL();
60ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
61b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const uint32_t argc = m_arguments.GetArgumentCount();
62ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (argc > 0)
63ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
64ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        for (uint32_t i=0; i<argc; i++)
65ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
66b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            const char *arg = m_arguments.GetArgumentAtIndex(i);
67ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (i < 10)
68b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf (" arg[%u] = %s\n", i, arg);
69ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("arg[%u] = %s\n", i, arg);
71ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
72ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const uint32_t envc = m_environment.GetArgumentCount();
75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (envc > 0)
76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        for (uint32_t i=0; i<envc; i++)
78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            const char *env = m_environment.GetArgumentAtIndex(i);
80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (i < 10)
81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf (" env[%u] = %s\n", i, env);
82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("env[%u] = %s\n", i, env);
84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
86b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
87ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (m_arch.IsValid())
88ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.Printf ("   arch = %s\n", m_arch.GetTriple().str().c_str());
89ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
90b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_uid != UINT32_MAX)
9124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        cstr = platform->GetUserName (m_uid);
93b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf ("    uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
9424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
95b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_gid != UINT32_MAX)
9624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
97b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        cstr = platform->GetGroupName (m_gid);
98b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf ("    gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
100b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_euid != UINT32_MAX)
10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
102b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        cstr = platform->GetUserName (m_euid);
103b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf ("   euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
105b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_egid != UINT32_MAX)
10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        cstr = platform->GetGroupName (m_egid);
108b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf ("   egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid
113b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
11424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
115b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *label;
116b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (show_args || verbose)
117b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        label = "ARGUMENTS";
118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
119b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        label = "NAME";
120b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
121ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    if (verbose)
122ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
123b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf     ("PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                   %s\n", label);
124ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
125ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
126ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    else
127ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    {
128b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        s.Printf     ("PID    PARENT USER       ARCH    %s\n", label);
129ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.PutCString ("====== ====== ========== ======= ============================\n");
130ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton    }
13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
13224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
13324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid
134b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_pid != LLDB_INVALID_PROCESS_ID)
13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *cstr;
139d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton        s.Printf ("%-6llu %-6llu ", m_pid, m_parent_pid);
14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
14124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
142ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        if (verbose)
143ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
144b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            cstr = platform->GetUserName (m_uid);
145ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
146ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                s.Printf ("%-10s ", cstr);
147ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
148b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("%-10u ", m_uid);
14924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
150b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            cstr = platform->GetGroupName (m_gid);
151ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
152ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                s.Printf ("%-10s ", cstr);
153ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
154b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("%-10u ", m_gid);
155ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
156b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            cstr = platform->GetUserName (m_euid);
157ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
158ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                s.Printf ("%-10s ", cstr);
159ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
160b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("%-10u ", m_euid);
161ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
162b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            cstr = platform->GetGroupName (m_egid);
163ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
164ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                s.Printf ("%-10s ", cstr);
165ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            else
166b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                s.Printf ("%-10u ", m_egid);
167ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : "");
168ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
16924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        else
170ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
1717e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s.Printf ("%-10s %-7d %s ",
172b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      platform->GetUserName (m_euid),
173ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                      (int)m_arch.GetTriple().getArchName().size(),
174ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                      m_arch.GetTriple().getArchName().data());
175ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
176ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton
177b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (verbose || show_args)
178ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
179b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            const uint32_t argc = m_arguments.GetArgumentCount();
180ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            if (argc > 0)
181ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            {
182ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                for (uint32_t i=0; i<argc; i++)
183ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                {
184ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                    if (i > 0)
185ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                        s.PutChar (' ');
186b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    s.PutCString (m_arguments.GetArgumentAtIndex(i));
187ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton                }
188ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            }
189ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        else
191ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        {
192ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton            s.PutCString (GetName());
193ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        }
19424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
195ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton        s.EOL();
19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
200b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid
20136bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (char const **argv,
20236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                           bool first_arg_is_executable,
20336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                           bool first_arg_is_executable_and_argument)
20436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{
20536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    m_arguments.SetArguments (argv);
20636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton
20736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    // Is the first argument the executable?
20836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    if (first_arg_is_executable)
20936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    {
21036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton        const char *first_arg = m_arguments.GetArgumentAtIndex (0);
21136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton        if (first_arg)
21236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton        {
21336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            // Yes the first argument is an executable, set it as the executable
21436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            // in the launch options. Don't resolve the file path as the path
21536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            // could be a remote platform path
21636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            const bool resolve = false;
21736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            m_executable.SetFile(first_arg, resolve);
21836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton
21936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            // If argument zero is an executable and shouldn't be included
22036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            // in the arguments, remove it from the front of the arguments
22136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            if (first_arg_is_executable_and_argument == false)
22236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                m_arguments.DeleteArgumentAtIndex (0);
22336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton        }
22436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    }
22536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton}
22636bc5ea5a48c19421d44f559e2165c105657b809Greg Claytonvoid
22736bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (const Args& args,
22836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                           bool first_arg_is_executable,
22936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                           bool first_arg_is_executable_and_argument)
230b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
231b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Copy all arguments
232b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_arguments = args;
233b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
234b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Is the first argument the executable?
235b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (first_arg_is_executable)
236b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
23736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton        const char *first_arg = m_arguments.GetArgumentAtIndex (0);
238b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (first_arg)
239b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
240b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            // Yes the first argument is an executable, set it as the executable
241b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            // in the launch options. Don't resolve the file path as the path
242b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            // could be a remote platform path
243b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            const bool resolve = false;
244b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            m_executable.SetFile(first_arg, resolve);
245b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
246b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            // If argument zero is an executable and shouldn't be included
247b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            // in the arguments, remove it from the front of the arguments
248b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (first_arg_is_executable_and_argument == false)
249b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                m_arguments.DeleteArgumentAtIndex (0);
250b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
251b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
252b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
253b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
254abb3302051246273eb92cca203c9a1b9d9736e05Greg Claytonvoid
255464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty)
256abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton{
257abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    // If notthing was specified, then check the process for any default
258abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    // settings that were set with "settings set"
259abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    if (m_file_actions.empty())
260abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    {
261abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        if (m_flags.Test(eLaunchFlagDisableSTDIO))
262abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        {
26395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            AppendSuppressFileAction (STDIN_FILENO , true, false);
26495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            AppendSuppressFileAction (STDOUT_FILENO, false, true);
26595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            AppendSuppressFileAction (STDERR_FILENO, false, true);
266abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        }
267abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        else
268abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        {
269abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            // Check for any values that might have gotten set with any of:
270abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            // (lldb) settings set target.input-path
271abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            // (lldb) settings set target.output-path
272abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            // (lldb) settings set target.error-path
273464c6161464694412b7472129e789248f1cf21b9Greg Clayton            const char *in_path = NULL;
274464c6161464694412b7472129e789248f1cf21b9Greg Clayton            const char *out_path = NULL;
275464c6161464694412b7472129e789248f1cf21b9Greg Clayton            const char *err_path = NULL;
276abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            if (target)
277abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            {
27895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                in_path = target->GetStandardInputPath();
27995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                out_path = target->GetStandardOutputPath();
28095ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                err_path = target->GetStandardErrorPath();
281464c6161464694412b7472129e789248f1cf21b9Greg Clayton            }
282464c6161464694412b7472129e789248f1cf21b9Greg Clayton
283464c6161464694412b7472129e789248f1cf21b9Greg Clayton            if (default_to_use_pty && (!in_path && !out_path && !err_path))
284464c6161464694412b7472129e789248f1cf21b9Greg Clayton            {
285464c6161464694412b7472129e789248f1cf21b9Greg Clayton                if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0))
286abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                {
287464c6161464694412b7472129e789248f1cf21b9Greg Clayton                    in_path = out_path = err_path = m_pty.GetSlaveName (NULL, 0);
288abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton                }
289abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton            }
290abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton
291464c6161464694412b7472129e789248f1cf21b9Greg Clayton            if (in_path)
29295ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                AppendOpenFileAction(STDIN_FILENO, in_path, true, false);
29395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton
294464c6161464694412b7472129e789248f1cf21b9Greg Clayton            if (out_path)
29595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                AppendOpenFileAction(STDOUT_FILENO, out_path, false, true);
296464c6161464694412b7472129e789248f1cf21b9Greg Clayton
297464c6161464694412b7472129e789248f1cf21b9Greg Clayton            if (err_path)
29895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                AppendOpenFileAction(STDERR_FILENO, err_path, false, true);
29995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton
300abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton        }
301abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    }
302abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton}
303abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton
304527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
305527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonbool
30697471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, bool localhost)
30797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{
30897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    error.Clear();
30997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
310527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    if (GetFlags().Test (eLaunchFlagLaunchInShell))
311527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    {
312527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        const char *shell_executable = GetShell();
313527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (shell_executable)
314527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        {
315527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            char shell_resolved_path[PATH_MAX];
316527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
317527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            if (localhost)
318527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            {
319527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                FileSpec shell_filespec (shell_executable, true);
320527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
321527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                if (!shell_filespec.Exists())
322527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                {
323527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    // Resolve the path in case we just got "bash", "sh" or "tcsh"
324527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    if (!shell_filespec.ResolveExecutableLocation ())
325527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    {
326527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable);
327527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        return false;
328527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    }
329527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                }
330527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path));
331527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                shell_executable = shell_resolved_path;
332527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            }
333527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
334527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            Args shell_arguments;
335527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            std::string safe_arg;
336527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            shell_arguments.AppendArgument (shell_executable);
337527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            StreamString shell_command;
338527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            shell_arguments.AppendArgument ("-c");
339527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            shell_command.PutCString ("exec");
340527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            if (GetArchitecture().IsValid())
34197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            {
34297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName());
34397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // Set the resume count to 2:
344527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                // 1 - stop in shell
34597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // 2 - stop in /usr/bin/arch
34697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // 3 - then we will stop in our program
34797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                SetResumeCount(2);
34897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            }
34997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            else
35097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            {
35197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // Set the resume count to 1:
35297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // 1 - stop in shell
35397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                // 2 - then we will stop in our program
35497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                SetResumeCount(1);
35597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            }
35697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
35797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const char **argv = GetArguments().GetConstArgumentVector ();
35897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            if (argv)
35997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            {
36097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                for (size_t i=0; argv[i] != NULL; ++i)
36197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                {
362527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg);
363527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    shell_command.Printf(" %s", arg);
364527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                }
365527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            }
366527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            shell_arguments.AppendArgument (shell_command.GetString().c_str());
36797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
368527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_executable.SetFile(shell_executable, false);
36997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            m_arguments = shell_arguments;
37097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            return true;
37197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        }
37297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        else
37397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        {
37497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            error.SetErrorString ("invalid shell path");
37597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        }
37697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    }
37797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    else
37897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    {
37997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton        error.SetErrorString ("not launching in shell");
38097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    }
38197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    return false;
382527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton}
38397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton
384527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
38597471184b8823c949bc68bbf54ea3edf3845a750Greg Claytonbool
38697471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write)
38797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{
38897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    if ((read || write) && fd >= 0 && path && path[0])
38997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton    {
390527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        m_action = eFileActionOpen;
391527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        m_fd = fd;
392527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (read && write)
393527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_arg = O_NOCTTY | O_CREAT | O_RDWR;
394527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        else if (read)
395527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_arg = O_NOCTTY | O_RDONLY;
396527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        else
397527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
398527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        m_path.assign (path);
399527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        return true;
400527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
401527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    else
402527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    {
403527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        Clear();
404527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
405527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    return false;
406527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton}
407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd)
410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Clear();
412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (fd >= 0)
413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_action = eFileActionClose;
415527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        m_fd = fd;
416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
417527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    return m_fd >= 0;
418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
419527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd)
423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Clear();
425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (fd >= 0 && dup_fd >= 0)
426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_action = eFileActionDuplicate;
428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_fd = fd;
429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_arg = dup_fd;
43024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return m_fd >= 0;
432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions,
438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                        const FileAction *info,
439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                        Log *log,
440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                        Error& error)
441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (info == NULL)
443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return false;
444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    switch (info->m_action)
446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case eFileActionNone:
448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            error.Clear();
449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case eFileActionClose:
452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (info->m_fd == -1)
453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)");
454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd),
457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                eErrorTypePOSIX);
458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (log && (error.Fail() || log))
459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)",
460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                   file_actions, info->m_fd);
461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case eFileActionDuplicate:
465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (info->m_fd == -1)
466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)");
467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else if (info->m_arg == -1)
468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg),
472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                eErrorTypePOSIX);
473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (log && (error.Fail() || log))
474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)",
475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                   file_actions, info->m_fd, info->m_arg);
476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case eFileActionOpen:
480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (info->m_fd == -1)
481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)");
482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                int oflag = info->m_arg;
485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                mode_t mode = 0;
487b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
488b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (oflag & O_CREAT)
489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    mode = 0640;
490b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                error.SetError (::posix_spawn_file_actions_addopen (file_actions,
492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                    info->m_fd,
493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                    info->m_path.c_str(),
494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                    oflag,
495b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                                    mode),
496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                eErrorTypePOSIX);
497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (error.Fail() || log)
498b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    error.PutToLog(log,
499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                   "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)",
500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                   file_actions, info->m_fd, info->m_path.c_str(), oflag, mode);
501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        default:
505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action);
506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
507527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error.Success();
509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
510527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
511527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonError
512527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
514b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Error error;
515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    char short_option = (char) m_getopt_table[option_idx].val;
516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    switch (short_option)
518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 's':   // Stop at program entry point
520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
523b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'i':   // STDIN for read only
524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
525b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                ProcessLaunchInfo::FileAction action;
526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (action.Open (STDIN_FILENO, option_arg, true, false))
527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    launch_info.AppendFileAction (action);
528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
530b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'o':   // Open STDOUT for write only
532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                ProcessLaunchInfo::FileAction action;
534143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                if (action.Open (STDOUT_FILENO, option_arg, false, true))
535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    launch_info.AppendFileAction (action);
536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'e':   // STDERR for write only
540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
541b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                ProcessLaunchInfo::FileAction action;
542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (action.Open (STDERR_FILENO, option_arg, false, true))
543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    launch_info.AppendFileAction (action);
544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
54595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            break;
546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
54895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton        case 'p':   // Process plug-in name
549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.SetProcessPluginName (option_arg);
550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'n':   // Disable STDIO
55395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            {
554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                ProcessLaunchInfo::FileAction action;
555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (action.Open (STDIN_FILENO, "/dev/null", true, false))
55695ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                    launch_info.AppendFileAction (action);
557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (action.Open (STDOUT_FILENO, "/dev/null", false, true))
558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    launch_info.AppendFileAction (action);
559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                if (action.Open (STDERR_FILENO, "/dev/null", false, true))
56095ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton                    launch_info.AppendFileAction (action);
56195ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            }
562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
56495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton        case 'w':
565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.SetWorkingDirectory (option_arg);
566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 't':   // Open process in new terminal window
56995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'a':
573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.GetArchitecture().SetTriple (option_arg,
574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     m_interpreter.GetPlatform(true).get());
575b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
57795ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton        case 'A':
578b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.GetFlags().Set (eLaunchFlagDisableASLR);
57995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton            break;
580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
58195ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton        case 'c':
582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (option_arg && option_arg[0])
583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                launch_info.SetShell (option_arg);
584b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            else
585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                launch_info.SetShell ("/bin/bash");
586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
588b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        case 'v':
589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        default:
593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option);
594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break;
595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error;
598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition
601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] =
602b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
60336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument,       NULL, 0, eArgTypeNone,          "Stop at the entry point of the program when launching a process."},
604527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr",  'A', no_argument,       NULL, 0, eArgTypeNone,          "Disable address space layout randomization when launching a process."},
605527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "plugin",        'p', required_argument, NULL, 0, eArgTypePlugin,        "Name of the process plugin you want to use."},
606527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "working-dir",   'w', required_argument, NULL, 0, eArgTypePath,          "Set the current working directory to <path> when running the inferior."},
607527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "arch",          'a', required_argument, NULL, 0, eArgTypeArchitecture,  "Set the architecture for the process to launch when ambiguous."},
60836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ LLDB_OPT_SET_ALL, false, "environment",   'v', required_argument, NULL, 0, eArgTypeNone,          "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."},
60936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ LLDB_OPT_SET_ALL, false, "shell",         'c', optional_argument, NULL, 0, eArgTypePath,          "Run the process in a shell (not supported on all platforms)."},
610b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1  , false, "stdin",         'i', required_argument, NULL, 0, eArgTypePath,    "Redirect stdin for the process to <path>."},
612b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1  , false, "stdout",        'o', required_argument, NULL, 0, eArgTypePath,    "Redirect stdout for the process to <path>."},
613b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1  , false, "stderr",        'e', required_argument, NULL, 0, eArgTypePath,    "Redirect stderr for the process to <path>."},
614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
6159c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton{ LLDB_OPT_SET_2  , false, "tty",           't', no_argument,       NULL, 0, eArgTypeNone,    "Start the process in a terminal (not supported on all platforms)."},
616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_3  , false, "no-stdio",      'n', no_argument,       NULL, 0, eArgTypeNone,    "Do not set up for terminal I/O to go to running process."},
618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0               , false, NULL,             0,  0,                 NULL, 0, eArgTypeNone,    NULL }
620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton};
621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const
626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_name_match_type == eNameMatchIgnore || process_name == NULL)
628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return true;
629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *match_name = m_match_info.GetName();
630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (!match_name)
631527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        return true;
632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
633b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (!NameMatches (proc_info.GetName()))
640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return false;
641b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_match_info.ProcessIDIsValid() &&
643b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_match_info.GetProcessID() != proc_info.GetProcessID())
644b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return false;
645b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
646b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (m_match_info.ParentProcessIDIsValid() &&
647b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
64824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
64924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
65024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.UserIDIsValid () &&
65124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        m_match_info.GetUserID() != proc_info.GetUserID())
65224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
65324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
65424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.GroupIDIsValid () &&
65524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        m_match_info.GetGroupID() != proc_info.GetGroupID())
65624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
65824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.EffectiveUserIDIsValid () &&
659b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
66024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
66124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
66224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.EffectiveGroupIDIsValid () &&
66324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
66424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
66524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
66624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.GetArchitecture().IsValid() &&
66724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        m_match_info.GetArchitecture() != proc_info.GetArchitecture())
66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return true;
67024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
672b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool
673b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const
67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_name_match_type != eNameMatchIgnore)
676b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return false;
677b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.ProcessIDIsValid())
67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
68024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
68124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.ParentProcessIDIsValid())
68224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
68324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
68424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.UserIDIsValid ())
68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
68624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
68724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.GroupIDIsValid ())
68824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
68924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
69024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.EffectiveUserIDIsValid ())
69124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
69224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
69324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.EffectiveGroupIDIsValid ())
69424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
695b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
69624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_info.GetArchitecture().IsValid())
69724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
69824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
69924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_match_all_users)
70024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return false;
70124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
70224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return true;
70324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
70424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
70524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid
70724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcessInstanceInfoMatch::Clear()
70824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_match_info.Clear();
71024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_name_match_type = eNameMatchIgnore;
71124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_match_all_users = false;
71224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
71324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
71424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcessSP
71524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path)
71624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
71724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    ProcessSP process_sp;
71824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    ProcessCreateInstance create_callback = NULL;
71924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (plugin_name)
72024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
72124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        create_callback  = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name);
72224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (create_callback)
72324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
72424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            process_sp = create_callback(target, listener, crash_file_path);
72524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (process_sp)
72624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
72724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                if (!process_sp->CanDebug(target, true))
72824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    process_sp.reset();
729b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
73024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
73124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
73224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    else
73324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
73424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
735fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        {
73646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            process_sp = create_callback(target, listener, crash_file_path);
73746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (process_sp)
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
73946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                if (!process_sp->CanDebug(target, false))
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    process_sp.reset();
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return process_sp;
74746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
74846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
74946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonConstString &
75046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::GetStaticBroadcasterClass ()
75146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static ConstString class_name ("lldb.process");
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return class_name;
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton//----------------------------------------------------------------------
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor
75846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
75946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::Process(Target &target, Listener &listener) :
76046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    UserID (LLDB_INVALID_PROCESS_ID),
76146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Broadcaster (&(target.GetDebugger()), "lldb.process"),
76246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ProcessInstanceSettings (GetSettingsController()),
76346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_target (target),
76446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_public_state (eStateUnloaded),
76546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_private_state (eStateUnloaded),
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"),
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"),
76846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_private_state_listener ("lldb.process.internal_state_listener"),
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_wait(),
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_thread (LLDB_INVALID_HOST_THREAD),
7715a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_mod_id (),
7725a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_thread_index_id (0),
7735a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_exit_status (-1),
7745a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_exit_string (),
7755a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_thread_list (this),
7765a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_notifications (),
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_image_tokens (),
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_listener (listener),
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_breakpoint_site_list (),
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dynamic_checkers_ap (),
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_unix_signals (),
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp (),
7835a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_process_input_reader (),
784334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    m_stdio_communication ("process.stdio"),
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stdout_data (),
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stderr_data (),
7885a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_memory_cache (*this),
7895a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    m_allocated_memory_cache (*this),
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_should_detach (false),
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_next_event_action_ap(),
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_run_lock (),
79321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_can_jit(eCanJITDontKnow)
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateInstanceName();
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CheckInWithManager ();
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
80020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    if (log)
80120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        log->Printf ("%p Process::Process()", this);
80220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
803861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    SetEventName (eBroadcastBitStateChanged, "state-changed");
80420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    SetEventName (eBroadcastBitInterrupt, "interrupt");
805861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    SetEventName (eBroadcastBitSTDOUT, "stdout-available");
806a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    SetEventName (eBroadcastBitSTDERR, "stderr-available");
80720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
808fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    listener.StartListeningForEvents (this,
809bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton                                      eBroadcastBitStateChanged |
810613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                                      eBroadcastBitInterrupt |
811613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                                      eBroadcastBitSTDOUT |
812ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                                      eBroadcastBitSTDERR);
8136cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan
814ce96dad5ccafe2cb3899c4dd2d724ccacb4c2e46Bill Wendling    m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
815ce96dad5ccafe2cb3899c4dd2d724ccacb4c2e46Bill Wendling                                                     eBroadcastBitStateChanged);
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8171ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
8185a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                                     eBroadcastInternalStateControlStop |
8195a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                                     eBroadcastInternalStateControlPause |
8201ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice                                                     eBroadcastInternalStateControlResume);
821e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton}
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
82549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//----------------------------------------------------------------------
82649ce682dfa7993d31206cea19ce7006cd3f3077eGreg ClaytonProcess::~Process()
82749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton{
82849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
82949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (log)
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Process::~Process()", this);
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StopPrivateStateThread();
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize()
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (GetPrivateState())
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateConnected:
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateAttaching:
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateLaunching:
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStopped:
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateRunning:
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStepping:
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateCrashed:
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateSuspended:
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (GetShouldDetach())
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Detach();
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
850e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton                Destroy();
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateInvalid:
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateUnloaded:
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateDetached:
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateExited:
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
859ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton
860ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    // Clear our broadcaster before we proceed with destroying
861ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    Broadcaster::Clear();
862ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton
863ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    // Do any cleanup needed prior to being destructed... Subclasses
864ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    // that override this method should call this superclass method as well.
865ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton
866ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    // We need to destroy the loader before the derived Process class gets destroyed
867ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    // since it is very likely that undoing the loader will require access to the real process.
868ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_dynamic_checkers_ap.reset();
869ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_abi_sp.reset();
870ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_os_ap.reset();
871ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_dyld_ap.reset();
872ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_thread_list.Destroy();
873ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    std::vector<Notifications> empty_notifications;
874ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_notifications.swap(empty_notifications);
875ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_image_tokens.clear();
876ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_memory_cache.Clear();
877ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_allocated_memory_cache.Clear();
878ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_language_runtimes.clear();
879ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton    m_next_event_action_ap.reset();
880ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton}
881ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton
8822f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Claytonvoid
8832f57db09a49f2a05a620b8163bbe1e748a46ec73Greg ClaytonProcess::RegisterNotificationCallbacks (const Notifications& callbacks)
8842f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton{
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_notifications.push_back(callbacks);
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (callbacks.initialize != NULL)
88788fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham        callbacks.initialize (callbacks.baton, this);
88888fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham}
88988fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham
890182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Claytonbool
891182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg ClaytonProcess::UnregisterNotificationCallbacks(const Notifications& callbacks)
89237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
893182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton    std::vector<Notifications>::iterator pos, end = m_notifications.end();
89413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    for (pos = m_notifications.begin(); pos != end; ++pos)
895182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton    {
896182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton        if (pos->baton == callbacks.baton &&
897182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton            pos->initialize == callbacks.initialize &&
898182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton            pos->process_state_changed == callbacks.process_state_changed)
899182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton        {
900182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton            m_notifications.erase(pos);
901182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton            return true;
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state)
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (notification_pos->process_state_changed)
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification_pos->process_state_changed (notification_pos->baton, this, state);
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them.
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick.  But we can't do that when the
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall.  So instead we do it when we fetch the event off of the queue.
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp)
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = eStateInvalid;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout)
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We can't just wait for a "stopped" event, because the stopped event may have restarted the target.
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We have to actually check each event, and in the case of a stopped event check the restarted flag
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // on the event.
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventSP event_sp;
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = GetState();
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we are exited or detached, we won't ever get back to any
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // other valid state...
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (state == eStateDetached || state == eStateExited)
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return state;
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (state != eStateInvalid)
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = WaitForStateChangedEvents (timeout, event_sp);
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (state)
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateCrashed:
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateDetached:
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateExited:
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateUnloaded:
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return state;
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStopped:
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
96321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                continue;
96421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            else
96521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                return state;
96621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        default:
96721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            continue;
96821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        }
96921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    }
97021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    return state;
97121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
97221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
97321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
97421f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamStateType
97521f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::WaitForState
97621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham(
97721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    const TimeValue *timeout,
97821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    const StateType *match_states, const uint32_t num_match_states
97921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham)
98021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{
98121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    EventSP event_sp;
98221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    uint32_t i;
98321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    StateType state = GetState();
98421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    while (state != eStateInvalid)
98521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    {
98621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        // If we are exited or detached, we won't ever get back to any
98721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        // other valid state...
98821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        if (state == eStateDetached || state == eStateExited)
98921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            return state;
99021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
99121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        state = WaitForStateChangedEvents (timeout, event_sp);
99221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (i=0; i<num_match_states; ++i)
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_states[i] == state)
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return state;
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HijackProcessEvents (Listener *listener)
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1005d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton    if (listener != NULL)
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return HijackBroadcaster(listener, eBroadcastBitStateChanged);
1008d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton    }
1009d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton    else
1010d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        return false;
1011d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton}
1012d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RestoreProcessEvents ()
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RestoreBroadcaster();
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HijackPrivateProcessEvents (Listener *listener)
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (listener != NULL)
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham        return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged);
102563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    }
102663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    else
102763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham        return false;
102863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham}
102963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham
103063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid
103163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestorePrivateProcessEvents ()
103263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{
103363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    m_private_state_broadcaster.RestoreBroadcaster();
103463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham}
103563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham
103663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamStateType
103763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
103863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{
103963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
104063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham
1041f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (log)
1042f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1043f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
1044f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    StateType state = eStateInvalid;
1045f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (m_listener.WaitForEventForBroadcasterWithType (timeout,
1046f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                                       this,
1047f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                                       eBroadcastBitStateChanged,
1048f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                                       event_sp))
1049f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1050f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
1051f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (log)
1052f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
1053f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                     __FUNCTION__,
1054f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                     timeout,
1055f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                     StateAsCString(state));
1056f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    return state;
1057f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham}
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent *
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents ()
1061e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton{
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s...", __FUNCTION__);
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    Event *event_ptr;
106836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
106936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton                                                                  eBroadcastBitStateChanged);
107036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    if (log)
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_ptr)
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s (event_ptr) => %s",
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         __FUNCTION__,
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s no events found",
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         __FUNCTION__);
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1084e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    return event_ptr;
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
109136f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = eStateInvalid;
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout,
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                     &m_private_state_broadcaster,
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                     eBroadcastBitStateChanged,
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                     event_sp))
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is a bit of a hack, but when we wait here we could very well return
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to the command-line, and that could disable the log, which would render the
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // log we got above invalid.
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (state == eStateInvalid)
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout);
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1112e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    return state;
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
111972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton
112072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    if (log)
112172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (control_only)
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_private_state_listener.WaitForEvent(timeout, event_sp);
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
112872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton
112972e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool
113072e1c782ba1e4226da37af4722af608de9f39408Greg ClaytonProcess::IsRunning () const
113172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton{
113272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    return StateIsRunningState (m_public_state.GetValue());
113372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton}
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus ()
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_public_state.GetValue() == eStateExited)
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_exit_status;
1140e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    return -1;
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription ()
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_exit_string.c_str();
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr)
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    status, status,
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cstr ? "\"" : "",
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cstr ? cstr : "NULL",
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cstr ? "\"" : "");
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We were already in the exited state
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_private_state.GetValue() == eStateExited)
1165638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    {
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_exit_status = status;
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cstr)
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_exit_string = cstr;
117472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    else
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_exit_string.clear();
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton    DidExit ();
117868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
117968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton    SetPrivateState (eStateExited);
118068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton    return true;
118168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton}
118268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
118368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton// This static callback can be used to watch for local child processes on
118468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton// the current host. The the child process exits, the process will be
118572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton// found in the global target list (we want to be completely sure that the
118672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton// lldb_private::Process doesn't go away before we can deliver the signal.
118768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Claytonbool
1188644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg ClaytonProcess::SetProcessExitStatus (void *callback_baton,
1189644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton                               lldb::pid_t pid,
119072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                               bool exited,
119168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                               int signo,          // Zero for no signal
119272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                               int exit_status     // Exit value of process if signal is zero
119372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton)
119472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton{
119572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
119672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    if (log)
119772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%llu, exited=%i, signal=%i, exit_status=%i)\n",
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     callback_baton,
119972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                     pid,
120058e844b3561848e73e69d6d98746d4851e78306eGreg Clayton                     exited,
120172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                     signo,
120272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                     exit_status);
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exited)
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_sp)
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ProcessSP process_sp (target_sp->GetProcessSP());
12101c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton            if (process_sp)
12111c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton            {
12121c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                const char *signal_cstr = NULL;
12131c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                if (signo)
12141c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                    signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process_sp->SetExitStatus (exit_status, signal_cstr);
12171c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton            }
12181c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton        }
1219d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton        return true;
12201c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    }
12211c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton    return false;
12221c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton}
12231c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton
12241c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton
12251c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Claytonvoid
12261c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonProcess::UpdateThreadListIfNeeded ()
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122863094e0bb161580564954dee512955c1c79d3476Greg Clayton    const uint32_t stop_id = GetStopID();
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StateType state = GetPrivateState();
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (StateIsStoppedState (state, true))
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Mutex::Locker locker (m_thread_list.GetMutex ());
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // m_thread_list does have its own mutex, but we need to
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // hold onto the mutex between the call to UpdateThreadList(...)
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // and the os->UpdateThreadList(...) so it doesn't change on us
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ThreadList new_thread_list(this);
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Always update the thread list with the protocol specific
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // thread list, but only update if "true" is returned
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (UpdateThreadList (m_thread_list, new_thread_list))
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                OperatingSystem *os = GetOperatingSystem ();
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (os)
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    os->UpdateThreadList (m_thread_list, new_thread_list);
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_thread_list.Update (new_thread_list);
124737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                m_thread_list.SetStopID (stop_id);
124837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            }
124937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
125037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
125137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton}
125237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
1253202060806d75f812b56a3cfa70d85fff536e5c2fGreg Claytonuint32_t
1254202060806d75f812b56a3cfa70d85fff536e5c2fGreg ClaytonProcess::GetNextThreadIndexID ()
1255202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton{
1256202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton    return ++m_thread_index_id;
1257ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton}
1258ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton
1259ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg ClaytonStateType
1260202060806d75f812b56a3cfa70d85fff536e5c2fGreg ClaytonProcess::GetState()
1261202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton{
1262ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    // If any other threads access this we will need a mutex for it
1263ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    return m_public_state.GetValue ();
1264ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton}
1265ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton
1266ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonvoid
1267ae932359b80098532f3c3766fa9e6527352fbb67Greg ClaytonProcess::SetPublicState (StateType new_state)
1268ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton{
1269ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1270ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    if (log)
1271202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton        log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state));
127237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    const StateType old_state = m_public_state.GetValue();
127337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    m_public_state.SetValue (new_state);
127437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    if (!IsHijackedForEvent(eBroadcastBitStateChanged))
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (old_state_is_stopped != new_state_is_stopped)
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (new_state_is_stopped)
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log)
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state));
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_run_lock.WriteUnlock();
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log)
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf("Process::SetPublicState (%s) -- locking run lock", StateAsCString(new_state));
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_run_lock.WriteLock();
129168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton            }
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1294a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton}
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1296a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonStateType
1297a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::GetPrivateState ()
1298a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton{
1299a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    return m_private_state.GetValue();
1300a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton}
1301a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
1302a894fe78bc15344a0025c1154e414c554ab31dd9Greg Claytonvoid
1303a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::SetPrivateState (StateType new_state)
1304a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton{
1305a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1306a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    bool state_changed = false;
1307a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
1308a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    if (log)
1309a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1310a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
1311a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    Mutex::Locker locker(m_private_state.GetMutex());
1312a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
1313a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    const StateType old_state = m_private_state.GetValueNoLock ();
1314a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    state_changed = old_state != new_state;
1315a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    // This code is left commented out in case we ever need to control
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the private process state with another run lock. Right now it doesn't
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // seem like we need to do this, but if we ever do, we can uncomment and
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // use this code.
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (old_state_is_stopped != new_state_is_stopped)
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        if (new_state_is_stopped)
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            m_private_run_lock.WriteUnlock();
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        else
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            m_private_run_lock.WriteLock();
132768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton//    }
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (state_changed)
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state.SetValueNoLock (new_state);
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (StateIsStoppedState(new_state, false))
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_mod_id.BumpStopID();
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_memory_cache.Clear();
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (log)
1337a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID());
1338a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1339a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        // Use our target to get a shared pointer to ourselves...
1340a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state));
1341a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    }
1342a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    else
1343a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    {
1344a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (log)
1345a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state));
1346a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    }
1347a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton}
1348a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
1349a894fe78bc15344a0025c1154e414c554ab31dd9Greg Claytonvoid
1350a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::SetRunningUserExpression (bool on)
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_id.SetRunningUserExpression (on);
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1354202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t
135621f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::GetImageInfoAddress()
1357fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_ADDRESS;
135921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// LoadImage
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This function provides a default implementation that works for most
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unix variants. Any Process subclasses that need to do shared library
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// loading differently should override LoadImage and UnloadImage and
13677e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda// do what is needed.
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::LoadImage (const FileSpec &image_spec, Error &error)
13710296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{
13720296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    DynamicLoader *loader = GetDynamicLoader();
13730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    if (loader)
13740296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    {
13750296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        error = loader->CanLoadImage();
13760296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        if (error.Fail())
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return LLDB_INVALID_IMAGE_TOKEN;
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
13830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
13840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (thread_sp)
13850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
13860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
13870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
13880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (frame_sp)
13890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            {
13900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                ExecutionContext exe_ctx;
13910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                frame_sp->CalculateExecutionContext (exe_ctx);
13920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                bool unwind_on_error = true;
13930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                StreamString expr;
13940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                char path[PATH_MAX];
13950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                image_spec.GetPath(path, sizeof(path));
13960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                expr.Printf("dlopen (\"%s\", 2)", path);
13970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
13980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                lldb::ValueObjectSP result_valobj_sp;
13990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
14000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                error = result_valobj_sp->GetError();
14010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                if (error.Success())
14020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                {
14030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    Scalar scalar;
14040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    if (result_valobj_sp->ResolveValue (scalar))
14050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    {
14060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
14070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
14080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        {
14090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            uint32_t image_token = m_image_tokens.size();
14100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            m_image_tokens.push_back (image_ptr);
14110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            return image_token;
14120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
14130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    }
1414ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham                }
14150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            }
14160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
14170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
14180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return LLDB_INVALID_IMAGE_TOKEN;
14190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
1420360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
1421daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan//----------------------------------------------------------------------
1422b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen// UnloadImage
1423b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen//
14240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most
14250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library
1426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// loading differently should override LoadImage and UnloadImage and
14270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed.
14280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//----------------------------------------------------------------------
14290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError
14300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token)
14310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
14320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    Error error;
14330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (image_token < m_image_tokens.size())
14340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
14350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        const addr_t image_addr = m_image_tokens[image_token];
14360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (image_addr == LLDB_INVALID_ADDRESS)
14370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
14380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            error.SetErrorString("image already unloaded");
14390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
14400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        else
14410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
14420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            DynamicLoader *loader = GetDynamicLoader();
14430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (loader)
14440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                error = loader->CanLoadImage();
14450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
14460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (error.Success())
14470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            {
14480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
14490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
14500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                if (thread_sp)
14510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                {
14520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
14530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
14540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    if (frame_sp)
14550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    {
14560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        ExecutionContext exe_ctx;
14570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        frame_sp->CalculateExecutionContext (exe_ctx);
14580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        bool unwind_on_error = true;
14590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        StreamString expr;
14600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        expr.Printf("dlclose ((void *)0x%llx)", image_addr);
14610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
14620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        lldb::ValueObjectSP result_valobj_sp;
14630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
14640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        if (result_valobj_sp->GetError().Success())
14650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        {
14660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            Scalar scalar;
14670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            if (result_valobj_sp->ResolveValue (scalar))
14680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            {
14690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                if (scalar.UInt(1))
14700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                {
14710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                    error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
14720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                }
14730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                else
14740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                {
14750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                    m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
14760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                }
14770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            }
14780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
14790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        else
1480ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham                        {
14810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            error = result_valobj_sp->GetError();
14820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
14830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    }
1484360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                }
1485daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan            }
14860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
14870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
14880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    else
1489fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
14900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        error.SetErrorString("invalid image token");
14910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
14920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return error;
14930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
14940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
14950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonconst lldb::ABISP &
14960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::GetABI()
14970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
14980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (!m_abi_sp)
14990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture());
15000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return m_abi_sp;
15010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
15020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
15030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonLanguageRuntime *
15040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
15050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
15060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    LanguageRuntimeCollection::iterator pos;
15070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    pos = m_language_runtimes.find (language);
15080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
15090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
15100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
15110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
15120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        m_language_runtimes[language] = runtime_sp;
15130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        return runtime_sp.get();
15140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
15150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    else
15160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        return (*pos).second.get();
151775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton}
151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCPPLanguageRuntime *
152075906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonProcess::GetCPPLanguageRuntime (bool retry_if_null)
152175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
152275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return static_cast<CPPLanguageRuntime *> (runtime);
1525642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return NULL;
1526e31176627725f4236c9ca049edc027756709780bJim Ingham}
1527642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1528642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime *
1529642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime (bool retry_if_null)
1530e31176627725f4236c9ca049edc027756709780bJim Ingham{
1531642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
1532e31176627725f4236c9ca049edc027756709780bJim Ingham    if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
1533642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return static_cast<ObjCLanguageRuntime *> (runtime);
1534e31176627725f4236c9ca049edc027756709780bJim Ingham    return NULL;
1535e31176627725f4236c9ca049edc027756709780bJim Ingham}
1536642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1537642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamBreakpointSiteList &
1538642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetBreakpointSiteList()
1539642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
1540642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return m_breakpoint_site_list;
1541642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
1542e31176627725f4236c9ca049edc027756709780bJim Ingham
1543642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamconst BreakpointSiteList &
1544e31176627725f4236c9ca049edc027756709780bJim InghamProcess::GetBreakpointSiteList() const
1545642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
1546642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return m_breakpoint_site_list;
1547642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
1548642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1549642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1550642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamvoid
1551e31176627725f4236c9ca049edc027756709780bJim InghamProcess::DisableAllBreakpointSites ()
1552642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
1553e31176627725f4236c9ca049edc027756709780bJim Ingham    m_breakpoint_site_list.SetEnabledForAll (false);
1554642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
1555642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1556642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamError
1557642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id)
1558642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (DisableBreakpointSiteByID (break_id));
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_breakpoint_site_list.Remove(break_id);
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id)
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site_sp)
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_site_sp->IsEnabled())
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = DisableBreakpoint (bp_site_sp.get());
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id);
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id)
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site_sp)
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!bp_site_sp->IsEnabled())
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = EnableBreakpoint (bp_site_sp.get());
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id);
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1601444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::break_id_t
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (load_addr != LLDB_INVALID_ADDRESS)
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BreakpointSiteSP bp_site_sp;
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Look up this breakpoint site.  If it exists, then add this new owner, otherwise
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // create a new breakpoint site and add it.
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_site_sp)
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bp_site_sp->AddOwner (owner);
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            owner->SetBreakpointSite (bp_site_sp);
1619444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton            return bp_site_sp->GetID();
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware));
16243fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilson            if (bp_site_sp)
162513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton            {
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (EnableBreakpoint (bp_site_sp.get()).Success())
1627265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton                {
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    owner->SetBreakpointSite (bp_site_sp);
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return m_breakpoint_site_list.Add (bp_site_sp);
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We failed to enable the breakpoint
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_BREAK_ID;
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_owners == 0)
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisableBreakpoint(bp_site_sp.get());
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_removed = 0;
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t intersect_addr;
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t intersect_size;
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t opcode_offset;
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t idx;
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp_sp;
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList bp_sites_in_range;
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range))
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx)
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bp_sp->GetType() == BreakpointSite::eSoftware)
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(opcode_offset + intersect_size <= bp_sp->GetByteSize());
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    size_t buf_offset = intersect_addr - bp_addr;
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_removed;
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1681987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton
168282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168482820f9f021e289431ff3b79e56bd7d88097f327Jim Inghamsize_t
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
1686987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton{
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PlatformSP platform_sp (m_target.GetPlatform());
1688987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    if (platform_sp)
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
1690987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    return 0;
169182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham}
169282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham
169382820f9f021e289431ff3b79e56bd7d88097f327Jim InghamError
1694987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
169582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham{
1696987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    Error error;
169782820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham    assert (bp_site != NULL);
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const addr_t bp_addr = bp_site->GetLoadAddress();
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr);
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site->IsEnabled())
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
1705b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
1706b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return error;
1707b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
1708b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
1709b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (bp_addr == LLDB_INVALID_ADDRESS)
1710b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
1711b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString("BreakpointSite contains an invalid load address.");
1712b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return error;
1713b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
1714b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Ask the lldb::Process subclass to fill in the correct software breakpoint
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // trap for the breakpoint site
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_opcode_size == 0)
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1720e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton        error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx", bp_addr);
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_opcode_bytes == NULL)
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Save the original opcode by reading it
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Write a software breakpoint in place of the original opcode
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint8_t verify_bp_opcode_bytes[64];
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
17429c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    {
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bp_site->SetEnabled(true);
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bp_site->SetType (BreakpointSite::eSoftware);
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (log)
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS",
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         bp_site->GetID(),
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         (uint64_t)bp_addr);
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("failed to verify the breakpoint trap in memory.");
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error.SetErrorString("Unable to read memory to verify breakpoint trap.");
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorString("Unable to write breakpoint trap to memory.");
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorString("Unable to read memory at breakpoint address.");
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log && error.Fail())
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     bp_site->GetID(),
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     (uint64_t)bp_addr,
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     error.AsCString());
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17739c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    Error error;
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (bp_site != NULL);
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t bp_addr = bp_site->GetLoadAddress();
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t breakID = bp_site->GetID();
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::DisableBreakpoint (breakID = %llu) addr = 0x%llx", breakID, (uint64_t)bp_addr);
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site->IsHardware())
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString("Breakpoint site is a hardware breakpoint.");
1784c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson    }
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (bp_site->IsEnabled())
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t break_op_size = bp_site->GetByteSize();
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (break_op_size > 0)
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Clear a software breakoint instruction
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint8_t curr_break_op[8];
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (break_op_size <= sizeof(curr_break_op));
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool break_op_found = false;
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Read the breakpoint opcode
1797e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton            if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool verify = false;
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure we have the a breakpoint opcode exists at this address
1801444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break_op_found = true;
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We found a valid breakpoint opcode at this address, now restore
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // the saved opcode.
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        verify = true;
180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("Memory write failed when restoring original opcode.");
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
181454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                {
1815141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson                    error.SetErrorString("Original breakpoint trap is no longer in memory.");
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Set verify to true and so we can check if the original opcode has already been restored
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    verify = true;
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (verify)
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint8_t verify_opcode[8];
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert (break_op_size < sizeof(verify_opcode));
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Verify that our original opcode made it back to the inferior
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // compare the memory we just read with the original opcode
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // SUCCESS
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            bp_site->SetEnabled(false);
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (log)
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return error;
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (break_op_found)
183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                error.SetErrorString("Failed to restore original opcode.");
184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
184454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                }
1845141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson            }
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     bp_site->GetID(),
186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     (uint64_t)bp_addr,
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     error.AsCString());
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Comment out line below to disable memory caching
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ENABLE_MEMORY_CACHING
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Uncomment to verify memory caching works after making changes to caching code
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define VERIFY_MEMORY_READS
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (ENABLE_MEMORY_CACHING)
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (VERIFY_MEMORY_READS)
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Memory caching is enabled, with debug verification
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (buf && size)
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Uncomment the line below to make sure memory caching is working.
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // I ran this through the test suite and got no assertions, so I am
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // pretty confident this is working well. If any changes are made to
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // memory caching, uncomment the line below and test your changes!
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Verify all memory reads by using the cache first, then redundantly
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // reading the same memory from the inferior and comparing to make sure
1888fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        // everything is exactly the same.
1889fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        std::string verify_buf (size, '\0');
1890fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        assert (verify_buf.size() == size);
1891fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
1892fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        Error verify_error;
1893fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
1894fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        assert (cache_bytes_read == verify_bytes_read);
1895fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
1896fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        assert (verify_error.Success() == error.Success());
1897fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        return cache_bytes_read;
1898fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    }
1899fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    return 0;
1900fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton}
1901fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1902fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else   // #if defined (VERIFY_MEMORY_READS)
1903fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1904fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t
1905fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1906fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{
1907fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    // Memory caching enabled, no verification
1908fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    return m_memory_cache.Read (addr, buf, size, error);
1909fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton}
1910fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1911fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif  // #else for #if defined (VERIFY_MEMORY_READS)
1912fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1913fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else   // #if defined (ENABLE_MEMORY_CACHING)
1914fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1915fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t
1916fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1917fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{
1918fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    // Memory caching is disabled
1919fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    return ReadMemoryFromInferior (addr, buf, size, error);
1920fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton}
1921fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1922fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif  // #else for #if defined (ENABLE_MEMORY_CACHING)
1923fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1924fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1925fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t
1926fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error)
1927fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{
1928fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    size_t total_cstr_len = 0;
1929fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    if (dst && dst_max_len)
1930613b8739a4d489b7f1c571288d5786768c024205Greg Clayton    {
1931fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        result_error.Clear();
1932fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        // NULL out everything just to be safe
1933fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        memset (dst, 0, dst_max_len);
1934fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        Error error;
1935fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        addr_t curr_addr = addr;
193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        size_t bytes_left = dst_max_len - 1;
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char *curr_dst = dst;
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1940fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        while (bytes_left > 0)
1941fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        {
1942fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton            addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1943fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton            addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1944fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton            size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
1945fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
1946fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton            if (bytes_read == 0)
1947fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton            {
19484a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                result_error = error;
1949b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                dst[total_cstr_len] = '\0';
1950b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                break;
1951b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
1952b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            const size_t len = strlen(curr_dst);
19534a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton
1954b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            total_cstr_len += len;
1955b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1956b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            if (len < bytes_to_read)
1957b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                break;
1958b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1959b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            curr_dst += bytes_read;
1960b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            curr_addr += bytes_read;
1961b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            bytes_left -= bytes_read;
1962b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
1963b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
1964b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
1965b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
1966b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (dst == NULL)
1967b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            result_error.SetErrorString("invalid arguments");
1968b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        else
1969b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            result_error.Clear();
19704a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
1971b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return total_cstr_len;
1972b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
1973b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1974b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t
1975b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
1976b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
1977b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (buf == NULL || size == 0)
1978b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        return 0;
1979b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1980b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    size_t bytes_read = 0;
1981b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    uint8_t *bytes = (uint8_t *)buf;
1982b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1983b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    while (bytes_read < size)
1984b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
1985b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        const size_t curr_size = size - bytes_read;
19864a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
19874a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                                                     bytes + bytes_read,
19884a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                                                     curr_size,
19894a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                                                     error);
19904a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        bytes_read += curr_bytes_read;
19914a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        if (curr_bytes_read == curr_size || curr_bytes_read == 0)
19924a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton            break;
1993b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
1994b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
1995b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Replace any software breakpoint opcodes that fall into this range back
1996b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // into "buf" before we return
1997fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    if (bytes_read > 0)
1998fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton        RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_read;
200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar scalar;
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return scalar.ULongLong(fail_value);
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar scalar;
201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return scalar.ULongLong(LLDB_INVALID_ADDRESS);
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_ADDRESS;
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WritePointerToMemory (lldb::addr_t vm_addr,
202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::addr_t ptr_value,
2024f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton                               Error &error)
2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{
2026f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton    Scalar scalar;
2027c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    const uint32_t addr_byte_size = GetAddressByteSize();
2028c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (addr_byte_size <= 4)
2029c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        scalar = (uint32_t)ptr_value;
2030c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    else
2031c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        scalar = ptr_value;
2032c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
2033c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton}
2034c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2035c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t
2036c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
2037c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{
2038c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    size_t bytes_written = 0;
2039c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    const uint8_t *bytes = (const uint8_t *)buf;
2040c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2041c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    while (bytes_written < size)
2042c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    {
2043c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        const size_t curr_size = size - bytes_written;
2044c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
2045c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                         bytes + bytes_written,
2046c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                         curr_size,
2047c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                         error);
2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        bytes_written += curr_bytes_written;
2049c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2050c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            break;
2051c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    }
2052f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton    return bytes_written;
2053c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton}
2054c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2055f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonsize_t
2056f72fdeee129bbd7195f3db888b561ede689886aaGreg ClaytonProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (ENABLE_MEMORY_CACHING)
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_memory_cache.Flush (addr, size);
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (buf == NULL || size == 0)
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_id.BumpMemoryID();
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We need to write any data that would go where any current software traps
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // (enabled software breakpoints) any software traps (breakpoints) that we
206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // may have placed in our tasks memory.
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr);
207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator end =  m_breakpoint_site_list.GetMap()->end();
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (iter == end || iter->second->GetLoadAddress() > addr + size)
207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return WriteMemoryPrivate (addr, buf, size, error);
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator pos;
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_written = 0;
207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t intersect_addr = 0;
2080fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    size_t intersect_size = 0;
2081fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    size_t opcode_offset = 0;
2082fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton    const uint8_t *ubuf = (const uint8_t *)buf;
2083fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton
208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = iter; pos != end; ++pos)
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2086e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        BreakpointSiteSP bp;
208721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        bp = pos->second;
2088e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset));
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(addr <= intersect_addr && intersect_addr < addr + size);
209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(opcode_offset + intersect_size <= bp->GetByteSize());
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check for bytes before this breakpoint
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t curr_addr = addr + bytes_written;
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (intersect_addr > curr_addr)
2097c8bc1c318cfed0e3fe22731d808ddac1b32bb26eGreg Clayton        {
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // There are some bytes before this breakpoint that we need to
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // just write to memory
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t curr_size = intersect_addr - curr_addr;
210154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
210254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                                                            ubuf + bytes_written,
210354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                                                            curr_size,
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                            error);
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += curr_bytes_written;
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (curr_bytes_written != curr_size)
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We weren't able to write all of the requested bytes, we
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // are done looping and will return the number of bytes that
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we have written so far.
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Now write any bytes that would cover up any software breakpoints
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // directly into the breakpoint opcode buffer
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += intersect_size;
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Write any remaining bytes after the last breakpoint if we have any left
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes_written < size)
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += WriteMemoryPrivate (addr + bytes_written,
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             ubuf + bytes_written,
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             size - bytes_written,
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             error);
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error)
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_size == UINT32_MAX)
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_size = scalar.GetByteSize();
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_size > 0)
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t buf[32];
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (mem_size > 0)
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return WriteMemory(addr, buf, mem_size, error);
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorString ("failed to get scalar as memory data");
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString ("invalid scalar value");
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return 0;
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2152c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t
2153c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr,
2154c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      uint32_t byte_size,
2155c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      bool is_signed,
2156c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      Scalar &scalar,
2157c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      Error &error)
2158c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{
2159c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    uint64_t uval;
2160c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2161c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (byte_size <= sizeof(uval))
2162c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    {
2163c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
2164c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        if (bytes_read == byte_size)
2165c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        {
2166c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
2167c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            uint32_t offset = 0;
2168c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (byte_size <= 4)
2169c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                scalar = data.GetMaxU32 (&offset, byte_size);
2170c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            else
2171c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                scalar = data.GetMaxU64 (&offset, byte_size);
2172c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2173c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (is_signed)
2174c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                scalar.SignExtend(byte_size * 8);
2175c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            return bytes_read;
2176c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        }
2177c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    }
2178c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    else
2179c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    {
2180c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
2181c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    }
2182c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    return 0;
2183c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton}
2184c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2185c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1
2186c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t
2187c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error)
2188c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{
2189c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (GetPrivateState() != eStateStopped)
2190c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        return LLDB_INVALID_ADDRESS;
2191c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2192c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE)
2193c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2194c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#else
2195c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
2196c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2197c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (log)
2198c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)",
2199c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    size,
2200c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    GetPermissionsAsCString (permissions),
2201c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    (uint64_t)allocated_addr,
2202c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    m_mod_id.GetStopID(),
2203c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    m_mod_id.GetMemoryID());
2204c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    return allocated_addr;
2205c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#endif
2206c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton}
2207613b8739a4d489b7f1c571288d5786768c024205Greg Clayton
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CanJIT ()
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2211e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (m_can_jit == eCanJITDontKnow)
2212e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
2213e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        Error err;
2214613b8739a4d489b7f1c571288d5786768c024205Greg Clayton
2215613b8739a4d489b7f1c571288d5786768c024205Greg Clayton        uint64_t allocated_memory = AllocateMemory(8,
2216613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                                                   ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
22172860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton                                                   err);
22182860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton
22192860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton        if (err.Success())
222021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            m_can_jit = eCanJITYes;
22212860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton        else
2222613b8739a4d489b7f1c571288d5786768c024205Greg Clayton            m_can_jit = eCanJITNo;
22232860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton
222421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        DeallocateMemory (allocated_memory);
222521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    }
22262860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton
2227613b8739a4d489b7f1c571288d5786768c024205Greg Clayton    return m_can_jit == eCanJITYes;
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22306cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananvoid
22316cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::SetCanJIT (bool can_jit)
22326cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{
223304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
223404200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan}
223504200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan
223604200f6251401ccf3d07b09b5c4d29006cdf1cfaSean CallananError
223704200f6251401ccf3d07b09b5c4d29006cdf1cfaSean CallananProcess::DeallocateMemory (addr_t ptr)
223804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan{
223904200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    Error error;
224004200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan#if defined (USE_ALLOCATE_MEMORY_CACHE)
224104200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    if (!m_allocated_memory_cache.DeallocateMemory(ptr))
224204200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    {
224304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan        error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr);
224404200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    }
224504200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan#else
224604200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    error = DoDeallocateMemory (ptr);
224704200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan
224804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
22496cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan    if (log)
22506cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan        log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)",
22516cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan                    ptr,
22526cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan                    error.AsCString("SUCCESS"),
22536cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan                    m_mod_id.GetStopID(),
22546cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan                    m_mod_id.GetMemoryID());
22556cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan#endif
22566cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan    return error;
22576cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan}
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModuleSP
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadModuleFromMemory (const FileSpec& file_spec,
2261613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                               lldb::addr_t header_addr,
2262613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                               bool add_image_to_target,
2263613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                               bool load_sections_in_target)
2264613b8739a4d489b7f1c571288d5786768c024205Greg Clayton{
2265613b8739a4d489b7f1c571288d5786768c024205Greg Clayton    ModuleSP module_sp (new Module (file_spec, ArchSpec()));
2266613b8739a4d489b7f1c571288d5786768c024205Greg Clayton    if (module_sp)
2267613b8739a4d489b7f1c571288d5786768c024205Greg Clayton    {
2268613b8739a4d489b7f1c571288d5786768c024205Greg Clayton        Error error;
22692860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton        ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error);
22702860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton        if (objfile)
22712860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton        {
227221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            if (add_image_to_target)
22732860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton            {
22742860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton                m_target.GetImages().Append(module_sp);
227521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                if (load_sections_in_target)
227621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                {
2277613b8739a4d489b7f1c571288d5786768c024205Greg Clayton                    bool changed = false;
22782860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton                    module_sp->SetLoadAddress (m_target, 0, changed);
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
2281b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            return module_sp;
22829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
22839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
22849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return ModuleSP();
22859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
2286b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
22876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonError
2288b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonProcess::EnableWatchpoint (Watchpoint *watchpoint)
2289b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
22906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    Error error;
22916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    error.SetErrorString("watchpoints are not supported");
22926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    return error;
22939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
22946c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton
22959ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError
22966c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonProcess::DisableWatchpoint (Watchpoint *watchpoint)
22976c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{
22986c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    Error error;
22996c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    error.SetErrorString("watchpoints are not supported");
23006c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    return error;
23016c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton}
23029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
23036c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonStateType
23049ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
2305b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
23066c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    StateType state;
2307b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    // Now wait for the process to launch and return control to us, and then
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // call DidLaunch:
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (1)
2310ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen    {
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        event_sp.reset();
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = WaitForStateChangedEventsPrivate (timeout, event_sp);
231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (StateIsStoppedState(state, false))
231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If state is invalid, then we timed out
2318ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        if (state == eStateInvalid)
231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_sp)
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            HandlePrivateEvent (event_sp);
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Launch (const ProcessLaunchInfo &launch_info)
232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp.reset();
233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_ap.reset();
233372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    m_os_ap.reset();
233472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    m_process_input_reader.reset();
233572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton
2336202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton    Module *exe_module = m_target.GetExecutableModulePointer();
233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_module)
233872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    {
233972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        char local_exec_file_path[PATH_MAX];
234072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        char platform_exec_file_path[PATH_MAX];
234172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
234272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
234372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        if (exe_module->GetFileSpec().Exists())
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (PrivateStateThreadIsValid ())
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PausePrivateStateThread ();
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = WillLaunch (exe_module);
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error.Success())
235036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton            {
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetPublicState (eStateLaunching);
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_should_detach = false;
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235475c703dd8b492bad25a987b96853626641ae7246Greg Clayton                // Now launch using these arguments.
235537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                error = DoLaunch (exe_module, launch_info);
2356861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error.Fail())
23585beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton                {
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (GetID() != LLDB_INVALID_PROCESS_ID)
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2361180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton                        SetID (LLDB_INVALID_PROCESS_ID);
2362180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton                        const char *error_string = error.AsCString();
2363180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton                        if (error_string == NULL)
2364180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton                            error_string = "launch failed";
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SetExitStatus (-1, error_string);
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
2367a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton                }
2368a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton                else
2369a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton                {
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EventSP event_sp;
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    TimeValue timeout_time;
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    timeout_time = TimeValue::Now();
2373d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton                    timeout_time.OffsetWithSeconds(10);
2374ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                    StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp);
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (state == eStateInvalid || event_sp.get() == NULL)
237736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton                    {
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We were able to launch the process, but we failed to
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // catch the initial stop.
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SetExitStatus (0, "failed to catch stop after launch");
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        Destroy();
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (state == eStateStopped || state == eStateCrashed)
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        DidLaunch ();
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        DynamicLoader *dyld = GetDynamicLoader ();
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (dyld)
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            dyld->DidLaunch();
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
23934985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        // This delays passing the stopped event to listeners till DidLaunch gets
23944985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        // a chance to complete...
23954985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        HandlePrivateEvent (event_sp);
23964985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (PrivateStateThreadIsValid ())
23984985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                            ResumePrivateStateThread ();
23994985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        else
24004985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                            StartPrivateStateThread ();
24014985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                    }
24024985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                    else if (state == eStateExited)
24034985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                    {
24044985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        // We exited while trying to launch somehow.  Don't call DidLaunch as that's
24054985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton                        // not likely to work, and return an invalid pid.
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        HandlePrivateEvent (event_sp);
240775c703dd8b492bad25a987b96853626641ae7246Greg Clayton                    }
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
24119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        else
24129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
241375c703dd8b492bad25a987b96853626641ae7246Greg Clayton            error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path);
241437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2418a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton
2419a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton
2420a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg ClaytonError
2421a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg ClaytonProcess::LoadCore ()
2422a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton{
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error = DoLoadCore();
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (PrivateStateThreadIsValid ())
242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ResumePrivateStateThread ();
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StartPrivateStateThread ();
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DynamicLoader *dyld = GetDynamicLoader ();
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (dyld)
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dyld->DidAttach();
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24359c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton        m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We successfully loaded a core file, now pretend we stopped so we can
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // show all of the threads in the core file and explore the crashed
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // state.
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetPrivateState (eStateStopped);
244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
244246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return error;
244346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
244446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
244546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonDynamicLoader *
244646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::GetDynamicLoader ()
244746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
244846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (m_dyld_ap.get() == NULL)
244946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
245046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return m_dyld_ap.get();
245146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
245246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
24539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
24549ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::NextEventAction::EventActionResult
24559ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
24569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
24579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
245846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    switch (state)
245946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
246046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        case eStateRunning:
246146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        case eStateConnected:
246246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            return eEventActionRetry;
246346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
246446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        case eStateStopped:
246546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        case eStateCrashed:
246646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
24679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // During attach, prior to sending the eStateStopped event,
24689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // lldb_private::Process subclasses must set the process must set
24699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // the new process ID.
24709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
24719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                if (m_exec_count > 0)
24729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                {
24739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                    --m_exec_count;
247446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    m_process->Resume();
247546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    return eEventActionRetry;
2476c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                }
2477c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                else
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2479c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                    m_process->CompleteAttach ();
2480c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                    return eEventActionSuccess;
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
24827e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton            }
2483a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton            break;
24847e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton
24857e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton        default:
24867e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton        case eStateExited:
24877e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton        case eStateInvalid:
24882d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton            break;
24892d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    }
24907fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham
24912d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    m_exit_string.assign ("No valid Process");
24922d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    return eEventActionExit;
24932d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton}
24942d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton
24952d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::NextEventAction::EventActionResult
24962d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::AttachCompletionHandler::HandleBeingInterrupted()
24972d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton{
24982d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    return eEventActionSuccess;
24992d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton}
25002d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton
25012d9adb73af7520bec430e0585ca40467828e6ed1Greg Claytonconst char *
25022d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::AttachCompletionHandler::GetExitString ()
25032d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton{
25047e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton    return m_exit_string.c_str();
25052d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton}
25067e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton
25077e2f91cb958c8670774cb2190db7b858618b5b9bGreg ClaytonError
25087e2f91cb958c8670774cb2190db7b858618b5b9bGreg ClaytonProcess::Attach (ProcessAttachInfo &attach_info)
25097e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton{
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp.reset();
25112d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    m_process_input_reader.reset();
25122d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    m_dyld_ap.reset();
25132d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    m_os_ap.reset();
2514c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2515c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    lldb::pid_t attach_pid = attach_info.GetProcessID();
2516c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    Error error;
2517c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    if (attach_pid == LLDB_INVALID_PROCESS_ID)
2518c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    {
2519c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        char process_name[PATH_MAX];
2520c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2521c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name)))
2522c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        {
2523c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            const bool wait_for_launch = attach_info.GetWaitForLaunch();
2524c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2525c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            if (wait_for_launch)
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error = WillAttachToProcessWithName(process_name, wait_for_launch);
252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error.Success())
2529527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                {
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_should_detach = true;
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2532861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                    SetPublicState (eStateAttaching);
253375c703dd8b492bad25a987b96853626641ae7246Greg Clayton                    error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info);
253437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                    if (error.Fail())
25357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                    {
2536527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        if (GetID() != LLDB_INVALID_PROCESS_ID)
2537e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        {
2538527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                            SetID (LLDB_INVALID_PROCESS_ID);
25397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                            if (error.AsCString() == NULL)
2540527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                                error.SetErrorString("attach failed");
25410d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham
2542527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                            SetExitStatus(-1, error.AsCString());
2543ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham                        }
2544527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    }
2545527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    else
2546527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    {
2547e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
2548527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        StartPrivateStateThread();
2549527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    }
2550527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    return error;
2551ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                }
2552ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            }
2553527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            else
2554d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong            {
2555527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                ProcessInstanceInfoList process_infos;
2556527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                PlatformSP platform_sp (m_target.GetPlatform ());
2557527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2558527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                if (platform_sp)
2559527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                {
2560527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    ProcessInstanceInfoMatch match_info;
2561527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.GetProcessInfo() = attach_info;
2562527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    match_info.SetNameMatchType (eNameMatchEquals);
2563527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    platform_sp->FindProcesses (match_info, process_infos);
2564527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    const uint32_t num_matches = process_infos.GetSize();
2565527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    if (num_matches == 1)
2566527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    {
2567527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        attach_pid = process_infos.GetProcessIDAtIndex(0);
2568527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        // Fall through and attach using the above process ID
2569527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    }
2570527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    else
2571527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    {
2572527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                        match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name));
2573e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        if (num_matches > 1)
2574527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                            error.SetErrorStringWithFormat ("more than one process named %s", process_name);
2575e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        else
2576527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                            error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
2577527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    }
2578527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                }
2579527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                else
2580527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                {
2581527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    error.SetErrorString ("invalid platform, can't find processes by name");
2582527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    return error;
2583527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                }
2584527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            }
2585527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        }
2586527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        else
2587527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        {
2588527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            error.SetErrorString ("invalid process name");
2589527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        }
2590527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
2591527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2592527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    if (attach_pid != LLDB_INVALID_PROCESS_ID)
2593527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    {
2594527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        error = WillAttachToProcessWithID(attach_pid);
2595527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (error.Success())
2596527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        {
2597527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_should_detach = true;
2598527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            SetPublicState (eStateAttaching);
2599527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2600527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            error = DoAttachToProcessWithID (attach_pid, attach_info);
2601527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            if (error.Success())
2602527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            {
2603527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2604527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
2605e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                StartPrivateStateThread();
2606e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
2607e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            else
2608527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            {
2609527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                if (GetID() != LLDB_INVALID_PROCESS_ID)
2610ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham                {
26117508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                    SetID (LLDB_INVALID_PROCESS_ID);
2612527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    const char *error_string = error.AsCString();
2613527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton                    if (error_string == NULL)
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error_string = "attach failed";
2615527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2616e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    SetExitStatus(-1, error_string);
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
2618ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            }
2619e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
2620527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
2621d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    return error;
2622527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton}
2623527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2624527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Error
2625527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Process::Attach (const char *process_name, bool wait_for_launch)
2626527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//{
2627527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    m_abi_sp.reset();
2628527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    m_process_input_reader.reset();
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
2630e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//    // Find the process and its architecture.  Make sure it matches the architecture
2631e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//    // of the current Target, and if not adjust it.
2632e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//    Error error;
2633e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
2634e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//    if (!wait_for_launch)
2635e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//    {
263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        ProcessInstanceInfoList process_infos;
2637e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        PlatformSP platform_sp (m_target.GetPlatform ());
2638e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        assert (platform_sp.get());
2639e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        if (platform_sp)
264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ProcessInstanceInfoMatch match_info;
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            match_info.GetProcessInfo().SetName(process_name);
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            match_info.SetNameMatchType (eNameMatchEquals);
2645527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            platform_sp->FindProcesses (match_info, process_infos);
2646527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            if (process_infos.GetSize() > 1)
2647527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            {
2648527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                error.SetErrorStringWithFormat ("more than one process named %s", process_name);
2649527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            }
2650527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            else if (process_infos.GetSize() == 0)
2651527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            {
2652527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
2653527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            }
2654527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        }
2655527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        else
2656527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        {
2657527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            error.SetErrorString ("invalid platform");
2658527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        }
2659527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    }
2660527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//
2661527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    if (error.Success())
2662527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    {
2663527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        m_dyld_ap.reset();
2664527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        m_os_ap.reset();
2665527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//
2666527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        error = WillAttachToProcessWithName(process_name, wait_for_launch);
2667527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        if (error.Success())
2668527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        {
2669527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            SetPublicState (eStateAttaching);
2670527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            error = DoAttachToProcessWithName (process_name, wait_for_launch);
2671527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            if (error.Fail())
2672527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            {
2673527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                if (GetID() != LLDB_INVALID_PROCESS_ID)
2674527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                {
2675527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                    SetID (LLDB_INVALID_PROCESS_ID);
2676527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                    const char *error_string = error.AsCString();
2677527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                    if (error_string == NULL)
2678527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                        error_string = "attach failed";
2679527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//
2680527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                    SetExitStatus(-1, error_string);
2681527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                }
2682527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            }
2683527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            else
2684527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            {
2685527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                SetNextEventAction(new Process::AttachCompletionHandler(this, 0));
2686527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//                StartPrivateStateThread();
2687527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//            }
2688527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//        }
2689527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    }
2690527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//    return error;
2691527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//}
2692527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2693527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonvoid
2694527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcess::CompleteAttach ()
2695527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{
2696527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    // Let the process subclass figure out at much as it can about the process
2697527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    // before we go looking for a dynamic loader plug-in.
2698527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    DidAttach();
2699527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2700527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    // We just attached.  If we have a platform, ask it for the process architecture, and if it isn't
2701527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    // the same as the one we've already set, switch architectures.
2702527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    PlatformSP platform_sp (m_target.GetPlatform ());
2703527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    assert (platform_sp.get());
2704527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    if (platform_sp)
2705527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    {
2706527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        ProcessInstanceInfo process_info;
2707527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        platform_sp->GetProcessInfo (GetID(), process_info);
2708527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        const ArchSpec &process_arch = process_info.GetArchitecture();
2709527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (process_arch.IsValid() && m_target.GetArchitecture() != process_arch)
2710527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            m_target.SetArchitecture (process_arch);
2711527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    }
2712527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
2713527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    // We have completed the attach, now it is time to find the dynamic loader
271475c703dd8b492bad25a987b96853626641ae7246Greg Clayton    // plug-in
271575c703dd8b492bad25a987b96853626641ae7246Greg Clayton    DynamicLoader *dyld = GetDynamicLoader ();
271675c703dd8b492bad25a987b96853626641ae7246Greg Clayton    if (dyld)
271775c703dd8b492bad25a987b96853626641ae7246Greg Clayton        dyld->DidAttach();
271875c703dd8b492bad25a987b96853626641ae7246Greg Clayton
271975c703dd8b492bad25a987b96853626641ae7246Greg Clayton    m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
272075c703dd8b492bad25a987b96853626641ae7246Greg Clayton    // Figure out which one is the executable, and set that in our target:
27210d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham    ModuleList &modules = m_target.GetImages();
27220d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham
27230d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham    size_t num_modules = modules.GetSize();
27240d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham    for (int i = 0; i < num_modules; i++)
27250d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham    {
27260d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham        ModuleSP module_sp (modules.GetModuleAtIndex(i));
27270d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham        if (module_sp && module_sp->IsExecutable())
27280d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham        {
27290d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham            if (m_target.GetExecutableModulePointer() != module_sp.get())
27300d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham                m_target.SetExecutableModule (module_sp, false);
27310d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham            break;
27320d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham        }
27330d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham    }
27340d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham}
273575c703dd8b492bad25a987b96853626641ae7246Greg Clayton
27369ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError
27379ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::ConnectRemote (const char *remote_url)
27389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
273975c703dd8b492bad25a987b96853626641ae7246Greg Clayton    m_abi_sp.reset();
274037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    m_process_input_reader.reset();
274175c703dd8b492bad25a987b96853626641ae7246Greg Clayton
274275c703dd8b492bad25a987b96853626641ae7246Greg Clayton    // Find the process and its architecture.  Make sure it matches the architecture
274375c703dd8b492bad25a987b96853626641ae7246Greg Clayton    // of the current Target, and if not adjust it.
274475c703dd8b492bad25a987b96853626641ae7246Greg Clayton
274575c703dd8b492bad25a987b96853626641ae7246Greg Clayton    Error error (DoConnectRemote (remote_url));
274675c703dd8b492bad25a987b96853626641ae7246Greg Clayton    if (error.Success())
274775c703dd8b492bad25a987b96853626641ae7246Greg Clayton    {
2748b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (GetID() != LLDB_INVALID_PROCESS_ID)
274975c703dd8b492bad25a987b96853626641ae7246Greg Clayton        {
27505beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton            EventSP event_sp;
275175c703dd8b492bad25a987b96853626641ae7246Greg Clayton            StateType state = WaitForProcessStopPrivate(NULL, event_sp);
275275c703dd8b492bad25a987b96853626641ae7246Greg Clayton
275375c703dd8b492bad25a987b96853626641ae7246Greg Clayton            if (state == eStateStopped || state == eStateCrashed)
275475c703dd8b492bad25a987b96853626641ae7246Greg Clayton            {
275575c703dd8b492bad25a987b96853626641ae7246Greg Clayton                // If we attached and actually have a process on the other end, then
275675c703dd8b492bad25a987b96853626641ae7246Greg Clayton                // this ended up being the equivalent of an attach.
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CompleteAttach ();
2758e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
2759e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                // This delays passing the stopped event to listeners till
2760e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                // CompleteAttach gets a chance to complete...
2761e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                HandlePrivateEvent (event_sp);
2762e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
2763e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            }
2764e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        }
2765e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
2766e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        if (PrivateStateThreadIsValid ())
2767e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            ResumePrivateStateThread ();
2768e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        else
2769a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton            StartPrivateStateThread ();
2770a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    }
277124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return error;
277224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
277324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
277424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
277524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
277624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcess::Resume ()
277724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
277824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
277924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (log)
278024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s",
278124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    m_mod_id.GetStopID(),
278224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    StateAsCString(m_public_state.GetValue()),
278324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    StateAsCString(m_private_state.GetValue()));
278424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
2785a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    Error error (WillResume());
278624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Tell the process it is about to resume before the thread list
278724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (error.Success())
278824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
278924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Now let the thread list know we are about to resume so it
279024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // can let all of our threads know that they are about to be
2791e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // resumed. Threads will each be called with
2792e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // Thread::WillResume(StateType) where StateType contains the state
2793e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // that they are supposed to have when the process is resumed
2794e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // (suspended/running/stepping). Threads should also check
2795e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // their resume signal in lldb::Thread::GetResumeSignal()
2796e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        // to see if they are suppoed to start back up with a signal.
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_thread_list.WillResume())
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2799e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton            // Last thing, do the PreResumeActions.
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!RunPreResumeActions())
2801ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham            {
280221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                error.SetErrorStringWithFormat ("Process::Resume PreResumeActions failed, not resuming.");
2803ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham            }
2804ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham            else
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_mod_id.BumpResumeID();
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error = DoResume();
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error.Success())
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
28109c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen                    DidResume();
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_thread_list.DidResume();
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log)
281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log->Printf ("Process thinks the process has resumed.");
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume");
28201831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        }
28211831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    }
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (log)
28231831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>"));
28241831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    return error;
28251831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham}
28261831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
28271831e78a6253392fca1c99e555e7adaa3f372647Jim InghamError
28281831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::Halt ()
28291831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{
28301831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    // Pause our private state thread so we can ensure no one else eats
28311831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    // the stop event out from under us.
28321831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    Listener halt_listener ("lldb.process.halt_listener");
28331831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    HijackPrivateProcessEvents(&halt_listener);
28341831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
28351831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    EventSP event_sp;
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillHalt());
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2840ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool caused_stop = false;
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2843ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        // Ask the process subclass to actually halt our process
2844ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        error = DoHalt(caused_stop);
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_public_state.GetValue() == eStateAttaching)
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetExitStatus(SIGKILL, "Cancelled async attach.");
285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Destroy ();
2851c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            }
2852c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            else
2853f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
2854f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                // If "caused_stop" is true, then DoHalt stopped the process. If
2855c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                // "caused_stop" is false, the process was already stopped.
2856c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                // If the DoHalt caused the process to stop, then we want to catch
28577e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                // this event and set the interrupted bool to true before we pass
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // this along so clients know that the process was interrupted by
28597e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                // a halt command.
2860c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                if (caused_stop)
286120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                {
28627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    // Wait for 1 second for the process to stop.
28637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    TimeValue timeout_time;
28647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    timeout_time = TimeValue::Now();
28657e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    timeout_time.OffsetWithSeconds(1);
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp);
28673ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                    StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
28687e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton
28697e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    if (!got_event || state == eStateInvalid)
28707e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    {
28717e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                        // We timeout out and didn't get a stop event...
28727e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                        error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState()));
28737e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton                    }
28743ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                    else
2875c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                    {
2876c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                        if (StateIsStoppedState (state, false))
2877c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                        {
2878c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            // We caused the process to interrupt itself, so mark this
2879c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            // as such in the stop event so clients can tell an interrupted
2880c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            // process from a natural stop
2881c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
288220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        }
2883f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        else
2884c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                        {
2885c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2886c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                            if (log)
2887f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
2888f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            error.SetErrorString ("Did not get stopped event after halt.");
2889c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                        }
2890f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    }
289120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                }
2892c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                DidHalt();
2893f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
289420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        }
289520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    }
289620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    // Resume our private state thread before we post the event (if any)
2897202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton    RestorePrivateProcessEvents();
2898c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2899c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    // Post any event we might have consumed. If all goes well, we will have
2900c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    // stopped the process, intercepted the event and set the interrupted
2901c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    // bool in the event.  Post it to the private event queue and that will end up
2902c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    // correctly setting the state.
2903c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    if (event_sp)
2904c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        m_private_state_broadcaster.BroadcastEvent(event_sp);
2905c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2906c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    return error;
2907c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham}
2908c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2909c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamError
2910c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::Detach ()
291120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton{
291220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    Error error (WillDetach());
2913c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
2914c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    if (error.Success())
29153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    {
2916c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        DisableAllBreakpointSites();
2917c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        error = DoDetach();
2918f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (error.Success())
291920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        {
2920c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            DidDetach();
2921c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            StopPrivateStateThread();
2922c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        }
2923c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    }
2924c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    return error;
2925c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham}
292620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy ()
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillDestroy());
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisableAllBreakpointSites();
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = DoDestroy();
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DidDestroy();
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StopPrivateStateThread();
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_stdio_communication.StopReadThread();
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_stdio_communication.Disconnect();
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_process_input_reader && m_process_input_reader->IsActive())
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target.GetDebugger().PopInputReader (m_process_input_reader);
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_process_input_reader)
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_process_input_reader.reset();
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal)
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillSignal());
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = DoSignal(signal);
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DidSignal();
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
2961861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2962861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2963861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticelldb::ByteOrder
2964861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::GetByteOrder () const
2965861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2966861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    return m_target.GetArchitecture().GetByteOrder();
29677fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham}
29687fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham
29697fa7b2f813120a78818246e2d185643a32fa9391Jim Inghamuint32_t
29707fa7b2f813120a78818246e2d185643a32fa9391Jim InghamProcess::GetAddressByteSize () const
29717fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham{
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target.GetArchitecture().GetAddressByteSize();
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr)
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool return_value = true;
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (state)
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateConnected:
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateAttaching:
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateLaunching:
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateDetached:
2989395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        case eStateExited:
2990395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        case eStateUnloaded:
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // These events indicate changes in the state of the debugging session, always report them.
2992395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            return_value = true;
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateInvalid:
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We stopped for no apparent reason, don't report it.
2996395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            return_value = false;
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
2998395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        case eStateRunning:
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStepping:
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we've started the target running, we handle the cases where we
3001395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            // are already running and where there is a transition from stopped to
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // running differently.
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // running -> running: Automatically suppress extra running events
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // stopped -> running: Report except when there is one or more no votes
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //     and no yes votes.
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SynchronouslyNotifyStateChanged (state);
3007e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton            switch (m_public_state.GetValue())
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case eStateRunning:
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case eStateStepping:
3011e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    // We always suppress multiple runnings with no PUBLIC stop in between.
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return_value = false;
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // TODO: make this work correctly. For now always report
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // run if we aren't running so we don't miss any runnning
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // events. If I run the lldb/test/thread/a.out file and
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // break at main.cpp:58, run and hit the breakpoints on
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // multiple threads, then somehow during the stepping over
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // of all breakpoints no run gets reported.
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return_value = true;
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // This is a transition from stop to run.
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    switch (m_thread_list.ShouldReportRun (event_ptr))
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteYes:
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNoOpinion:
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = true;
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNo:
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = false;
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStopped:
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateCrashed:
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateSuspended:
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We've stopped.  First see if we're going to restart the target.
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we are going to stop, then we always broadcast the event.
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we aren't going to stop, let the thread plans decide if we're going to report this event.
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If no thread has an opinion, we don't report it.
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log)
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state));
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RefreshStateAfterStop ();
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_thread_list.ShouldStop (event_ptr) == false)
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    switch (m_thread_list.ShouldReportStop (event_ptr))
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteYes:
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            Process::ProcessEventData::SetRestartedInEvent (event_ptr, true);
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Intentional fall-through here.
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNoOpinion:
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNo:
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = false;
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log)
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
30705a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham                    Resume ();
30713ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                }
30723ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                else
307320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                {
307420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return_value = true;
30753ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                    SynchronouslyNotifyStateChanged (state);
30763ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                }
30773ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            }
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::ShouldBroadcastEvent (%p) => %s - %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO");
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_value;
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3087028784b321087f1547df8f02f01631c59e5a9859Johnny Chenbool
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread (bool force)
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool already_running = PrivateStateThreadIsValid ();
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
30953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!force && already_running)
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Create a thread that watches our internal state and controls which
310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // events make it to clients (into the DCProcess event queue).
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char thread_name[1024];
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (already_running)
310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%llu)>", GetID());
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%llu)>", GetID());
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Create the private state thread, and start it running.
31087e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL);
310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread);
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (success)
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ResumePrivateStateThread();
311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
31141831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    }
311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
3116e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton        return false;
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3120b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::PausePrivateStateThread ()
3121b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
31221831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    ControlPrivateStateThread (eBroadcastInternalStateControlPause);
3123b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread ()
3127a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{
31281831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    ControlPrivateStateThread (eBroadcastInternalStateControlResume);
31291831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham}
31301831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
31311831e78a6253392fca1c99e555e7adaa3f372647Jim Inghamvoid
3132d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim InghamProcess::StopPrivateStateThread ()
3133d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham{
3134a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    if (PrivateStateThreadIsValid ())
3135d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        ControlPrivateStateThread (eBroadcastInternalStateControlStop);
3136d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham}
3137d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3138d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Inghamvoid
3139d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim InghamProcess::ControlPrivateStateThread (uint32_t signal)
3140d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham{
3141d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
3142d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (signal == eBroadcastInternalStateControlStop ||
314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            signal == eBroadcastInternalStateControlPause ||
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            signal == eBroadcastInternalStateControlResume);
314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Signal the private state thread. First we should copy this is case the
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // thread starts exiting since the private state thread will NULL this out
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // when it exits
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::thread_t private_state_thread = m_private_state_thread;
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IS_VALID_LLDB_HOST_THREAD(private_state_thread))
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue timeout_time;
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool timed_out;
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
3160b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
3161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        timeout_time = TimeValue::Now();
31627fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        timeout_time.OffsetWithSeconds(2);
31637fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
31647fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        m_private_state_control_wait.SetValue (false, eBroadcastNever);
31657fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham
31667fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        if (signal == eBroadcastInternalStateControlStop)
31677fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        {
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (timed_out)
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Host::ThreadCancel (private_state_thread, NULL);
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            thread_result_t result = NULL;
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Host::ThreadJoin (private_state_thread, &result, NULL);
31737fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham            m_private_state_thread = LLDB_INVALID_HOST_THREAD;
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp)
3180f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton{
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3182f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton
3183f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton    const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3184f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton
3185f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton    // First check to see if anybody wants a shot at this event:
318609c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton    if (m_next_event_action_ap.get() != NULL)
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (action_result)
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case NextEventAction::eEventActionSuccess:
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetNextEventAction(NULL);
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31957fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham            case NextEventAction::eEventActionRetry:
31967fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                break;
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case NextEventAction::eEventActionExit:
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Handle Exiting Here.  If we already got an exited event,
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we should just propagate it.  Otherwise, swallow this event,
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // and set our state to exit so the next event will kill us.
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (new_state != eStateExited)
32037fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                {
32047fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                    // FIXME: should cons up an exited event, and discard this one.
32057fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                    SetExitStatus(0, m_next_event_action_ap->GetExitString());
32067fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                    SetNextEventAction(NULL);
32077fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                    return;
32087fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                }
32097fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                SetNextEventAction(NULL);
32107fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                break;
32117fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        }
32127fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham    }
32137fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // See if we should broadcast this state to external clients?
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
3216f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton
3217c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton    if (should_broadcast)
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
32207fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        {
32217fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham            log->Printf ("Process::%s (pid = %llu) broadcasting new state %s (old state %s) to %s",
32227fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                         __FUNCTION__,
32237fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                         GetID(),
32247fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                         StateAsCString(new_state),
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         StateAsCString (GetState ()),
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (StateIsRunningState (new_state))
3230e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton            PushProcessInputReader ();
3231c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        else
323268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton            PopProcessInputReader ();
3233c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
3234c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        BroadcastEvent (event_sp);
323568bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham    }
3236c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    else
323768bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham    {
3238c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        if (log)
3239c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        {
3240c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham            log->Printf ("Process::%s (pid = %llu) suppressing state %s (old state %s): should_broadcast == false",
3241c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                         __FUNCTION__,
3242c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                         GetID(),
32432d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton                         StateAsCString(new_state),
3244c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham                         StateAsCString (GetState ()));
3245c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham        }
32462d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton    }
3247c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham}
324884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham
324984c8638c46e3325d73e614b4ce0ad383ff216488Jim Inghamvoid *
325084c8638c46e3325d73e614b4ce0ad383ff216488Jim InghamProcess::PrivateStateThread (void *arg)
325184c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham{
325284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham    Process *proc = static_cast<Process*> (arg);
325384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham    void *result = proc->RunPrivateStateThread ();
325468bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham    return result;
325584c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham}
325684c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham
325784c8638c46e3325d73e614b4ce0ad383ff216488Jim Inghamvoid *
325884c8638c46e3325d73e614b4ce0ad383ff216488Jim InghamProcess::RunPrivateStateThread ()
3259c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{
3260c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    bool control_only = true;
3261c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham    m_private_state_control_wait.SetValue (true, eBroadcastNever);
3262c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, this, GetID());
326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool exit_now = false;
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (!exit_now)
326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3270444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        EventSP event_sp;
327168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton        WaitForEventsPrivate (NULL, event_sp, control_only);
327268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton        if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
327368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton        {
327468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton            switch (event_sp->GetType())
327568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton            {
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eBroadcastInternalStateControlStop:
3277d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                exit_now = true;
327868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                continue;   // Go to next loop iteration so we exit without
3279861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                break;      // doing any internal state managment below
3280861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3281861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            case eBroadcastInternalStateControlPause:
3282d60d94a5126b93fda98678a68322abc2164073dbJim Ingham                control_only = true;
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eBroadcastInternalStateControlResume:
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                control_only = false;
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
3289444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
329068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton            if (log)
329168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                log->Printf ("Process::%s (arg = %p, pid = %llu) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
329268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton
32937e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            m_private_state_control_wait.SetValue (true, eBroadcastAlways);
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            continue;
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (internal_state != eStateInvalid)
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            HandlePrivateEvent (event_sp);
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (internal_state == eStateInvalid ||
330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            internal_state == eStateExited  ||
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            internal_state == eStateDetached )
330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3309d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham            if (log)
33107fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham                log->Printf ("Process::%s (arg = %p, pid = %llu) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3312e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton            break;
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
3314444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    }
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Verify log is still enabled before attempting to write to it...
331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, this, GetID());
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_wait.SetValue (true, eBroadcastAlways);
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_thread = LLDB_INVALID_HOST_THREAD;
332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
33237fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham}
33247fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham
33257fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham//------------------------------------------------------------------
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data
332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () :
333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventData (),
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp (),
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_state (eStateInvalid),
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_restarted (false),
333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_state (0),
333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_interrupted (false)
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
33403ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    EventData (),
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp (process_sp),
33423ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    m_state (state),
334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_restarted (false),
334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_state (0),
334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_interrupted (false)
334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData()
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33533b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Claytonconst ConstString &
33543b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg ClaytonProcess::ProcessEventData::GetFlavorString ()
33553b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton{
33563ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    static ConstString g_flavor ("Process::ProcessEventData");
33573ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    return g_flavor;
3358444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
33593ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
33613ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetFlavor () const
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ProcessEventData::GetFlavorString ();
3364926060e198137f8a64face70455324a8cd4362a5Caroline Tice}
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3366444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonvoid
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr)
3368a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton{
3369a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton    // This function gets called twice for each event, once when the event gets pulled
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // off of the private process event queue, and then any number of times, first when it gets pulled off of
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the public event queue, then other times when we're pretending that this is where we stopped at the
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // end of expression evaluation.  m_update_state is used to distinguish these
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // three cases; it is 0 when we're just pulling it off for private handling,
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_update_state != 1)
337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp->SetPublicState (m_state);
338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    // If we're stopped and haven't restarted, then do the breakpoint commands here:
33826cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham    if (m_state == eStateStopped && ! m_restarted)
33833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    {
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadList &curr_thread_list = m_process_sp->GetThreadList();
338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t num_threads = curr_thread_list.GetSize();
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t idx;
338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The actions might change one of the thread's stop_info's opinions about whether we should
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // stop the process, so we need to query that as we go.
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        // One other complication here, is that we try to catch any case where the target has run (except for expressions)
33926cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham        // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and
33933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        // that would cause our iteration here to crash.  We could make a copy of the thread list, but we'd really like
339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back
339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // against this list & bag out if anything differs.
339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> thread_index_array(num_threads);
339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (idx = 0; idx < num_threads; ++idx)
339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID();
339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool still_should_stop = true;
340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (idx = 0; idx < num_threads; ++idx)
340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            curr_thread_list = m_process_sp->GetThreadList();
340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (curr_thread_list.GetSize() != num_threads)
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (log)
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize());
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (thread_sp->GetIndexID() != thread_index_array[idx])
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
34186cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham                if (log)
34196cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham                    log->Printf("The thread at position %u changed from %u to %u while processing event.",
34206cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham                                idx,
34216cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham                                thread_index_array[idx],
34226cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham                                thread_sp->GetIndexID());
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
34246cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham            }
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (stop_info_sp)
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                stop_info_sp->PerformAction(event_ptr);
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // The stop action might restart the target.  If it does, then we want to mark that in the
34310296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                // event so that whoever is receiving it will know to wait for the running event and reflect
34320296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                // that state appropriately.
3433d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton                // We also need to stop processing actions, since they aren't expecting the target to be running.
3434d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton
3435643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // FIXME: we might have run.
343621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                if (stop_info_sp->HasTargetRunSinceMe())
343721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                {
34380296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                    SetRestarted (true);
34390296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                    break;
34400296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                }
34410296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                else if (!stop_info_sp->ShouldStop(event_ptr))
34420296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                {
34430296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                    still_should_stop = false;
3444d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton                }
34450296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham            }
34460296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        }
34470296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham
344821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
344921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        if (m_process_sp->GetPrivateState() != eStateRunning)
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!still_should_stop)
34520296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham            {
34530296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                // We've been asked to continue, so do that here.
34540296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                SetRestarted(true);
34550296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                m_process_sp->Resume();
345660526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham            }
3457d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton            else
34580296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham            {
34590296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                // If we didn't restart, run the Stop Hooks here:
34600296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                // They might also restart the target, so watch for that.
34610296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                m_process_sp->GetTarget().RunStopHooks();
34620296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                if (m_process_sp->GetPrivateState() == eStateRunning)
34630296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham                    SetRestarted(true);
34640296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham            }
34650296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        }
346660526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham
3467d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton    }
346860526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham}
346960526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham
347060526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Inghamvoid
34710296fe73a7cb1482226b1303a795ede00e12d677Jim InghamProcess::ProcessEventData::Dump (Stream *s) const
34720296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{
34730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    if (m_process_sp)
34746297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham        s->Printf(" process = %p (pid = %llu), ", m_process_sp.get(), m_process_sp->GetID());
34756297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham
347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("state = %s", StateAsCString(GetState()));
34776297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham}
347821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
347921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghamconst Process::ProcessEventData *
348021f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
348121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{
34820296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    if (event_ptr)
34830296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham    {
34840296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham        const EventData *event_data = event_ptr->GetData();
348521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
348621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            return static_cast <const ProcessEventData *> (event_ptr->GetData());
348721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    }
348821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    return NULL;
348921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
349021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
349121f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcessSP
349221f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessSP process_sp;
34956fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
349621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (data)
349721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        process_sp = data->GetProcessSP();
3498d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    return process_sp;
349921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
350021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
350121f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamStateType
3502d60d94a5126b93fda98678a68322abc2164073dbJim InghamProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
350321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{
350421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
350521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (data == NULL)
350621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        return eStateInvalid;
350721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    else
350821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        return data->GetState();
350921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham}
351021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
351121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghambool
351221f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
3513d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{
3514d60d94a5126b93fda98678a68322abc2164073dbJim Ingham    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data == NULL)
351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return data->GetRestarted();
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3522444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data != NULL)
352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data->SetRestarted(new_value);
352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data == NULL)
353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return data->GetInterrupted ();
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data != NULL)
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data->SetInterrupted(new_value);
354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data)
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data->SetUpdateStateOnRemoval();
355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::TargetSP
356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateTarget ()
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target.shared_from_this();
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateExecutionContext (ExecutionContext &exe_ctx)
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.SetTargetPtr (&m_target);
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.SetProcessPtr (this);
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.SetThreadPtr(NULL);
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.SetFramePtr (NULL);
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    return 0;
35783ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//}
35793ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//
35803ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//ArchSpec
35813ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
35823ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//{
35833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//    return Host::GetArchSpecForExistingProcess (pid);
35843ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//}
35853ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//
35863ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//ArchSpec
35873ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//Process::GetArchSpecForExistingProcess (const char *process_name)
35883ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//{
35893ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//    return Host::GetArchSpecForExistingProcess (process_name);
35903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//}
35913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//
35923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid
35933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::AppendSTDOUT (const char * s, size_t len)
35943ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{
35953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    Mutex::Locker locker (m_stdio_communication_mutex);
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stdout_data.append (s, len);
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AppendSTDERR (const char * s, size_t len)
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_stdio_communication_mutex);
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stderr_data.append (s, len);
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3607289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
3608289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton//------------------------------------------------------------------
3609289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton// Process STDIO
3610289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton//------------------------------------------------------------------
3611289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
3612289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Claytonsize_t
361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSTDOUT (char *buf, size_t buf_size, Error &error)
3614a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{
361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_stdio_communication_mutex);
3616567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    size_t bytes_available = m_stdout_data.size();
3617567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (bytes_available > 0)
3618567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
3619567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::GetSTDOUT (buf = %p, size = %zu)", buf, buf_size);
3622e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (bytes_available > buf_size)
3623e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
3624e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            memcpy(buf, m_stdout_data.c_str(), buf_size);
3625e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_stdout_data.erase(0, buf_size);
3626e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            bytes_available = buf_size;
3627e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
3628e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
3629e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
3630e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            memcpy(buf, m_stdout_data.c_str(), bytes_available);
3631e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_stdout_data.clear();
3632e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
3633e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
3634e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return bytes_available;
3635e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
3636e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
3637e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
3638e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonsize_t
3639e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonProcess::GetSTDERR (char *buf, size_t buf_size, Error &error)
3640861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3641861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    Mutex::Locker locker(m_stdio_communication_mutex);
3642861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    size_t bytes_available = m_stderr_data.size();
364320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    if (bytes_available > 0)
3644861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
3645b37813353540bcabee7af5f096515a8180be0426Greg Clayton        LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3646861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (log)
3647861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            log->Printf ("Process::GetSTDERR (buf = %p, size = %zu)", buf, buf_size);
3648861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (bytes_available > buf_size)
3649bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        {
3650bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            memcpy(buf, m_stderr_data.c_str(), buf_size);
3651bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            m_stderr_data.erase(0, buf_size);
3652bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            bytes_available = buf_size;
3653bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        }
3654bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        else
3655bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        {
3656bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            memcpy(buf, m_stderr_data.c_str(), bytes_available);
3657bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            m_stderr_data.clear();
3658bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        }
3659bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    }
3660bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    return bytes_available;
3661bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton}
3662bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3663bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonvoid
3664bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
3665bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{
3666bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    Process *process = (Process *) baton;
3667bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    process->AppendSTDOUT (static_cast<const char *>(src), src_len);
3668bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton}
3669bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3670bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t
3671bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::ProcessInputReaderCallback (void *baton,
3672bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton                                     InputReader &reader,
3673bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton                                     lldb::InputReaderAction notification,
3674bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton                                     const char *bytes,
3675bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton                                     size_t bytes_len)
3676bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{
3677bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    Process *process = (Process *) baton;
3678bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3679bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    switch (notification)
3680bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    {
3681bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderActivate:
3682bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3683bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3684bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderDeactivate:
3685bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3686bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3687bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderReactivate:
3688bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3689bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3690bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderAsynchronousOutputWritten:
3691bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3692bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3693bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderGotToken:
3694bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        {
3695bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            Error error;
3696bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton            process->PutSTDIN (bytes, bytes_len, error);
3697bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        }
3698bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3699bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3700bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderInterrupt:
3701bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        process->Halt ();
3702bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3703bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3704bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderEndOfFile:
3705bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        process->AppendSTDOUT ("^D", 2);
3706bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3707bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3708bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    case eInputReaderDone:
3709bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton        break;
3710bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton
3711bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton    }
3712861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3713861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    return bytes_len;
3714861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
3715861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3716861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
3717861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader ()
3718861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3719861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader.reset();
3720861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
3721861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3722861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
3723861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetSTDIOFileDescriptor (int file_descriptor)
3724861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3725861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    // First set up the Read Thread for reading/handling process I/O
3726861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3727861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
3728861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3729861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (conn_ap.get())
3730861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
3731861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_stdio_communication.SetConnection (conn_ap.release());
3732861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (m_stdio_communication.IsConnected())
3733861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        {
3734861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
3735861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_stdio_communication.StartReadThread();
3736861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3737861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            // Now read thread is set up, set up input reader.
37384a348081030cdd2af758fddc869518357d9befd3Caroline Tice
37394a348081030cdd2af758fddc869518357d9befd3Caroline Tice            if (!m_process_input_reader.get())
37404a348081030cdd2af758fddc869518357d9befd3Caroline Tice            {
3741861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
3742861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
3743861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               this,
3744861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               eInputReaderGranularityByte,
3745861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               NULL,
3746861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               NULL,
3747861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               false));
3748c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
3749c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice                if  (err.Fail())
3750c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice                    m_process_input_reader.reset();
3751c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice            }
3752c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        }
3753c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    }
3754c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice}
3755c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
3756861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
3757861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader ()
3758861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3759861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (m_process_input_reader && !m_process_input_reader->IsActive())
3760861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_target.GetDebugger().PushInputReader (m_process_input_reader);
3761861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
3762861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3763861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
3764861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader ()
3765861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3766861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (m_process_input_reader && m_process_input_reader->IsActive())
3767861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_target.GetDebugger().PopInputReader (m_process_input_reader);
3768861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
3769861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3770861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice// The process needs to know about installed plug-ins
3771464c6161464694412b7472129e789248f1cf21b9Greg Claytonvoid
3772861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SettingsInitialize ()
3773861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3774861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    static std::vector<OptionEnumValueElement> g_plugins;
3775861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3776861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    int i=0;
3777861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    const char *name;
3778861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    OptionEnumValueElement option_enum;
3779861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL)
3780861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
3781861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (name)
3782861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        {
3783861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            option_enum.value = i;
3784861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            option_enum.string_value = name;
3785861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i);
3786861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            g_plugins.push_back (option_enum);
3787861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        }
3788861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        ++i;
3789861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    }
3790861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    option_enum.value = 0;
3791861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    option_enum.string_value = NULL;
3792861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    option_enum.usage = NULL;
3793861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    g_plugins.push_back (option_enum);
3794861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3795861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i)
3796861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
3797861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (::strcmp (name, "plugin") == 0)
3798861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        {
3799861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            SettingsController::instance_settings_table[i].enum_values = &g_plugins[0];
3800861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            break;
3801861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        }
3802861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    }
3803861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    UserSettingsControllerSP &usc = GetSettingsController();
3804861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    usc.reset (new SettingsController);
3805861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    UserSettingsController::InitializeSettingsController (usc,
3806861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                          SettingsController::global_settings_table,
3807861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                          SettingsController::instance_settings_table);
3808861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3809861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    // Now call SettingsInitialize() for each 'child' of Process settings
3810861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    Thread::SettingsInitialize ();
3811861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
3812861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3813861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
3814861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SettingsTerminate ()
3815861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
3816861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings.
3817861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
3818d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    Thread::SettingsTerminate ();
3819990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
38202a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    // Now terminate Process Settings.
3821990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
3822b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    UserSettingsControllerSP &usc = GetSettingsController();
3823d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    UserSettingsController::FinalizeSettingsController (usc);
3824d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    usc.reset();
3825d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton}
3826d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
3827d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonUserSettingsControllerSP &
3828d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonProcess::GetSettingsController ()
3829d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton{
3830d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    static UserSettingsControllerSP g_settings_controller_sp;
3831d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    if (!g_settings_controller_sp)
3832d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    {
3833d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        g_settings_controller_sp.reset (new Process::SettingsController);
3834d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        // The first shared pointer to Process::SettingsController in
3835d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        // g_settings_controller_sp must be fully created above so that
3836d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        // the TargetInstanceSettings can use a weak_ptr to refer back
3837d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        // to the master setttings controller
3838d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        InstanceSettingsSP default_instance_settings_sp (new ProcessInstanceSettings (g_settings_controller_sp,
3839d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton                                                                                      false,
3840d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton                                                                                      InstanceSettings::GetDefaultName().AsCString()));
3841d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        g_settings_controller_sp->SetDefaultInstanceSettings (default_instance_settings_sp);
3842d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    }
3843d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    return g_settings_controller_sp;
3844d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
3845d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton}
3846d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
3847d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Claytonvoid
3848d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonProcess::UpdateInstanceName ()
3849d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton{
3850d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    Module *module = GetTarget().GetExecutableModulePointer();
3851990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    if (module && module->GetFileSpec().GetFilename())
3852990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    {
3853990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(),
3854990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                                                         module->GetFileSpec().GetFilename().AsCString());
3855990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    }
38562a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice}
38572a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
38582a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceExecutionResults
3859990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::RunThreadPlan (ExecutionContext &exe_ctx,
38606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                        lldb::ThreadPlanSP &thread_plan_sp,
3861990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                        bool stop_others,
38622a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice                        bool try_all_threads,
3863990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                        bool discard_on_error,
38642a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice                        uint32_t single_thread_timeout_usec,
38652a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice                        Stream &errors)
38662a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{
38672a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    ExecutionResults return_value = eExecutionSetupError;
38682a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice
38692a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    if (thread_plan_sp.get() == NULL)
3870990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    {
3871990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        errors.Printf("RunThreadPlan called with empty thread plan.");
3872990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        return eExecutionSetupError;
3873990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    }
38746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
3875990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    if (exe_ctx.GetProcessPtr() != this)
3876990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    {
3877990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        errors.Printf("RunThreadPlan called on wrong process.");
3878334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        return eExecutionSetupError;
3879334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    }
3880334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
3881334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    Thread *thread = exe_ctx.GetThreadPtr();
3882334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    if (thread == NULL)
3883334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    {
3884334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        errors.Printf("RunThreadPlan called with invalid thread.");
3885334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        return eExecutionSetupError;
3886334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    }
3887334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
3888334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
3889334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    // For that to be true the plan can't be private - since private plans suppress themselves in the
3890334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    // GetCompletedPlan call.
3891334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
3892334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    bool orig_plan_private = thread_plan_sp->GetPrivate();
38936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    thread_plan_sp->SetPrivate(false);
38946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
38951ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    if (m_private_state.GetValue() != eStateStopped)
38961ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    {
38971ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice        errors.Printf ("RunThreadPlan called while the private state was not stopped.");
38985beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton        return eExecutionSetupError;
389913d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    }
39001ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
3901c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    // Save the thread & frame from the exe_ctx for restoration after we run
390213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    const uint32_t thread_idx_id = thread->GetIndexID();
39031ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    StackID ctx_frame_id = thread->GetSelectedFrame()->GetStackID();
39041ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
39051ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    // N.B. Running the target may unset the currently selected thread and frame.  We don't want to do that either,
3906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    // so we should arrange to reset them as well.
3907360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
39081831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
3909360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
3910360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    uint32_t selected_tid;
3911360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    StackID selected_stack_id;
3912360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (selected_thread_sp)
3913360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
3914360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        selected_tid = selected_thread_sp->GetIndexID();
3915360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID();
3916360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
391715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    else
391815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    {
391915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        selected_tid = LLDB_INVALID_THREAD_ID;
3920b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    }
392115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
3922567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD;
3923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::StateType old_state;
3924567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::ThreadPlanSP stopper_base_plan_sp;
3925567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
3927567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (Host::GetCurrentThread() == m_private_state_thread)
3928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
3929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        // Yikes, we are running on the private state thread!  So we can't wait for public events on this thread, since
3930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        // we are the thread that is generating public events.
3931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        // The simplest thing to do is to spin up a temporary thread to handle private state thread events while
3932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        // we are fielding public events here.
3933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (log)
3934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton			log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events.");
393515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
39365ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham
39375ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham        backup_private_state_thread = m_private_state_thread;
39385ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham
39395ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham        // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop,
39405ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham        // returning control here.
39415ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham        // But in the normal course of things, the plan above us on the stack would be given a shot at the stop
39425ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham        // event before deciding to stop, and we don't want that.  So we insert a "stopper" base plan on the stack
3943ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        // before the plan we want to run.  Since base plans always stop and return control to the user, that will
3944ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        // do just what we want.
3945ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        stopper_base_plan_sp.reset(new ThreadPlanBase (*thread));
3946b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        thread->QueueThreadPlan (stopper_base_plan_sp, false);
3947ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly.
3948ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham        old_state = m_public_state.GetValue();
39497bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham        m_public_state.SetValueNoLock(eStateStopped);
3950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3951567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        // Now spin up the private state thread:
3952360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        StartPrivateStateThread(true);
3953360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
3954360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
3955360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense?
3956567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3957360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    Listener listener("lldb.process.listener.run-thread-plan");
39587bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham
39597bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham    // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
3960e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // restored on exit to the function.
3961360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
3962360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    ProcessEventHijacker run_thread_plan_hijacker (*this, &listener);
39637bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham
3964360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (log)
3965360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
3966360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        StreamString s;
3967360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
3968360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4llx to run thread plan \"%s\".",
3969360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                     thread->GetIndexID(),
39701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                     thread->GetID(),
3971d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                     s.GetData());
3972d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    }
39731831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
3974d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    bool got_event;
39751831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    lldb::EventSP event_sp;
39761831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    lldb::StateType stop_state = lldb::eStateInvalid;
3977d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3978d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    TimeValue* timeout_ptr = NULL;
39791831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    TimeValue real_timeout;
3980d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3981d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    bool first_timeout = true;
3982d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    bool do_resume = true;
3983d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3984d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham    while (1)
39851831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    {
3986d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        // We usually want to resume the process if we get to the top of the loop.
3987d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        // The only exception is if we get two running events with no intervening
3988d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        // stop, which can happen, we will just wait for then next stop event.
3989d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3990d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        if (do_resume)
3991d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        {
3992d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham            // Do the initial resume and wait for the running event before going further.
3993d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
3994d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham            Error resume_error = Resume ();
3995d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham            if (!resume_error.Success())
3996d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham            {
3997d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString());
3998d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                return_value = eExecutionSetupError;
3999d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                break;
40001831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham            }
40011831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
40021831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham            real_timeout = TimeValue::Now();
40031831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham            real_timeout.OffsetWithMicroSeconds(500000);
4004360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            timeout_ptr = &real_timeout;
40056ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham
4006f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            got_event = listener.WaitForEvent(timeout_ptr, event_sp);
4007f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (!got_event)
4008f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4009f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (log)
4010f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    log->PutCString("Didn't get any event after initial resume, exiting.");
4011ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham
401215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                errors.Printf("Didn't get any event after initial resume, exiting.");
401315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                return_value = eExecutionSetupError;
401415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                break;
401515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            }
4016444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
4017567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4018567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (stop_state != eStateRunning)
4019f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
402015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                if (log)
402115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                    log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
4022f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4023f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
4024f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                return_value = eExecutionSetupError;
4025360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                break;
4026360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
4027360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4028360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (log)
4029f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                log->PutCString ("Resuming succeeded.");
4030f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            // We need to call the function synchronously, so spin waiting for it to return.
4031360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // If we get interrupted while executing, we're going to lose our context, and
4032360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // won't be able to gather the result at this point.
4033360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // We set the timeout AFTER the resume, since the resume takes some time and we
4034f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            // don't want to charge that to the timeout.
4035f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4036f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (single_thread_timeout_usec != 0)
4037f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4038f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                real_timeout = TimeValue::Now();
4039f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (first_timeout)
4040f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec);
4041f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                else
4042567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    real_timeout.OffsetWithSeconds(10);
4043f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4044f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                timeout_ptr = &real_timeout;
4045f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4046b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        }
4047f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        else
4048f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4049f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (log)
4050f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                log->PutCString ("Handled an extra running event.");
4051f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            do_resume = true;
4052f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4053f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4054faf0478359a33b892bc778a52accbac1895725e4Sean Callanan        // Now wait for the process to stop again:
4055d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham        stop_state = lldb::eStateInvalid;
4056f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        event_sp.reset();
4057f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        got_event = listener.WaitForEvent (timeout_ptr, event_sp);
4058f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham
4059f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (got_event)
4060f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4061b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (event_sp.get())
4062f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4063f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                bool keep_going = false;
4064f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4065f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (log)
4066f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    log->Printf("In while loop, got event: %s.", StateAsCString(stop_state));
4067f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4068f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                switch (stop_state)
4069f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                {
4070f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                case lldb::eStateStopped:
4071f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4072b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                        // Yay, we're done.  Now make sure that our thread plan actually completed.
4073f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id);
4074f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        if (!thread_sp)
4075f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4076f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            // Ooh, our thread has vanished.  Unlikely that this was successful execution...
4077f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                            if (log)
4078f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
4079f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            return_value = eExecutionInterrupted;
4080f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4081f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        else
4082f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4083f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
4084f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            StopReason stop_reason = eStopReasonInvalid;
4085f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (stop_info_sp)
4086f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                 stop_reason = stop_info_sp->GetStopReason();
4087f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                            if (stop_reason == eStopReasonPlanComplete)
4088f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            {
4089f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                if (log)
4090f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                    log->PutCString ("Execution completed successfully.");
4091f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                // Now mark this plan as private so it doesn't get reported as the stop reason
4092f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                // after this point.
4093f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                if (thread_plan_sp)
4094f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                    thread_plan_sp->SetPrivate (orig_plan_private);
4095f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                                return_value = eExecutionCompleted;
4096f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            }
4097f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            else
4098f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            {
4099360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                if (log)
4100f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                    log->PutCString ("Thread plan didn't successfully complete.");
4101f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4102f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                                return_value = eExecutionInterrupted;
4103f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                            }
4104f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                        }
4105f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    }
4106f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    break;
4107f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham
4108f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                case lldb::eStateCrashed:
4109f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    if (log)
4110f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                        log->PutCString ("Execution crashed.");
4111f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    return_value = eExecutionInterrupted;
4112f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    break;
4113f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham
4114f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                case lldb::eStateRunning:
4115f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    do_resume = false;
4116f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    keep_going = true;
4117f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                    break;
4118f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham
4119f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                default:
4120f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    if (log)
4121360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state));
4122f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4123360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    errors.Printf ("Execution stopped with unexpected state.");
4124f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    return_value = eExecutionInterrupted;
4125f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4126f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4127f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (keep_going)
4128f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    continue;
4129f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                else
4130f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4131f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4132f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            else
4133f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
41342370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham                if (log)
4135439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    log->PutCString ("got_event was true, but the event pointer was null.  How odd...");
4136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                return_value = eExecutionInterrupted;
4137439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                break;
41382370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham            }
4139439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton        }
41402370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham        else
4141f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham        {
4142439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton            // If we didn't get an event that means we've timed out...
41432370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham            // We will interrupt the process here.  Depending on what we were asked to do we will
41442370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham            // either exit, or try with all threads running for the same timeout.
41452370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham            // Not really sure what to do if Halt fails here...
4146439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton
4147439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton            if (log) {
4148439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                if (try_all_threads)
4149439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                {
4150439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    if (first_timeout)
4151439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                        log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
4152439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                                     "trying with all threads enabled.",
4153f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                                     single_thread_timeout_usec);
4154439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    else
4155439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                        log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
4156439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                                     "and timeout: %d timed out.",
4157439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                                     single_thread_timeout_usec);
4158439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                }
4159439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                else
4160439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
4161439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                                 "halt and abandoning execution.",
4162439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                                 single_thread_timeout_usec);
4163f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham            }
4164439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton
4165439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton            Error halt_error = Halt();
4166439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton            if (halt_error.Success())
41672370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham            {
4168439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                if (log)
4169439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    log->PutCString ("Process::RunThreadPlan(): Halt succeeded.");
4170439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton
4171f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                // If halt succeeds, it always produces a stopped event.  Wait for that:
4172f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4173f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                real_timeout = TimeValue::Now();
4174b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                real_timeout.OffsetWithMicroSeconds(500000);
4175f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4176439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                got_event = listener.WaitForEvent(&real_timeout, event_sp);
4177f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4178f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (got_event)
4179f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                {
4180f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4181439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton                    if (log)
4182f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4183f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
4184f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                        if (stop_state == lldb::eStateStopped
41852370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham                            && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
41862370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham                            log->PutCString ("    Event was the Halt interruption event.");
4187b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    }
4188f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4189f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    if (stop_state == lldb::eStateStopped)
4190f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4191f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        // Between the time we initiated the Halt and the time we delivered it, the process could have
4192f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        // already finished its job.  Check that here:
4193f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4194f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4195f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4196f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4197f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
4198f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                                             "Exiting wait loop.");
4199b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                            return_value = eExecutionCompleted;
4200f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            break;
4201f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4202f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4203f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        if (!try_all_threads)
4204f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4205f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4206f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("try_all_threads was false, we stopped so now we're quitting.");
4207f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            return_value = eExecutionInterrupted;
4208360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            break;
4209f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4210c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson
4211360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (first_timeout)
4212f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4213f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            // Set all the other threads to run, and return to the top of the loop, which will continue;
4214f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            first_timeout = false;
4215f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            thread_plan_sp->SetStopOthers (false);
4216f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4217f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("Process::RunThreadPlan(): About to resume.");
4218f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4219f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            continue;
4220f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4221f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        else
4222360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        {
4223f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            // Running all threads failed, so return Interrupted.
4224f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4225360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                log->PutCString("Process::RunThreadPlan(): running all threads timed out.");
4226c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson                            return_value = eExecutionInterrupted;
4227360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            break;
4228567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        }
4229c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                    }
4230360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                }
4231360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                else
4232f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                {   if (log)
4233360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event.  "
4234f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                "I'm getting out of here passing Interrupted.");
4235f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    return_value = eExecutionInterrupted;
4236f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4237f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4238f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4239f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            else
4240360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
4241360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                // This branch is to work around some problems with gdb-remote's Halt.  It is a little racy, and can return
4242360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                // an error from halt, but if you wait a bit you'll get a stopped event anyway.
4243360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (log)
4244360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    log->Printf ("Process::RunThreadPlan(): halt failed: error = \"%s\", I'm just going to wait a little longer and see if I get a stopped event.",
4245360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                 halt_error.AsCString());
424668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton                real_timeout = TimeValue::Now();
4247f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                real_timeout.OffsetWithMicroSeconds(500000);
4248f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                timeout_ptr = &real_timeout;
4249f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                got_event = listener.WaitForEvent(&real_timeout, event_sp);
4250360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (!got_event || event_sp.get() == NULL)
4251360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                {
4252f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    // This is not going anywhere, bag out.
4253360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (log)
4254f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed.");
4255f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    return_value = eExecutionInterrupted;
4256f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4257567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                }
4258f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                else
4259f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                {
4260f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                    stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4261f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    if (log)
4262b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                        log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event.  Whatever...");
4263f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    if (stop_state == lldb::eStateStopped)
4264f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4265360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        // Between the time we initiated the Halt and the time we delivered it, the process could have
4266f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        // already finished its job.  Check that here:
4267f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4268f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4269f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                        {
4270b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                            if (log)
4271f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
4272f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                             "Exiting wait loop.");
4273360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            return_value = eExecutionCompleted;
4274f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            break;
4275f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4276f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4277f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        if (first_timeout)
4278f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        {
4279f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            // Set all the other threads to run, and return to the top of the loop, which will continue;
4280f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                            first_timeout = false;
4281360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            thread_plan_sp->SetStopOthers (false);
4282f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4283f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("Process::RunThreadPlan(): About to resume.");
4284f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4285f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            continue;
4286f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4287f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        else
4288f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                        {
4289b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                            // Running all threads failed, so return Interrupted.
4290f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            if (log)
4291f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                log->PutCString ("Process::RunThreadPlan(): running all threads timed out.");
4292360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            return_value = eExecutionInterrupted;
4293360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            break;
4294f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        }
4295f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    }
4296f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                    else
4297f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4298b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                        if (log)
4299f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                            log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get"
4300f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                                         " a stopped event, instead got %s.", StateAsCString(stop_state));
4301360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        return_value = eExecutionInterrupted;
4302c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                        break;
4303c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                    }
4304f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4305f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4306c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham
4307f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4308f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4309f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }  // END WAIT LOOP
4310f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4311f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    // If we had to start up a temporary private state thread to run this thread plan, shut it down now.
4312f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread))
4313f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
43146ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham        StopPrivateStateThread();
4315f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        Error error;
4316f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        m_private_state_thread = backup_private_state_thread;
4317f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham        if (stopper_base_plan_sp != NULL)
4318b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        {
4319f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
4320f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4321f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        m_public_state.SetValueNoLock(old_state);
4322f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4323f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }
4324f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4325f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham
4326f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    // Now do some processing on the results of the run:
4327f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (return_value == eExecutionInterrupted)
4328f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
4329f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (log)
4330f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4331567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            StreamString s;
4332f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (event_sp)
4333f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                event_sp->Dump (&s);
4334f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham            else
4335f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4336b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
4337f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4338f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4339f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            StreamString ts;
4340f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4341f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            const char *event_explanation = NULL;
4342f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4343f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            do
4344f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4345f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
4346f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham
4347f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (!event_data)
4348f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                {
4349f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    event_explanation = "<no event data>";
4350f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4351f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4352f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4353f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                Process *process = event_data->GetProcessSP().get();
4354f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham
4355b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (!process)
4356f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                {
4357f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    event_explanation = "<no process>";
4358f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    break;
4359f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4360f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4361ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan                ThreadList &thread_list = process->GetThreadList();
4362ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan
4363ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan                uint32_t num_threads = thread_list.GetSize();
4364b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                uint32_t thread_index;
4365f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4366f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                ts.Printf("<%u threads> ", num_threads);
43676ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham
4368c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                for (thread_index = 0;
4369c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                     thread_index < num_threads;
4370360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                     ++thread_index)
4371360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                {
4372f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
4373f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
43741831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                    if (!thread)
43751831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                    {
43761831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                        ts.Printf("<?> ");
43771831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                        continue;
43781831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                    }
43791831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
4380d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                    ts.Printf("<0x%4.4llx ", thread->GetID());
4381d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                    RegisterContext *register_context = thread->GetRegisterContext().get();
4382d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham
4383d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                    if (register_context)
4384d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                        ts.Printf("[ip 0x%llx] ", register_context->GetPC());
4385d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham                    else
43861831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                        ts.Printf("[ip unknown] ");
43871831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
43881831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                    lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
4389f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    if (stop_info_sp)
4390f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    {
4391f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                        const char *stop_desc = stop_info_sp->GetDescription();
4392360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (stop_desc)
4393360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            ts.PutCString (stop_desc);
4394f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    }
4395f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    ts.Printf(">");
4396f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                }
4397f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4398360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                event_explanation = ts.GetData();
4399f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham            } while (0);
4400f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4401f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (log)
4402f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4403f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (event_explanation)
4404f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                    log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
4405f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                else
4406f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData());
4407f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4408f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4409f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (discard_on_error && thread_plan_sp)
4410f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4411c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham                thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4412f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                thread_plan_sp->SetPrivate (orig_plan_private);
4413f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4414c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham        }
4415f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }
4416f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    else if (return_value == eExecutionSetupError)
4417c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham    {
4418f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (log)
4419f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            log->PutCString("Process::RunThreadPlan(): execution set up error.");
4420f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4421f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (discard_on_error && thread_plan_sp)
4422f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4423f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4424f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            thread_plan_sp->SetPrivate (orig_plan_private);
4425f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4426f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }
4427f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    else
4428f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
4429f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (thread->IsThreadPlanDone (thread_plan_sp.get()))
4430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
4431f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (log)
4432f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                log->PutCString("Process::RunThreadPlan(): thread plan is done");
4433f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            return_value = eExecutionCompleted;
4434360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
4435f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
4436360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
4437f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (log)
4438360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                log->PutCString("Process::RunThreadPlan(): thread plan was discarded");
4439f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            return_value = eExecutionDiscarded;
4440f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4441360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        else
4442360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
4443444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton            if (log)
4444f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course");
4445360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (discard_on_error && thread_plan_sp)
4446f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            {
4447f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                if (log)
4448f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                    log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set.");
4449f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
4450360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                thread_plan_sp->SetPrivate (orig_plan_private);
4451f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            }
4452f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4453c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham    }
4454f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
4455f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    // Thread we ran the function in may have gone away because we ran the target
4456f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    // Check that it's still there, and if it is put it back in the context.  Also restore the
4457c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham    // frame in the context if it is still present.
4458f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
4459c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham    if (thread)
4460f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
4461f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id));
4462f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }
4463360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4464f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    // Also restore the current process'es selected frame & thread, since this function calling may
4465f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham    // be done behind the user's back.
4466f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham
4467f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham    if (selected_tid != LLDB_INVALID_THREAD_ID)
4468f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham    {
4469f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham        if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid())
4470f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham        {
4471f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            // We were able to restore the selected thread, now restore the frame:
4472360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id);
4473360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (old_frame_sp)
4474f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham                GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get());
4475f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham        }
4476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
447721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
4478360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    return return_value;
4479f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham}
4480f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham
4481f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Inghamconst char *
4482f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim InghamProcess::ExecutionResultAsCString (ExecutionResults result)
4483f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham{
4484f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham    const char *result_name;
4485360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4486360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    switch (result)
4487f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
4488f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        case eExecutionCompleted:
4489f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            result_name = "eExecutionCompleted";
4490f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham            break;
4491360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        case eExecutionDiscarded:
4492f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            result_name = "eExecutionDiscarded";
4493f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            break;
4494567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        case eExecutionInterrupted:
449521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            result_name = "eExecutionInterrupted";
4496f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            break;
4497f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        case eExecutionSetupError:
4498f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            result_name = "eExecutionSetupError";
4499f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            break;
4500567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        case eExecutionTimedOut:
4501f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            result_name = "eExecutionTimedOut";
4502f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            break;
4503f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham    }
4504b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    return result_name;
4505f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham}
4506567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
4507f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid
4508f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::GetStatus (Stream &strm)
4509f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham{
4510b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const StateType state = GetState();
4511f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    if (StateIsStoppedState(state, false))
4512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
4513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (state == eStateExited)
4514f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4515f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham            int exit_status = GetExitStatus();
4516f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            const char *exit_description = GetExitDescription();
4517f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            strm.Printf ("Process %llu exited with status = %i (0x%8.8x) %s\n",
4518f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham                          GetID(),
4519f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham                          exit_status,
4520567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                          exit_status,
452121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                          exit_description ? exit_description : "");
4522f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        }
4523f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        else
4524f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        {
4525f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            if (state == eStateConnected)
4526360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                strm.Printf ("Connected to remote target.\n");
45277bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham            else
45287bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham                strm.Printf ("Process %llu %s\n", GetID(), StateAsCString (state));
4529567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
4530567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
45317bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham    else
4532567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
45337bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham        strm.Printf ("Process %llu is running.\n", GetID());
4534360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
4535360f53f3c216ee4fb433da0a367168785328a856Jim Ingham}
4536360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4537360f53f3c216ee4fb433da0a367168785328a856Jim Inghamsize_t
4538360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::GetThreadStatus (Stream &strm,
4539360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                          bool only_threads_with_stop_reason,
4540567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                          uint32_t start_frame,
4541360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                          uint32_t num_frames,
4542360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                          uint32_t num_frames_with_source)
4543567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton{
45447bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham    size_t num_thread_infos_dumped = 0;
4545567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
4546360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    const size_t num_threads = GetThreadList().GetSize();
4547360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    for (uint32_t i = 0; i < num_threads; i++)
4548360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
4549360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        Thread *thread = GetThreadList().GetThreadAtIndex(i).get();
4550360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (thread)
4551360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
4552360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (only_threads_with_stop_reason)
4553360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
4554360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (thread->GetStopInfo().get() == NULL)
4555360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    continue;
4556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
4557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            thread->GetStatus (strm,
4558360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                               start_frame,
4559b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                               num_frames,
4560360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                               num_frames_with_source);
4561360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            ++num_thread_infos_dumped;
4562b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        }
4563360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
4564360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    return num_thread_infos_dumped;
4565b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton}
4566360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4567360f53f3c216ee4fb433da0a367168785328a856Jim Inghamvoid
4568b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonProcess::AddInvalidMemoryRegion (const LoadRange &region)
4569360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{
4570360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
4571b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton}
4572360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
4573360f53f3c216ee4fb433da0a367168785328a856Jim Inghambool
4574360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RemoveInvalidMemoryRange (const LoadRange &region)
4575360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{
4576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize());
4577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham}
4578abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4579abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid
4580abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::AddPreResumeAction (PreResumeActionCallback callback, void *baton)
4581abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4582202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton    m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton));
4583abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4584abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4585abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonbool
4586abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::RunPreResumeActions ()
4587abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4588444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    bool result = true;
4589abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    while (!m_pre_resume_actions.empty())
4590abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    {
4591abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
4592abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        m_pre_resume_actions.pop_back();
4593abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        bool this_result = action.callback (action.baton);
4594abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        if (result == true) result = this_result;
4595abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    }
4596abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    return result;
4597abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4598abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4599444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonvoid
4600abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::ClearPreResumeActions ()
4601abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4602abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    m_pre_resume_actions.clear();
4603abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4604444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
4605abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//--------------------------------------------------------------
4606abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// class Process::SettingsController
4607abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//--------------------------------------------------------------
4608abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4609abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::SettingsController () :
4610abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    UserSettingsController ("process", Target::GetSettingsController())
4611abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4612abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4613abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4614abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::~SettingsController ()
4615abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4616abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4617abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4618abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonlldb::InstanceSettingsSP
4619abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name)
4620abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{
4621abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    lldb::InstanceSettingsSP new_settings_sp (new ProcessInstanceSettings (GetSettingsController(),
4622abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                                                                           false,
4623abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                                                                           instance_name));
4624abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    return new_settings_sp;
4625abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton}
4626abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4627abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//--------------------------------------------------------------
4628abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// class ProcessInstanceSettings
4629abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//--------------------------------------------------------------
4630abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
4631abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcessInstanceSettings::ProcessInstanceSettings
4632abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton(
4633abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    const UserSettingsControllerSP &owner_sp,
4634abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    bool live_instance,
4635abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    const char *name
4636abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton) :
4637abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    InstanceSettings (owner_sp, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance)
4638761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton{
4639761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
4640761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers.
4641761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
4642761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    // This is true for CreateInstanceName() too.
4643761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton
4644761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    if (GetInstanceName () == InstanceSettings::InvalidName())
4645761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    {
4646761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton        ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
4647761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton        owner_sp->RegisterInstanceSettings (this);
4648761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton    }
4649761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton
46501831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    if (live_instance)
46511831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    {
46521831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        const lldb::InstanceSettingsSP &pending_settings = owner_sp->FindPendingSettings (m_instance_name);
46531831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        CopyInstanceSettings (pending_settings,false);
46541831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    }
46551831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham}
46561831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
46571831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) :
46581831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    InstanceSettings (Process::GetSettingsController(), CreateInstanceName().AsCString())
46591831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{
46601831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    if (m_instance_name != InstanceSettings::GetDefaultName())
46611831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    {
46621831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        UserSettingsControllerSP owner_sp (m_owner_wp.lock());
46631831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        if (owner_sp)
46641831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        {
46651831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham            CopyInstanceSettings (owner_sp->FindPendingSettings (m_instance_name), false);
46661831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham            owner_sp->RemovePendingSettings (m_instance_name);
46671831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham        }
46681831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    }
46691831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham}
46701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
46711831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcessInstanceSettings::~ProcessInstanceSettings ()
46721831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{
46731831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham}
46741831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
4675761133029ba2d5bb0c21c3a871dede340b2775fcGreg ClaytonProcessInstanceSettings&
46766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs)
4677d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{
46786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (this != &rhs)
46796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
4680d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton    }
46815bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice
46826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return *this;
46836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
46846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
4685d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
46866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
46876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
46886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const char *index_value,
46896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const char *value,
4690d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton                                                         const ConstString &instance_name,
46916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const SettingEntry &entry,
4692334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                                         VarSetOperationType op,
4693334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                                         Error &err,
4694334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                                         bool pending)
46956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
46966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
46976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
46986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
46996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
47006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                               bool pending)
47016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
4702638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton//    if (new_settings.get() == NULL)
4703638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton//        return;
4704334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton//
4705638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton//    ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get();
4706638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton}
4707638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
4708334d33a19fd28cf41cba74cc61cf149e7101a603Greg Claytonbool
47096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
4710396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice                                                   const ConstString &var_name,
4711396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice                                                   StringList &value,
4712396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice                                                   Error *err)
471375b11a343a035ab426473a785a045f0614af9984Caroline Tice{
4714abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton    if (err)
471575b11a343a035ab426473a785a045f0614af9984Caroline Tice        err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
471675b11a343a035ab426473a785a045f0614af9984Caroline Tice    return false;
471775b11a343a035ab426473a785a045f0614af9984Caroline Tice}
4718334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
471975b11a343a035ab426473a785a045f0614af9984Caroline Ticeconst ConstString
4720abb3302051246273eb92cca203c9a1b9d9736e05Greg ClaytonProcessInstanceSettings::CreateInstanceName ()
4721396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice{
47226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static int instance_count = 1;
4723334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StreamString sstr;
47246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    sstr.Printf ("process_%d", instance_count);
47266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    ++instance_count;
47276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const ConstString ret_val (sstr.GetData());
4729334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    return ret_val;
47306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
47316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
4733334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton// SettingsController Variable Tables
4734334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton//--------------------------------------------------
4735334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
4736334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonSettingEntry
4737334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonProcess::SettingsController::global_settings_table[] =
4738334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton{
47396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",    var-type  ,        "default", enum-table, init'd, hidden, "help-text"},
47406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
47416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
47426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
47456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcess::SettingsController::instance_settings_table[] =
47466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
47476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",       var-type,              "default",       enum-table, init'd, hidden, "help-text"},
47486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL,            eSetVarTypeNone,        NULL,           NULL,       false,  false,  NULL }
47496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
47506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
47546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice