1 //===-- Process.cpp ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/lldb-python.h"
11 
12 #include "lldb/Target/Process.h"
13 
14 #include "lldb/lldb-private-log.h"
15 
16 #include "lldb/Breakpoint/StoppointCallbackContext.h"
17 #include "lldb/Breakpoint/BreakpointLocation.h"
18 #include "lldb/Core/Event.h"
19 #include "lldb/Core/ConnectionFileDescriptor.h"
20 #include "lldb/Core/Debugger.h"
21 #include "lldb/Core/InputReader.h"
22 #include "lldb/Core/Log.h"
23 #include "lldb/Core/Module.h"
24 #include "lldb/Core/PluginManager.h"
25 #include "lldb/Core/State.h"
26 #include "lldb/Expression/ClangUserExpression.h"
27 #include "lldb/Interpreter/CommandInterpreter.h"
28 #include "lldb/Host/Host.h"
29 #include "lldb/Target/ABI.h"
30 #include "lldb/Target/DynamicLoader.h"
31 #include "lldb/Target/OperatingSystem.h"
32 #include "lldb/Target/LanguageRuntime.h"
33 #include "lldb/Target/CPPLanguageRuntime.h"
34 #include "lldb/Target/ObjCLanguageRuntime.h"
35 #include "lldb/Target/Platform.h"
36 #include "lldb/Target/RegisterContext.h"
37 #include "lldb/Target/StopInfo.h"
38 #include "lldb/Target/SystemRuntime.h"
39 #include "lldb/Target/Target.h"
40 #include "lldb/Target/TargetList.h"
41 #include "lldb/Target/Thread.h"
42 #include "lldb/Target/ThreadPlan.h"
43 #include "lldb/Target/ThreadPlanBase.h"
44 
45 #ifndef LLDB_DISABLE_POSIX
46 #include <spawn.h>
47 #endif
48 
49 using namespace lldb;
50 using namespace lldb_private;
51 
52 
53 // Comment out line below to disable memory caching, overriding the process setting
54 // target.process.disable-memory-cache
55 #define ENABLE_MEMORY_CACHING
56 
57 #ifdef ENABLE_MEMORY_CACHING
58 #define DISABLE_MEM_CACHE_DEFAULT false
59 #else
60 #define DISABLE_MEM_CACHE_DEFAULT true
61 #endif
62 
63 class ProcessOptionValueProperties : public OptionValueProperties
64 {
65 public:
66     ProcessOptionValueProperties (const ConstString &name) :
67         OptionValueProperties (name)
68     {
69     }
70 
71     // This constructor is used when creating ProcessOptionValueProperties when it
72     // is part of a new lldb_private::Process instance. It will copy all current
73     // global property values as needed
74     ProcessOptionValueProperties (ProcessProperties *global_properties) :
75         OptionValueProperties(*global_properties->GetValueProperties())
76     {
77     }
78 
79     virtual const Property *
80     GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
81     {
82         // When gettings the value for a key from the process options, we will always
83         // try and grab the setting from the current process if there is one. Else we just
84         // use the one from this instance.
85         if (exe_ctx)
86         {
87             Process *process = exe_ctx->GetProcessPtr();
88             if (process)
89             {
90                 ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get());
91                 if (this != instance_properties)
92                     return instance_properties->ProtectedGetPropertyAtIndex (idx);
93             }
94         }
95         return ProtectedGetPropertyAtIndex (idx);
96     }
97 };
98 
99 static PropertyDefinition
100 g_properties[] =
101 {
102     { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, NULL, NULL, "Disable reading and caching of memory in fixed-size units." },
103     { "extra-startup-command", OptionValue::eTypeArray  , false, OptionValue::eTypeString, NULL, NULL, "A list containing extra commands understood by the particular process plugin used.  "
104                                                                                                        "For instance, to turn on debugserver logging set this to \"QSetLogging:bitmask=LOG_DEFAULT;\"" },
105     { "ignore-breakpoints-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, breakpoints will be ignored during expression evaluation." },
106     { "unwind-on-error-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, errors in expression evaluation will unwind the stack back to the state before the call." },
107     { "python-os-plugin-path", OptionValue::eTypeFileSpec, false, true, NULL, NULL, "A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class." },
108     { "stop-on-sharedlibrary-events" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, stop when a shared library is loaded or unloaded." },
109     { "detach-keeps-stopped" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, detach will attempt to keep the process stopped." },
110     {  NULL                  , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL  }
111 };
112 
113 enum {
114     ePropertyDisableMemCache,
115     ePropertyExtraStartCommand,
116     ePropertyIgnoreBreakpointsInExpressions,
117     ePropertyUnwindOnErrorInExpressions,
118     ePropertyPythonOSPluginPath,
119     ePropertyStopOnSharedLibraryEvents,
120     ePropertyDetachKeepsStopped
121 };
122 
123 ProcessProperties::ProcessProperties (bool is_global) :
124     Properties ()
125 {
126     if (is_global)
127     {
128         m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process")));
129         m_collection_sp->Initialize(g_properties);
130         m_collection_sp->AppendProperty(ConstString("thread"),
131                                         ConstString("Settings specific to threads."),
132                                         true,
133                                         Thread::GetGlobalProperties()->GetValueProperties());
134     }
135     else
136         m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get()));
137 }
138 
139 ProcessProperties::~ProcessProperties()
140 {
141 }
142 
143 bool
144 ProcessProperties::GetDisableMemoryCache() const
145 {
146     const uint32_t idx = ePropertyDisableMemCache;
147     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
148 }
149 
150 Args
151 ProcessProperties::GetExtraStartupCommands () const
152 {
153     Args args;
154     const uint32_t idx = ePropertyExtraStartCommand;
155     m_collection_sp->GetPropertyAtIndexAsArgs(NULL, idx, args);
156     return args;
157 }
158 
159 void
160 ProcessProperties::SetExtraStartupCommands (const Args &args)
161 {
162     const uint32_t idx = ePropertyExtraStartCommand;
163     m_collection_sp->SetPropertyAtIndexFromArgs(NULL, idx, args);
164 }
165 
166 FileSpec
167 ProcessProperties::GetPythonOSPluginPath () const
168 {
169     const uint32_t idx = ePropertyPythonOSPluginPath;
170     return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
171 }
172 
173 void
174 ProcessProperties::SetPythonOSPluginPath (const FileSpec &file)
175 {
176     const uint32_t idx = ePropertyPythonOSPluginPath;
177     m_collection_sp->SetPropertyAtIndexAsFileSpec(NULL, idx, file);
178 }
179 
180 
181 bool
182 ProcessProperties::GetIgnoreBreakpointsInExpressions () const
183 {
184     const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
185     return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
186 }
187 
188 void
189 ProcessProperties::SetIgnoreBreakpointsInExpressions (bool ignore)
190 {
191     const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
192     m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore);
193 }
194 
195 bool
196 ProcessProperties::GetUnwindOnErrorInExpressions () const
197 {
198     const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
199     return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
200 }
201 
202 void
203 ProcessProperties::SetUnwindOnErrorInExpressions (bool ignore)
204 {
205     const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
206     m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore);
207 }
208 
209 bool
210 ProcessProperties::GetStopOnSharedLibraryEvents () const
211 {
212     const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
213     return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
214 }
215 
216 void
217 ProcessProperties::SetStopOnSharedLibraryEvents (bool stop)
218 {
219     const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
220     m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop);
221 }
222 
223 bool
224 ProcessProperties::GetDetachKeepsStopped () const
225 {
226     const uint32_t idx = ePropertyDetachKeepsStopped;
227     return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
228 }
229 
230 void
231 ProcessProperties::SetDetachKeepsStopped (bool stop)
232 {
233     const uint32_t idx = ePropertyDetachKeepsStopped;
234     m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop);
235 }
236 
237 void
238 ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
239 {
240     const char *cstr;
241     if (m_pid != LLDB_INVALID_PROCESS_ID)
242         s.Printf ("    pid = %" PRIu64 "\n", m_pid);
243 
244     if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
245         s.Printf (" parent = %" PRIu64 "\n", m_parent_pid);
246 
247     if (m_executable)
248     {
249         s.Printf ("   name = %s\n", m_executable.GetFilename().GetCString());
250         s.PutCString ("   file = ");
251         m_executable.Dump(&s);
252         s.EOL();
253     }
254     const uint32_t argc = m_arguments.GetArgumentCount();
255     if (argc > 0)
256     {
257         for (uint32_t i=0; i<argc; i++)
258         {
259             const char *arg = m_arguments.GetArgumentAtIndex(i);
260             if (i < 10)
261                 s.Printf (" arg[%u] = %s\n", i, arg);
262             else
263                 s.Printf ("arg[%u] = %s\n", i, arg);
264         }
265     }
266 
267     const uint32_t envc = m_environment.GetArgumentCount();
268     if (envc > 0)
269     {
270         for (uint32_t i=0; i<envc; i++)
271         {
272             const char *env = m_environment.GetArgumentAtIndex(i);
273             if (i < 10)
274                 s.Printf (" env[%u] = %s\n", i, env);
275             else
276                 s.Printf ("env[%u] = %s\n", i, env);
277         }
278     }
279 
280     if (m_arch.IsValid())
281         s.Printf ("   arch = %s\n", m_arch.GetTriple().str().c_str());
282 
283     if (m_uid != UINT32_MAX)
284     {
285         cstr = platform->GetUserName (m_uid);
286         s.Printf ("    uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
287     }
288     if (m_gid != UINT32_MAX)
289     {
290         cstr = platform->GetGroupName (m_gid);
291         s.Printf ("    gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
292     }
293     if (m_euid != UINT32_MAX)
294     {
295         cstr = platform->GetUserName (m_euid);
296         s.Printf ("   euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
297     }
298     if (m_egid != UINT32_MAX)
299     {
300         cstr = platform->GetGroupName (m_egid);
301         s.Printf ("   egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
302     }
303 }
304 
305 void
306 ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
307 {
308     const char *label;
309     if (show_args || verbose)
310         label = "ARGUMENTS";
311     else
312         label = "NAME";
313 
314     if (verbose)
315     {
316         s.Printf     ("PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                   %s\n", label);
317         s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
318     }
319     else
320     {
321         s.Printf     ("PID    PARENT USER       ARCH    %s\n", label);
322         s.PutCString ("====== ====== ========== ======= ============================\n");
323     }
324 }
325 
326 void
327 ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
328 {
329     if (m_pid != LLDB_INVALID_PROCESS_ID)
330     {
331         const char *cstr;
332         s.Printf ("%-6" PRIu64 " %-6" PRIu64 " ", m_pid, m_parent_pid);
333 
334 
335         if (verbose)
336         {
337             cstr = platform->GetUserName (m_uid);
338             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
339                 s.Printf ("%-10s ", cstr);
340             else
341                 s.Printf ("%-10u ", m_uid);
342 
343             cstr = platform->GetGroupName (m_gid);
344             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
345                 s.Printf ("%-10s ", cstr);
346             else
347                 s.Printf ("%-10u ", m_gid);
348 
349             cstr = platform->GetUserName (m_euid);
350             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
351                 s.Printf ("%-10s ", cstr);
352             else
353                 s.Printf ("%-10u ", m_euid);
354 
355             cstr = platform->GetGroupName (m_egid);
356             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
357                 s.Printf ("%-10s ", cstr);
358             else
359                 s.Printf ("%-10u ", m_egid);
360             s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : "");
361         }
362         else
363         {
364             s.Printf ("%-10s %-7d %s ",
365                       platform->GetUserName (m_euid),
366                       (int)m_arch.GetTriple().getArchName().size(),
367                       m_arch.GetTriple().getArchName().data());
368         }
369 
370         if (verbose || show_args)
371         {
372             const uint32_t argc = m_arguments.GetArgumentCount();
373             if (argc > 0)
374             {
375                 for (uint32_t i=0; i<argc; i++)
376                 {
377                     if (i > 0)
378                         s.PutChar (' ');
379                     s.PutCString (m_arguments.GetArgumentAtIndex(i));
380                 }
381             }
382         }
383         else
384         {
385             s.PutCString (GetName());
386         }
387 
388         s.EOL();
389     }
390 }
391 
392 
393 void
394 ProcessInfo::SetArguments (char const **argv, bool first_arg_is_executable)
395 {
396     m_arguments.SetArguments (argv);
397 
398     // Is the first argument the executable?
399     if (first_arg_is_executable)
400     {
401         const char *first_arg = m_arguments.GetArgumentAtIndex (0);
402         if (first_arg)
403         {
404             // Yes the first argument is an executable, set it as the executable
405             // in the launch options. Don't resolve the file path as the path
406             // could be a remote platform path
407             const bool resolve = false;
408             m_executable.SetFile(first_arg, resolve);
409         }
410     }
411 }
412 void
413 ProcessInfo::SetArguments (const Args& args, bool first_arg_is_executable)
414 {
415     // Copy all arguments
416     m_arguments = args;
417 
418     // Is the first argument the executable?
419     if (first_arg_is_executable)
420     {
421         const char *first_arg = m_arguments.GetArgumentAtIndex (0);
422         if (first_arg)
423         {
424             // Yes the first argument is an executable, set it as the executable
425             // in the launch options. Don't resolve the file path as the path
426             // could be a remote platform path
427             const bool resolve = false;
428             m_executable.SetFile(first_arg, resolve);
429         }
430     }
431 }
432 
433 void
434 ProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty)
435 {
436     // If notthing was specified, then check the process for any default
437     // settings that were set with "settings set"
438     if (m_file_actions.empty())
439     {
440         if (m_flags.Test(eLaunchFlagDisableSTDIO))
441         {
442             AppendSuppressFileAction (STDIN_FILENO , true, false);
443             AppendSuppressFileAction (STDOUT_FILENO, false, true);
444             AppendSuppressFileAction (STDERR_FILENO, false, true);
445         }
446         else
447         {
448             // Check for any values that might have gotten set with any of:
449             // (lldb) settings set target.input-path
450             // (lldb) settings set target.output-path
451             // (lldb) settings set target.error-path
452             FileSpec in_path;
453             FileSpec out_path;
454             FileSpec err_path;
455             if (target)
456             {
457                 in_path = target->GetStandardInputPath();
458                 out_path = target->GetStandardOutputPath();
459                 err_path = target->GetStandardErrorPath();
460             }
461 
462             if (in_path || out_path || err_path)
463             {
464                 char path[PATH_MAX];
465                 if (in_path && in_path.GetPath(path, sizeof(path)))
466                     AppendOpenFileAction(STDIN_FILENO, path, true, false);
467 
468                 if (out_path && out_path.GetPath(path, sizeof(path)))
469                     AppendOpenFileAction(STDOUT_FILENO, path, false, true);
470 
471                 if (err_path && err_path.GetPath(path, sizeof(path)))
472                     AppendOpenFileAction(STDERR_FILENO, path, false, true);
473             }
474             else if (default_to_use_pty)
475             {
476                 if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0))
477                 {
478                     const char *slave_path = m_pty.GetSlaveName (NULL, 0);
479                     AppendOpenFileAction(STDIN_FILENO, slave_path, true, false);
480                     AppendOpenFileAction(STDOUT_FILENO, slave_path, false, true);
481                     AppendOpenFileAction(STDERR_FILENO, slave_path, false, true);
482                 }
483             }
484         }
485     }
486 }
487 
488 
489 bool
490 ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error,
491                                                         bool localhost,
492                                                         bool will_debug,
493                                                         bool first_arg_is_full_shell_command,
494                                                         int32_t num_resumes)
495 {
496     error.Clear();
497 
498     if (GetFlags().Test (eLaunchFlagLaunchInShell))
499     {
500         const char *shell_executable = GetShell();
501         if (shell_executable)
502         {
503             char shell_resolved_path[PATH_MAX];
504 
505             if (localhost)
506             {
507                 FileSpec shell_filespec (shell_executable, true);
508 
509                 if (!shell_filespec.Exists())
510                 {
511                     // Resolve the path in case we just got "bash", "sh" or "tcsh"
512                     if (!shell_filespec.ResolveExecutableLocation ())
513                     {
514                         error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable);
515                         return false;
516                     }
517                 }
518                 shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path));
519                 shell_executable = shell_resolved_path;
520             }
521 
522             const char **argv = GetArguments().GetConstArgumentVector ();
523             if (argv == NULL || argv[0] == NULL)
524                 return false;
525             Args shell_arguments;
526             std::string safe_arg;
527             shell_arguments.AppendArgument (shell_executable);
528             shell_arguments.AppendArgument ("-c");
529             StreamString shell_command;
530             if (will_debug)
531             {
532                 // Add a modified PATH environment variable in case argv[0]
533                 // is a relative path
534                 const char *argv0 = argv[0];
535                 if (argv0 && (argv0[0] != '/' && argv0[0] != '~'))
536                 {
537                     // We have a relative path to our executable which may not work if
538                     // we just try to run "a.out" (without it being converted to "./a.out")
539                     const char *working_dir = GetWorkingDirectory();
540                     // Be sure to put quotes around PATH's value in case any paths have spaces...
541                     std::string new_path("PATH=\"");
542                     const size_t empty_path_len = new_path.size();
543 
544                     if (working_dir && working_dir[0])
545                     {
546                         new_path += working_dir;
547                     }
548                     else
549                     {
550                         char current_working_dir[PATH_MAX];
551                         const char *cwd = getcwd(current_working_dir, sizeof(current_working_dir));
552                         if (cwd && cwd[0])
553                             new_path += cwd;
554                     }
555                     const char *curr_path = getenv("PATH");
556                     if (curr_path)
557                     {
558                         if (new_path.size() > empty_path_len)
559                             new_path += ':';
560                         new_path += curr_path;
561                     }
562                     new_path += "\" ";
563                     shell_command.PutCString(new_path.c_str());
564                 }
565 
566                 shell_command.PutCString ("exec");
567 
568                 // Only Apple supports /usr/bin/arch being able to specify the architecture
569                 if (GetArchitecture().IsValid())
570                 {
571                     shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName());
572                     // Set the resume count to 2:
573                     // 1 - stop in shell
574                     // 2 - stop in /usr/bin/arch
575                     // 3 - then we will stop in our program
576                     SetResumeCount(num_resumes + 1);
577                 }
578                 else
579                 {
580                     // Set the resume count to 1:
581                     // 1 - stop in shell
582                     // 2 - then we will stop in our program
583                     SetResumeCount(num_resumes);
584                 }
585             }
586 
587             if (first_arg_is_full_shell_command)
588             {
589                 // There should only be one argument that is the shell command itself to be used as is
590                 if (argv[0] && !argv[1])
591                     shell_command.Printf("%s", argv[0]);
592                 else
593                     return false;
594             }
595             else
596             {
597                 for (size_t i=0; argv[i] != NULL; ++i)
598                 {
599                     const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg);
600                     shell_command.Printf(" %s", arg);
601                 }
602             }
603             shell_arguments.AppendArgument (shell_command.GetString().c_str());
604             m_executable.SetFile(shell_executable, false);
605             m_arguments = shell_arguments;
606             return true;
607         }
608         else
609         {
610             error.SetErrorString ("invalid shell path");
611         }
612     }
613     else
614     {
615         error.SetErrorString ("not launching in shell");
616     }
617     return false;
618 }
619 
620 
621 bool
622 ProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write)
623 {
624     if ((read || write) && fd >= 0 && path && path[0])
625     {
626         m_action = eFileActionOpen;
627         m_fd = fd;
628         if (read && write)
629             m_arg = O_NOCTTY | O_CREAT | O_RDWR;
630         else if (read)
631             m_arg = O_NOCTTY | O_RDONLY;
632         else
633             m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
634         m_path.assign (path);
635         return true;
636     }
637     else
638     {
639         Clear();
640     }
641     return false;
642 }
643 
644 bool
645 ProcessLaunchInfo::FileAction::Close (int fd)
646 {
647     Clear();
648     if (fd >= 0)
649     {
650         m_action = eFileActionClose;
651         m_fd = fd;
652     }
653     return m_fd >= 0;
654 }
655 
656 
657 bool
658 ProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd)
659 {
660     Clear();
661     if (fd >= 0 && dup_fd >= 0)
662     {
663         m_action = eFileActionDuplicate;
664         m_fd = fd;
665         m_arg = dup_fd;
666     }
667     return m_fd >= 0;
668 }
669 
670 
671 
672 #ifndef LLDB_DISABLE_POSIX
673 bool
674 ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (void *_file_actions,
675                                                         const FileAction *info,
676                                                         Log *log,
677                                                         Error& error)
678 {
679     if (info == NULL)
680         return false;
681 
682     posix_spawn_file_actions_t *file_actions = reinterpret_cast<posix_spawn_file_actions_t *>(_file_actions);
683 
684     switch (info->m_action)
685     {
686         case eFileActionNone:
687             error.Clear();
688             break;
689 
690         case eFileActionClose:
691             if (info->m_fd == -1)
692                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)");
693             else
694             {
695                 error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd),
696                                 eErrorTypePOSIX);
697                 if (log && (error.Fail() || log))
698                     error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)",
699                                    file_actions, info->m_fd);
700             }
701             break;
702 
703         case eFileActionDuplicate:
704             if (info->m_fd == -1)
705                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)");
706             else if (info->m_arg == -1)
707                 error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
708             else
709             {
710                 error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg),
711                                 eErrorTypePOSIX);
712                 if (log && (error.Fail() || log))
713                     error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)",
714                                    file_actions, info->m_fd, info->m_arg);
715             }
716             break;
717 
718         case eFileActionOpen:
719             if (info->m_fd == -1)
720                 error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)");
721             else
722             {
723                 int oflag = info->m_arg;
724 
725                 mode_t mode = 0;
726 
727                 if (oflag & O_CREAT)
728                     mode = 0640;
729 
730                 error.SetError (::posix_spawn_file_actions_addopen (file_actions,
731                                                                     info->m_fd,
732                                                                     info->m_path.c_str(),
733                                                                     oflag,
734                                                                     mode),
735                                 eErrorTypePOSIX);
736                 if (error.Fail() || log)
737                     error.PutToLog(log,
738                                    "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)",
739                                    file_actions, info->m_fd, info->m_path.c_str(), oflag, mode);
740             }
741             break;
742     }
743     return error.Success();
744 }
745 #endif
746 
747 Error
748 ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
749 {
750     Error error;
751     const int short_option = m_getopt_table[option_idx].val;
752 
753     switch (short_option)
754     {
755         case 's':   // Stop at program entry point
756             launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
757             break;
758 
759         case 'i':   // STDIN for read only
760             {
761                 ProcessLaunchInfo::FileAction action;
762                 if (action.Open (STDIN_FILENO, option_arg, true, false))
763                     launch_info.AppendFileAction (action);
764             }
765             break;
766 
767         case 'o':   // Open STDOUT for write only
768             {
769                 ProcessLaunchInfo::FileAction action;
770                 if (action.Open (STDOUT_FILENO, option_arg, false, true))
771                     launch_info.AppendFileAction (action);
772             }
773             break;
774 
775         case 'e':   // STDERR for write only
776             {
777                 ProcessLaunchInfo::FileAction action;
778                 if (action.Open (STDERR_FILENO, option_arg, false, true))
779                     launch_info.AppendFileAction (action);
780             }
781             break;
782 
783 
784         case 'p':   // Process plug-in name
785             launch_info.SetProcessPluginName (option_arg);
786             break;
787 
788         case 'n':   // Disable STDIO
789             {
790                 ProcessLaunchInfo::FileAction action;
791                 if (action.Open (STDIN_FILENO, "/dev/null", true, false))
792                     launch_info.AppendFileAction (action);
793                 if (action.Open (STDOUT_FILENO, "/dev/null", false, true))
794                     launch_info.AppendFileAction (action);
795                 if (action.Open (STDERR_FILENO, "/dev/null", false, true))
796                     launch_info.AppendFileAction (action);
797             }
798             break;
799 
800         case 'w':
801             launch_info.SetWorkingDirectory (option_arg);
802             break;
803 
804         case 't':   // Open process in new terminal window
805             launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
806             break;
807 
808         case 'a':
809             if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get()))
810                 launch_info.GetArchitecture().SetTriple (option_arg);
811             break;
812 
813         case 'A':
814             launch_info.GetFlags().Set (eLaunchFlagDisableASLR);
815             break;
816 
817         case 'c':
818             if (option_arg && option_arg[0])
819                 launch_info.SetShell (option_arg);
820             else
821                 launch_info.SetShell (LLDB_DEFAULT_SHELL);
822             break;
823 
824         case 'v':
825             launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
826             break;
827 
828         default:
829             error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option);
830             break;
831 
832     }
833     return error;
834 }
835 
836 OptionDefinition
837 ProcessLaunchCommandOptions::g_option_table[] =
838 {
839 { LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', OptionParser::eNoArgument,       NULL, 0, eArgTypeNone,          "Stop at the entry point of the program when launching a process."},
840 { LLDB_OPT_SET_ALL, false, "disable-aslr",  'A', OptionParser::eNoArgument,       NULL, 0, eArgTypeNone,          "Disable address space layout randomization when launching a process."},
841 { LLDB_OPT_SET_ALL, false, "plugin",        'p', OptionParser::eRequiredArgument, NULL, 0, eArgTypePlugin,        "Name of the process plugin you want to use."},
842 { LLDB_OPT_SET_ALL, false, "working-dir",   'w', OptionParser::eRequiredArgument, NULL, 0, eArgTypeDirectoryName,          "Set the current working directory to <path> when running the inferior."},
843 { LLDB_OPT_SET_ALL, false, "arch",          'a', OptionParser::eRequiredArgument, NULL, 0, eArgTypeArchitecture,  "Set the architecture for the process to launch when ambiguous."},
844 { LLDB_OPT_SET_ALL, false, "environment",   'v', OptionParser::eRequiredArgument, NULL, 0, eArgTypeNone,          "Specify an environment variable name/value string (--environment NAME=VALUE). Can be specified multiple times for subsequent environment entries."},
845 { LLDB_OPT_SET_ALL, false, "shell",         'c', OptionParser::eOptionalArgument, NULL, 0, eArgTypeFilename,          "Run the process in a shell (not supported on all platforms)."},
846 
847 { LLDB_OPT_SET_1  , false, "stdin",         'i', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename,    "Redirect stdin for the process to <filename>."},
848 { LLDB_OPT_SET_1  , false, "stdout",        'o', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename,    "Redirect stdout for the process to <filename>."},
849 { LLDB_OPT_SET_1  , false, "stderr",        'e', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename,    "Redirect stderr for the process to <filename>."},
850 
851 { LLDB_OPT_SET_2  , false, "tty",           't', OptionParser::eNoArgument,       NULL, 0, eArgTypeNone,    "Start the process in a terminal (not supported on all platforms)."},
852 
853 { LLDB_OPT_SET_3  , false, "no-stdio",      'n', OptionParser::eNoArgument,       NULL, 0, eArgTypeNone,    "Do not set up for terminal I/O to go to running process."},
854 
855 { 0               , false, NULL,             0,  0,                 NULL, 0, eArgTypeNone,    NULL }
856 };
857 
858 
859 
860 bool
861 ProcessInstanceInfoMatch::NameMatches (const char *process_name) const
862 {
863     if (m_name_match_type == eNameMatchIgnore || process_name == NULL)
864         return true;
865     const char *match_name = m_match_info.GetName();
866     if (!match_name)
867         return true;
868 
869     return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
870 }
871 
872 bool
873 ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
874 {
875     if (!NameMatches (proc_info.GetName()))
876         return false;
877 
878     if (m_match_info.ProcessIDIsValid() &&
879         m_match_info.GetProcessID() != proc_info.GetProcessID())
880         return false;
881 
882     if (m_match_info.ParentProcessIDIsValid() &&
883         m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
884         return false;
885 
886     if (m_match_info.UserIDIsValid () &&
887         m_match_info.GetUserID() != proc_info.GetUserID())
888         return false;
889 
890     if (m_match_info.GroupIDIsValid () &&
891         m_match_info.GetGroupID() != proc_info.GetGroupID())
892         return false;
893 
894     if (m_match_info.EffectiveUserIDIsValid () &&
895         m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
896         return false;
897 
898     if (m_match_info.EffectiveGroupIDIsValid () &&
899         m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
900         return false;
901 
902     if (m_match_info.GetArchitecture().IsValid() &&
903         !m_match_info.GetArchitecture().IsCompatibleMatch(proc_info.GetArchitecture()))
904         return false;
905     return true;
906 }
907 
908 bool
909 ProcessInstanceInfoMatch::MatchAllProcesses () const
910 {
911     if (m_name_match_type != eNameMatchIgnore)
912         return false;
913 
914     if (m_match_info.ProcessIDIsValid())
915         return false;
916 
917     if (m_match_info.ParentProcessIDIsValid())
918         return false;
919 
920     if (m_match_info.UserIDIsValid ())
921         return false;
922 
923     if (m_match_info.GroupIDIsValid ())
924         return false;
925 
926     if (m_match_info.EffectiveUserIDIsValid ())
927         return false;
928 
929     if (m_match_info.EffectiveGroupIDIsValid ())
930         return false;
931 
932     if (m_match_info.GetArchitecture().IsValid())
933         return false;
934 
935     if (m_match_all_users)
936         return false;
937 
938     return true;
939 
940 }
941 
942 void
943 ProcessInstanceInfoMatch::Clear()
944 {
945     m_match_info.Clear();
946     m_name_match_type = eNameMatchIgnore;
947     m_match_all_users = false;
948 }
949 
950 ProcessSP
951 Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path)
952 {
953     static uint32_t g_process_unique_id = 0;
954 
955     ProcessSP process_sp;
956     ProcessCreateInstance create_callback = NULL;
957     if (plugin_name)
958     {
959         ConstString const_plugin_name(plugin_name);
960         create_callback  = PluginManager::GetProcessCreateCallbackForPluginName (const_plugin_name);
961         if (create_callback)
962         {
963             process_sp = create_callback(target, listener, crash_file_path);
964             if (process_sp)
965             {
966                 if (process_sp->CanDebug(target, true))
967                 {
968                     process_sp->m_process_unique_id = ++g_process_unique_id;
969                 }
970                 else
971                     process_sp.reset();
972             }
973         }
974     }
975     else
976     {
977         for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
978         {
979             process_sp = create_callback(target, listener, crash_file_path);
980             if (process_sp)
981             {
982                 if (process_sp->CanDebug(target, false))
983                 {
984                     process_sp->m_process_unique_id = ++g_process_unique_id;
985                     break;
986                 }
987                 else
988                     process_sp.reset();
989             }
990         }
991     }
992     return process_sp;
993 }
994 
995 ConstString &
996 Process::GetStaticBroadcasterClass ()
997 {
998     static ConstString class_name ("lldb.process");
999     return class_name;
1000 }
1001 
1002 //----------------------------------------------------------------------
1003 // Process constructor
1004 //----------------------------------------------------------------------
1005 Process::Process(Target &target, Listener &listener) :
1006     ProcessProperties (false),
1007     UserID (LLDB_INVALID_PROCESS_ID),
1008     Broadcaster (&(target.GetDebugger()), "lldb.process"),
1009     m_target (target),
1010     m_public_state (eStateUnloaded),
1011     m_private_state (eStateUnloaded),
1012     m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"),
1013     m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"),
1014     m_private_state_listener ("lldb.process.internal_state_listener"),
1015     m_private_state_control_wait(),
1016     m_private_state_thread (LLDB_INVALID_HOST_THREAD),
1017     m_mod_id (),
1018     m_process_unique_id(0),
1019     m_thread_index_id (0),
1020     m_queue_index_id (0),
1021     m_thread_id_to_index_id_map (),
1022     m_queue_id_to_index_id_map (),
1023     m_exit_status (-1),
1024     m_exit_string (),
1025     m_thread_mutex (Mutex::eMutexTypeRecursive),
1026     m_thread_list_real (this),
1027     m_thread_list (this),
1028     m_extended_thread_list (this),
1029     m_extended_thread_stop_id (0),
1030     m_queue_list (this),
1031     m_queue_list_stop_id (0),
1032     m_notifications (),
1033     m_image_tokens (),
1034     m_listener (listener),
1035     m_breakpoint_site_list (),
1036     m_dynamic_checkers_ap (),
1037     m_unix_signals (),
1038     m_abi_sp (),
1039     m_process_input_reader (),
1040     m_stdio_communication ("process.stdio"),
1041     m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
1042     m_stdout_data (),
1043     m_stderr_data (),
1044     m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive),
1045     m_profile_data (),
1046     m_memory_cache (*this),
1047     m_allocated_memory_cache (*this),
1048     m_should_detach (false),
1049     m_next_event_action_ap(),
1050     m_public_run_lock (),
1051     m_private_run_lock (),
1052     m_currently_handling_event(false),
1053     m_finalize_called(false),
1054     m_clear_thread_plans_on_stop (false),
1055     m_last_broadcast_state (eStateInvalid),
1056     m_destroy_in_process (false),
1057     m_can_jit(eCanJITDontKnow)
1058 {
1059     CheckInWithManager ();
1060 
1061     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
1062     if (log)
1063         log->Printf ("%p Process::Process()", this);
1064 
1065     SetEventName (eBroadcastBitStateChanged, "state-changed");
1066     SetEventName (eBroadcastBitInterrupt, "interrupt");
1067     SetEventName (eBroadcastBitSTDOUT, "stdout-available");
1068     SetEventName (eBroadcastBitSTDERR, "stderr-available");
1069     SetEventName (eBroadcastBitProfileData, "profile-data-available");
1070 
1071     m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop  , "control-stop"  );
1072     m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" );
1073     m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlResume, "control-resume");
1074 
1075     listener.StartListeningForEvents (this,
1076                                       eBroadcastBitStateChanged |
1077                                       eBroadcastBitInterrupt |
1078                                       eBroadcastBitSTDOUT |
1079                                       eBroadcastBitSTDERR |
1080                                       eBroadcastBitProfileData);
1081 
1082     m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
1083                                                      eBroadcastBitStateChanged |
1084                                                      eBroadcastBitInterrupt);
1085 
1086     m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
1087                                                      eBroadcastInternalStateControlStop |
1088                                                      eBroadcastInternalStateControlPause |
1089                                                      eBroadcastInternalStateControlResume);
1090 }
1091 
1092 //----------------------------------------------------------------------
1093 // Destructor
1094 //----------------------------------------------------------------------
1095 Process::~Process()
1096 {
1097     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
1098     if (log)
1099         log->Printf ("%p Process::~Process()", this);
1100     StopPrivateStateThread();
1101 }
1102 
1103 const ProcessPropertiesSP &
1104 Process::GetGlobalProperties()
1105 {
1106     static ProcessPropertiesSP g_settings_sp;
1107     if (!g_settings_sp)
1108         g_settings_sp.reset (new ProcessProperties (true));
1109     return g_settings_sp;
1110 }
1111 
1112 void
1113 Process::Finalize()
1114 {
1115     switch (GetPrivateState())
1116     {
1117         case eStateConnected:
1118         case eStateAttaching:
1119         case eStateLaunching:
1120         case eStateStopped:
1121         case eStateRunning:
1122         case eStateStepping:
1123         case eStateCrashed:
1124         case eStateSuspended:
1125             if (GetShouldDetach())
1126             {
1127                 // FIXME: This will have to be a process setting:
1128                 bool keep_stopped = false;
1129                 Detach(keep_stopped);
1130             }
1131             else
1132                 Destroy();
1133             break;
1134 
1135         case eStateInvalid:
1136         case eStateUnloaded:
1137         case eStateDetached:
1138         case eStateExited:
1139             break;
1140     }
1141 
1142     // Clear our broadcaster before we proceed with destroying
1143     Broadcaster::Clear();
1144 
1145     // Do any cleanup needed prior to being destructed... Subclasses
1146     // that override this method should call this superclass method as well.
1147 
1148     // We need to destroy the loader before the derived Process class gets destroyed
1149     // since it is very likely that undoing the loader will require access to the real process.
1150     m_dynamic_checkers_ap.reset();
1151     m_abi_sp.reset();
1152     m_os_ap.reset();
1153     m_system_runtime_ap.reset();
1154     m_dyld_ap.reset();
1155     m_thread_list_real.Destroy();
1156     m_thread_list.Destroy();
1157     m_extended_thread_list.Destroy();
1158     m_queue_list.Clear();
1159     m_queue_list_stop_id = 0;
1160     std::vector<Notifications> empty_notifications;
1161     m_notifications.swap(empty_notifications);
1162     m_image_tokens.clear();
1163     m_memory_cache.Clear();
1164     m_allocated_memory_cache.Clear();
1165     m_language_runtimes.clear();
1166     m_next_event_action_ap.reset();
1167 //#ifdef LLDB_CONFIGURATION_DEBUG
1168 //    StreamFile s(stdout, false);
1169 //    EventSP event_sp;
1170 //    while (m_private_state_listener.GetNextEvent(event_sp))
1171 //    {
1172 //        event_sp->Dump (&s);
1173 //        s.EOL();
1174 //    }
1175 //#endif
1176     // We have to be very careful here as the m_private_state_listener might
1177     // contain events that have ProcessSP values in them which can keep this
1178     // process around forever. These events need to be cleared out.
1179     m_private_state_listener.Clear();
1180     m_public_run_lock.TrySetRunning(); // This will do nothing if already locked
1181     m_public_run_lock.SetStopped();
1182     m_private_run_lock.TrySetRunning(); // This will do nothing if already locked
1183     m_private_run_lock.SetStopped();
1184     m_finalize_called = true;
1185 }
1186 
1187 void
1188 Process::RegisterNotificationCallbacks (const Notifications& callbacks)
1189 {
1190     m_notifications.push_back(callbacks);
1191     if (callbacks.initialize != NULL)
1192         callbacks.initialize (callbacks.baton, this);
1193 }
1194 
1195 bool
1196 Process::UnregisterNotificationCallbacks(const Notifications& callbacks)
1197 {
1198     std::vector<Notifications>::iterator pos, end = m_notifications.end();
1199     for (pos = m_notifications.begin(); pos != end; ++pos)
1200     {
1201         if (pos->baton == callbacks.baton &&
1202             pos->initialize == callbacks.initialize &&
1203             pos->process_state_changed == callbacks.process_state_changed)
1204         {
1205             m_notifications.erase(pos);
1206             return true;
1207         }
1208     }
1209     return false;
1210 }
1211 
1212 void
1213 Process::SynchronouslyNotifyStateChanged (StateType state)
1214 {
1215     std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
1216     for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
1217     {
1218         if (notification_pos->process_state_changed)
1219             notification_pos->process_state_changed (notification_pos->baton, this, state);
1220     }
1221 }
1222 
1223 // FIXME: We need to do some work on events before the general Listener sees them.
1224 // For instance if we are continuing from a breakpoint, we need to ensure that we do
1225 // the little "insert real insn, step & stop" trick.  But we can't do that when the
1226 // event is delivered by the broadcaster - since that is done on the thread that is
1227 // waiting for new events, so if we needed more than one event for our handling, we would
1228 // stall.  So instead we do it when we fetch the event off of the queue.
1229 //
1230 
1231 StateType
1232 Process::GetNextEvent (EventSP &event_sp)
1233 {
1234     StateType state = eStateInvalid;
1235 
1236     if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
1237         state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
1238 
1239     return state;
1240 }
1241 
1242 
1243 StateType
1244 Process::WaitForProcessToStop (const TimeValue *timeout, lldb::EventSP *event_sp_ptr, bool wait_always)
1245 {
1246     // We can't just wait for a "stopped" event, because the stopped event may have restarted the target.
1247     // We have to actually check each event, and in the case of a stopped event check the restarted flag
1248     // on the event.
1249     if (event_sp_ptr)
1250         event_sp_ptr->reset();
1251     StateType state = GetState();
1252     // If we are exited or detached, we won't ever get back to any
1253     // other valid state...
1254     if (state == eStateDetached || state == eStateExited)
1255         return state;
1256 
1257     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1258     if (log)
1259         log->Printf ("Process::%s (timeout = %p)", __FUNCTION__, timeout);
1260 
1261     if (!wait_always &&
1262         StateIsStoppedState(state, true) &&
1263         StateIsStoppedState(GetPrivateState(), true)) {
1264         if (log)
1265             log->Printf("Process::%s returning without waiting for events; process private and public states are already 'stopped'.",
1266                         __FUNCTION__);
1267         return state;
1268     }
1269 
1270     while (state != eStateInvalid)
1271     {
1272         EventSP event_sp;
1273         state = WaitForStateChangedEvents (timeout, event_sp);
1274         if (event_sp_ptr && event_sp)
1275             *event_sp_ptr = event_sp;
1276 
1277         switch (state)
1278         {
1279         case eStateCrashed:
1280         case eStateDetached:
1281         case eStateExited:
1282         case eStateUnloaded:
1283             return state;
1284         case eStateStopped:
1285             if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
1286                 continue;
1287             else
1288                 return state;
1289         default:
1290             continue;
1291         }
1292     }
1293     return state;
1294 }
1295 
1296 
1297 StateType
1298 Process::WaitForState
1299 (
1300     const TimeValue *timeout,
1301     const StateType *match_states, const uint32_t num_match_states
1302 )
1303 {
1304     EventSP event_sp;
1305     uint32_t i;
1306     StateType state = GetState();
1307     while (state != eStateInvalid)
1308     {
1309         // If we are exited or detached, we won't ever get back to any
1310         // other valid state...
1311         if (state == eStateDetached || state == eStateExited)
1312             return state;
1313 
1314         state = WaitForStateChangedEvents (timeout, event_sp);
1315 
1316         for (i=0; i<num_match_states; ++i)
1317         {
1318             if (match_states[i] == state)
1319                 return state;
1320         }
1321     }
1322     return state;
1323 }
1324 
1325 bool
1326 Process::HijackProcessEvents (Listener *listener)
1327 {
1328     if (listener != NULL)
1329     {
1330         return HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
1331     }
1332     else
1333         return false;
1334 }
1335 
1336 void
1337 Process::RestoreProcessEvents ()
1338 {
1339     RestoreBroadcaster();
1340 }
1341 
1342 bool
1343 Process::HijackPrivateProcessEvents (Listener *listener)
1344 {
1345     if (listener != NULL)
1346     {
1347         return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
1348     }
1349     else
1350         return false;
1351 }
1352 
1353 void
1354 Process::RestorePrivateProcessEvents ()
1355 {
1356     m_private_state_broadcaster.RestoreBroadcaster();
1357 }
1358 
1359 StateType
1360 Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
1361 {
1362     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1363 
1364     if (log)
1365         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1366 
1367     StateType state = eStateInvalid;
1368     if (m_listener.WaitForEventForBroadcasterWithType (timeout,
1369                                                        this,
1370                                                        eBroadcastBitStateChanged | eBroadcastBitInterrupt,
1371                                                        event_sp))
1372     {
1373         if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1374             state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1375         else if (log)
1376             log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__);
1377     }
1378 
1379     if (log)
1380         log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
1381                      __FUNCTION__,
1382                      timeout,
1383                      StateAsCString(state));
1384     return state;
1385 }
1386 
1387 Event *
1388 Process::PeekAtStateChangedEvents ()
1389 {
1390     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1391 
1392     if (log)
1393         log->Printf ("Process::%s...", __FUNCTION__);
1394 
1395     Event *event_ptr;
1396     event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
1397                                                                   eBroadcastBitStateChanged);
1398     if (log)
1399     {
1400         if (event_ptr)
1401         {
1402             log->Printf ("Process::%s (event_ptr) => %s",
1403                          __FUNCTION__,
1404                          StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
1405         }
1406         else
1407         {
1408             log->Printf ("Process::%s no events found",
1409                          __FUNCTION__);
1410         }
1411     }
1412     return event_ptr;
1413 }
1414 
1415 StateType
1416 Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
1417 {
1418     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1419 
1420     if (log)
1421         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1422 
1423     StateType state = eStateInvalid;
1424     if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout,
1425                                                                      &m_private_state_broadcaster,
1426                                                                      eBroadcastBitStateChanged | eBroadcastBitInterrupt,
1427                                                                      event_sp))
1428         if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1429             state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1430 
1431     // This is a bit of a hack, but when we wait here we could very well return
1432     // to the command-line, and that could disable the log, which would render the
1433     // log we got above invalid.
1434     if (log)
1435     {
1436         if (state == eStateInvalid)
1437             log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout);
1438         else
1439             log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
1440     }
1441     return state;
1442 }
1443 
1444 bool
1445 Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
1446 {
1447     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1448 
1449     if (log)
1450         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1451 
1452     if (control_only)
1453         return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
1454     else
1455         return m_private_state_listener.WaitForEvent(timeout, event_sp);
1456 }
1457 
1458 bool
1459 Process::IsRunning () const
1460 {
1461     return StateIsRunningState (m_public_state.GetValue());
1462 }
1463 
1464 int
1465 Process::GetExitStatus ()
1466 {
1467     if (m_public_state.GetValue() == eStateExited)
1468         return m_exit_status;
1469     return -1;
1470 }
1471 
1472 
1473 const char *
1474 Process::GetExitDescription ()
1475 {
1476     if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
1477         return m_exit_string.c_str();
1478     return NULL;
1479 }
1480 
1481 bool
1482 Process::SetExitStatus (int status, const char *cstr)
1483 {
1484     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1485     if (log)
1486         log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
1487                     status, status,
1488                     cstr ? "\"" : "",
1489                     cstr ? cstr : "NULL",
1490                     cstr ? "\"" : "");
1491 
1492     // We were already in the exited state
1493     if (m_private_state.GetValue() == eStateExited)
1494     {
1495         if (log)
1496             log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
1497         return false;
1498     }
1499 
1500     m_exit_status = status;
1501     if (cstr)
1502         m_exit_string = cstr;
1503     else
1504         m_exit_string.clear();
1505 
1506     DidExit ();
1507 
1508     SetPrivateState (eStateExited);
1509     return true;
1510 }
1511 
1512 // This static callback can be used to watch for local child processes on
1513 // the current host. The the child process exits, the process will be
1514 // found in the global target list (we want to be completely sure that the
1515 // lldb_private::Process doesn't go away before we can deliver the signal.
1516 bool
1517 Process::SetProcessExitStatus (void *callback_baton,
1518                                lldb::pid_t pid,
1519                                bool exited,
1520                                int signo,          // Zero for no signal
1521                                int exit_status     // Exit value of process if signal is zero
1522 )
1523 {
1524     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
1525     if (log)
1526         log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%" PRIu64 ", exited=%i, signal=%i, exit_status=%i)\n",
1527                      callback_baton,
1528                      pid,
1529                      exited,
1530                      signo,
1531                      exit_status);
1532 
1533     if (exited)
1534     {
1535         TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
1536         if (target_sp)
1537         {
1538             ProcessSP process_sp (target_sp->GetProcessSP());
1539             if (process_sp)
1540             {
1541                 const char *signal_cstr = NULL;
1542                 if (signo)
1543                     signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
1544 
1545                 process_sp->SetExitStatus (exit_status, signal_cstr);
1546             }
1547         }
1548         return true;
1549     }
1550     return false;
1551 }
1552 
1553 
1554 void
1555 Process::UpdateThreadListIfNeeded ()
1556 {
1557     const uint32_t stop_id = GetStopID();
1558     if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
1559     {
1560         const StateType state = GetPrivateState();
1561         if (StateIsStoppedState (state, true))
1562         {
1563             Mutex::Locker locker (m_thread_list.GetMutex ());
1564             // m_thread_list does have its own mutex, but we need to
1565             // hold onto the mutex between the call to UpdateThreadList(...)
1566             // and the os->UpdateThreadList(...) so it doesn't change on us
1567             ThreadList &old_thread_list = m_thread_list;
1568             ThreadList real_thread_list(this);
1569             ThreadList new_thread_list(this);
1570             // Always update the thread list with the protocol specific
1571             // thread list, but only update if "true" is returned
1572             if (UpdateThreadList (m_thread_list_real, real_thread_list))
1573             {
1574                 // Don't call into the OperatingSystem to update the thread list if we are shutting down, since
1575                 // that may call back into the SBAPI's, requiring the API lock which is already held by whoever is
1576                 // shutting us down, causing a deadlock.
1577                 if (!m_destroy_in_process)
1578                 {
1579                     OperatingSystem *os = GetOperatingSystem ();
1580                     if (os)
1581                     {
1582                         // Clear any old backing threads where memory threads might have been
1583                         // backed by actual threads from the lldb_private::Process subclass
1584                         size_t num_old_threads = old_thread_list.GetSize(false);
1585                         for (size_t i=0; i<num_old_threads; ++i)
1586                             old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread();
1587 
1588                         // Now let the OperatingSystem plug-in update the thread list
1589                         os->UpdateThreadList (old_thread_list,  // Old list full of threads created by OS plug-in
1590                                               real_thread_list, // The actual thread list full of threads created by each lldb_private::Process subclass
1591                                               new_thread_list); // The new thread list that we will show to the user that gets filled in
1592                     }
1593                     else
1594                     {
1595                         // No OS plug-in, the new thread list is the same as the real thread list
1596                         new_thread_list = real_thread_list;
1597                     }
1598                 }
1599 
1600                 m_thread_list_real.Update(real_thread_list);
1601                 m_thread_list.Update (new_thread_list);
1602                 m_thread_list.SetStopID (stop_id);
1603 
1604                 if (GetLastNaturalStopID () != m_extended_thread_stop_id)
1605                 {
1606                     // Clear any extended threads that we may have accumulated previously
1607                     m_extended_thread_list.Clear();
1608                     m_extended_thread_stop_id = GetLastNaturalStopID ();
1609 
1610                     m_queue_list.Clear();
1611                     m_queue_list_stop_id = GetLastNaturalStopID ();
1612                 }
1613             }
1614         }
1615     }
1616 }
1617 
1618 void
1619 Process::UpdateQueueListIfNeeded ()
1620 {
1621     if (m_system_runtime_ap.get())
1622     {
1623         if (m_queue_list.GetSize() == 0 || m_queue_list_stop_id != GetLastNaturalStopID())
1624         {
1625             const StateType state = GetPrivateState();
1626             if (StateIsStoppedState (state, true))
1627             {
1628                 m_system_runtime_ap->PopulateQueueList (m_queue_list);
1629                 m_queue_list_stop_id = GetLastNaturalStopID();
1630             }
1631         }
1632     }
1633 }
1634 
1635 ThreadSP
1636 Process::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
1637 {
1638     OperatingSystem *os = GetOperatingSystem ();
1639     if (os)
1640         return os->CreateThread(tid, context);
1641     return ThreadSP();
1642 }
1643 
1644 uint32_t
1645 Process::GetNextThreadIndexID (uint64_t thread_id)
1646 {
1647     return AssignIndexIDToThread(thread_id);
1648 }
1649 
1650 bool
1651 Process::HasAssignedIndexIDToThread(uint64_t thread_id)
1652 {
1653     std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id);
1654     if (iterator == m_thread_id_to_index_id_map.end())
1655     {
1656         return false;
1657     }
1658     else
1659     {
1660         return true;
1661     }
1662 }
1663 
1664 uint32_t
1665 Process::AssignIndexIDToThread(uint64_t thread_id)
1666 {
1667     uint32_t result = 0;
1668     std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id);
1669     if (iterator == m_thread_id_to_index_id_map.end())
1670     {
1671         result = ++m_thread_index_id;
1672         m_thread_id_to_index_id_map[thread_id] = result;
1673     }
1674     else
1675     {
1676         result = iterator->second;
1677     }
1678 
1679     return result;
1680 }
1681 
1682 bool
1683 Process::HasAssignedIndexIDToQueue(queue_id_t queue_id)
1684 {
1685     std::map<uint64_t, uint32_t>::iterator iterator = m_queue_id_to_index_id_map.find(queue_id);
1686     if (iterator == m_queue_id_to_index_id_map.end())
1687     {
1688         return false;
1689     }
1690     else
1691     {
1692         return true;
1693     }
1694 }
1695 
1696 uint32_t
1697 Process::AssignIndexIDToQueue(queue_id_t queue_id)
1698 {
1699     uint32_t result = 0;
1700     std::map<uint64_t, uint32_t>::iterator iterator = m_queue_id_to_index_id_map.find(queue_id);
1701     if (iterator == m_queue_id_to_index_id_map.end())
1702     {
1703         result = ++m_queue_index_id;
1704         m_queue_id_to_index_id_map[queue_id] = result;
1705     }
1706     else
1707     {
1708         result = iterator->second;
1709     }
1710 
1711     return result;
1712 }
1713 
1714 
1715 StateType
1716 Process::GetState()
1717 {
1718     // If any other threads access this we will need a mutex for it
1719     return m_public_state.GetValue ();
1720 }
1721 
1722 void
1723 Process::SetPublicState (StateType new_state, bool restarted)
1724 {
1725     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1726     if (log)
1727         log->Printf("Process::SetPublicState (state = %s, restarted = %i)", StateAsCString(new_state), restarted);
1728     const StateType old_state = m_public_state.GetValue();
1729     m_public_state.SetValue (new_state);
1730 
1731     // On the transition from Run to Stopped, we unlock the writer end of the
1732     // run lock.  The lock gets locked in Resume, which is the public API
1733     // to tell the program to run.
1734     if (!IsHijackedForEvent(eBroadcastBitStateChanged))
1735     {
1736         if (new_state == eStateDetached)
1737         {
1738             if (log)
1739                 log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state));
1740             m_public_run_lock.SetStopped();
1741         }
1742         else
1743         {
1744             const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1745             const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1746             if ((old_state_is_stopped != new_state_is_stopped))
1747             {
1748                 if (new_state_is_stopped && !restarted)
1749                 {
1750                     if (log)
1751                         log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state));
1752                     m_public_run_lock.SetStopped();
1753                 }
1754             }
1755         }
1756     }
1757 }
1758 
1759 Error
1760 Process::Resume ()
1761 {
1762     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1763     if (log)
1764         log->Printf("Process::Resume -- locking run lock");
1765     if (!m_public_run_lock.TrySetRunning())
1766     {
1767         Error error("Resume request failed - process still running.");
1768         if (log)
1769             log->Printf ("Process::Resume: -- TrySetRunning failed, not resuming.");
1770         return error;
1771     }
1772     return PrivateResume();
1773 }
1774 
1775 StateType
1776 Process::GetPrivateState ()
1777 {
1778     return m_private_state.GetValue();
1779 }
1780 
1781 void
1782 Process::SetPrivateState (StateType new_state)
1783 {
1784     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1785     bool state_changed = false;
1786 
1787     if (log)
1788         log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1789 
1790     Mutex::Locker thread_locker(m_thread_list.GetMutex());
1791     Mutex::Locker locker(m_private_state.GetMutex());
1792 
1793     const StateType old_state = m_private_state.GetValueNoLock ();
1794     state_changed = old_state != new_state;
1795 
1796     const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1797     const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1798     if (old_state_is_stopped != new_state_is_stopped)
1799     {
1800         if (new_state_is_stopped)
1801             m_private_run_lock.SetStopped();
1802         else
1803             m_private_run_lock.SetRunning();
1804     }
1805 
1806     if (state_changed)
1807     {
1808         m_private_state.SetValueNoLock (new_state);
1809         if (StateIsStoppedState(new_state, false))
1810         {
1811             // Note, this currently assumes that all threads in the list
1812             // stop when the process stops.  In the future we will want to
1813             // support a debugging model where some threads continue to run
1814             // while others are stopped.  When that happens we will either need
1815             // a way for the thread list to identify which threads are stopping
1816             // or create a special thread list containing only threads which
1817             // actually stopped.
1818             //
1819             // The process plugin is responsible for managing the actual
1820             // behavior of the threads and should have stopped any threads
1821             // that are going to stop before we get here.
1822             m_thread_list.DidStop();
1823 
1824             m_mod_id.BumpStopID();
1825             m_memory_cache.Clear();
1826             if (log)
1827                 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID());
1828         }
1829         // Use our target to get a shared pointer to ourselves...
1830         if (m_finalize_called && PrivateStateThreadIsValid() == false)
1831             BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state));
1832         else
1833             m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state));
1834     }
1835     else
1836     {
1837         if (log)
1838             log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state));
1839     }
1840 }
1841 
1842 void
1843 Process::SetRunningUserExpression (bool on)
1844 {
1845     m_mod_id.SetRunningUserExpression (on);
1846 }
1847 
1848 addr_t
1849 Process::GetImageInfoAddress()
1850 {
1851     return LLDB_INVALID_ADDRESS;
1852 }
1853 
1854 //----------------------------------------------------------------------
1855 // LoadImage
1856 //
1857 // This function provides a default implementation that works for most
1858 // unix variants. Any Process subclasses that need to do shared library
1859 // loading differently should override LoadImage and UnloadImage and
1860 // do what is needed.
1861 //----------------------------------------------------------------------
1862 uint32_t
1863 Process::LoadImage (const FileSpec &image_spec, Error &error)
1864 {
1865     char path[PATH_MAX];
1866     image_spec.GetPath(path, sizeof(path));
1867 
1868     DynamicLoader *loader = GetDynamicLoader();
1869     if (loader)
1870     {
1871         error = loader->CanLoadImage();
1872         if (error.Fail())
1873             return LLDB_INVALID_IMAGE_TOKEN;
1874     }
1875 
1876     if (error.Success())
1877     {
1878         ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1879 
1880         if (thread_sp)
1881         {
1882             StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1883 
1884             if (frame_sp)
1885             {
1886                 ExecutionContext exe_ctx;
1887                 frame_sp->CalculateExecutionContext (exe_ctx);
1888                 EvaluateExpressionOptions expr_options;
1889                 expr_options.SetUnwindOnError(true);
1890                 expr_options.SetIgnoreBreakpoints(true);
1891                 expr_options.SetExecutionPolicy(eExecutionPolicyAlways);
1892                 StreamString expr;
1893                 expr.Printf("dlopen (\"%s\", 2)", path);
1894                 const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
1895                 lldb::ValueObjectSP result_valobj_sp;
1896                 Error expr_error;
1897                 ClangUserExpression::Evaluate (exe_ctx,
1898                                                expr_options,
1899                                                expr.GetData(),
1900                                                prefix,
1901                                                result_valobj_sp,
1902                                                expr_error);
1903                 if (expr_error.Success())
1904                 {
1905                     error = result_valobj_sp->GetError();
1906                     if (error.Success())
1907                     {
1908                         Scalar scalar;
1909                         if (result_valobj_sp->ResolveValue (scalar))
1910                         {
1911                             addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1912                             if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
1913                             {
1914                                 uint32_t image_token = m_image_tokens.size();
1915                                 m_image_tokens.push_back (image_ptr);
1916                                 return image_token;
1917                             }
1918                         }
1919                     }
1920                 }
1921             }
1922         }
1923     }
1924     if (!error.AsCString())
1925         error.SetErrorStringWithFormat("unable to load '%s'", path);
1926     return LLDB_INVALID_IMAGE_TOKEN;
1927 }
1928 
1929 //----------------------------------------------------------------------
1930 // UnloadImage
1931 //
1932 // This function provides a default implementation that works for most
1933 // unix variants. Any Process subclasses that need to do shared library
1934 // loading differently should override LoadImage and UnloadImage and
1935 // do what is needed.
1936 //----------------------------------------------------------------------
1937 Error
1938 Process::UnloadImage (uint32_t image_token)
1939 {
1940     Error error;
1941     if (image_token < m_image_tokens.size())
1942     {
1943         const addr_t image_addr = m_image_tokens[image_token];
1944         if (image_addr == LLDB_INVALID_ADDRESS)
1945         {
1946             error.SetErrorString("image already unloaded");
1947         }
1948         else
1949         {
1950             DynamicLoader *loader = GetDynamicLoader();
1951             if (loader)
1952                 error = loader->CanLoadImage();
1953 
1954             if (error.Success())
1955             {
1956                 ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1957 
1958                 if (thread_sp)
1959                 {
1960                     StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1961 
1962                     if (frame_sp)
1963                     {
1964                         ExecutionContext exe_ctx;
1965                         frame_sp->CalculateExecutionContext (exe_ctx);
1966                         EvaluateExpressionOptions expr_options;
1967                         expr_options.SetUnwindOnError(true);
1968                         expr_options.SetIgnoreBreakpoints(true);
1969                         expr_options.SetExecutionPolicy(eExecutionPolicyAlways);
1970                         StreamString expr;
1971                         expr.Printf("dlclose ((void *)0x%" PRIx64 ")", image_addr);
1972                         const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
1973                         lldb::ValueObjectSP result_valobj_sp;
1974                         Error expr_error;
1975                         ClangUserExpression::Evaluate (exe_ctx,
1976                                                        expr_options,
1977                                                        expr.GetData(),
1978                                                        prefix,
1979                                                        result_valobj_sp,
1980                                                        expr_error);
1981                         if (result_valobj_sp->GetError().Success())
1982                         {
1983                             Scalar scalar;
1984                             if (result_valobj_sp->ResolveValue (scalar))
1985                             {
1986                                 if (scalar.UInt(1))
1987                                 {
1988                                     error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
1989                                 }
1990                                 else
1991                                 {
1992                                     m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
1993                                 }
1994                             }
1995                         }
1996                         else
1997                         {
1998                             error = result_valobj_sp->GetError();
1999                         }
2000                     }
2001                 }
2002             }
2003         }
2004     }
2005     else
2006     {
2007         error.SetErrorString("invalid image token");
2008     }
2009     return error;
2010 }
2011 
2012 const lldb::ABISP &
2013 Process::GetABI()
2014 {
2015     if (!m_abi_sp)
2016         m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture());
2017     return m_abi_sp;
2018 }
2019 
2020 LanguageRuntime *
2021 Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
2022 {
2023     LanguageRuntimeCollection::iterator pos;
2024     pos = m_language_runtimes.find (language);
2025     if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
2026     {
2027         lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
2028 
2029         m_language_runtimes[language] = runtime_sp;
2030         return runtime_sp.get();
2031     }
2032     else
2033         return (*pos).second.get();
2034 }
2035 
2036 CPPLanguageRuntime *
2037 Process::GetCPPLanguageRuntime (bool retry_if_null)
2038 {
2039     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
2040     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
2041         return static_cast<CPPLanguageRuntime *> (runtime);
2042     return NULL;
2043 }
2044 
2045 ObjCLanguageRuntime *
2046 Process::GetObjCLanguageRuntime (bool retry_if_null)
2047 {
2048     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
2049     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
2050         return static_cast<ObjCLanguageRuntime *> (runtime);
2051     return NULL;
2052 }
2053 
2054 bool
2055 Process::IsPossibleDynamicValue (ValueObject& in_value)
2056 {
2057     if (in_value.IsDynamic())
2058         return false;
2059     LanguageType known_type = in_value.GetObjectRuntimeLanguage();
2060 
2061     if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC)
2062     {
2063         LanguageRuntime *runtime = GetLanguageRuntime (known_type);
2064         return runtime ? runtime->CouldHaveDynamicValue(in_value) : false;
2065     }
2066 
2067     LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus);
2068     if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value))
2069         return true;
2070 
2071     LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC);
2072     return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false;
2073 }
2074 
2075 BreakpointSiteList &
2076 Process::GetBreakpointSiteList()
2077 {
2078     return m_breakpoint_site_list;
2079 }
2080 
2081 const BreakpointSiteList &
2082 Process::GetBreakpointSiteList() const
2083 {
2084     return m_breakpoint_site_list;
2085 }
2086 
2087 
2088 void
2089 Process::DisableAllBreakpointSites ()
2090 {
2091     m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void {
2092 //        bp_site->SetEnabled(true);
2093         DisableBreakpointSite(bp_site);
2094     });
2095 }
2096 
2097 Error
2098 Process::ClearBreakpointSiteByID (lldb::user_id_t break_id)
2099 {
2100     Error error (DisableBreakpointSiteByID (break_id));
2101 
2102     if (error.Success())
2103         m_breakpoint_site_list.Remove(break_id);
2104 
2105     return error;
2106 }
2107 
2108 Error
2109 Process::DisableBreakpointSiteByID (lldb::user_id_t break_id)
2110 {
2111     Error error;
2112     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
2113     if (bp_site_sp)
2114     {
2115         if (bp_site_sp->IsEnabled())
2116             error = DisableBreakpointSite (bp_site_sp.get());
2117     }
2118     else
2119     {
2120         error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
2121     }
2122 
2123     return error;
2124 }
2125 
2126 Error
2127 Process::EnableBreakpointSiteByID (lldb::user_id_t break_id)
2128 {
2129     Error error;
2130     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
2131     if (bp_site_sp)
2132     {
2133         if (!bp_site_sp->IsEnabled())
2134             error = EnableBreakpointSite (bp_site_sp.get());
2135     }
2136     else
2137     {
2138         error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
2139     }
2140     return error;
2141 }
2142 
2143 lldb::break_id_t
2144 Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
2145 {
2146     const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
2147     if (load_addr != LLDB_INVALID_ADDRESS)
2148     {
2149         BreakpointSiteSP bp_site_sp;
2150 
2151         // Look up this breakpoint site.  If it exists, then add this new owner, otherwise
2152         // create a new breakpoint site and add it.
2153 
2154         bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
2155 
2156         if (bp_site_sp)
2157         {
2158             bp_site_sp->AddOwner (owner);
2159             owner->SetBreakpointSite (bp_site_sp);
2160             return bp_site_sp->GetID();
2161         }
2162         else
2163         {
2164             bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, use_hardware));
2165             if (bp_site_sp)
2166             {
2167                 Error error = EnableBreakpointSite (bp_site_sp.get());
2168                 if (error.Success())
2169                 {
2170                     owner->SetBreakpointSite (bp_site_sp);
2171                     return m_breakpoint_site_list.Add (bp_site_sp);
2172                 }
2173                 else
2174                 {
2175                     bool show_error = true;
2176                     switch (GetState())
2177                     {
2178                         case eStateInvalid:
2179                         case eStateUnloaded:
2180                         case eStateConnected:
2181                         case eStateAttaching:
2182                         case eStateLaunching:
2183                         case eStateDetached:
2184                         case eStateExited:
2185                             show_error = false;
2186                             break;
2187 
2188                         case eStateStopped:
2189                         case eStateRunning:
2190                         case eStateStepping:
2191                         case eStateCrashed:
2192                         case eStateSuspended:
2193                             show_error = IsAlive();
2194                             break;
2195                     }
2196 
2197                     if (show_error)
2198                     {
2199                         // Report error for setting breakpoint...
2200                         m_target.GetDebugger().GetErrorFile().Printf ("warning: failed to set breakpoint site at 0x%" PRIx64 " for breakpoint %i.%i: %s\n",
2201                                                                       load_addr,
2202                                                                       owner->GetBreakpoint().GetID(),
2203                                                                       owner->GetID(),
2204                                                                       error.AsCString() ? error.AsCString() : "unkown error");
2205                     }
2206                 }
2207             }
2208         }
2209     }
2210     // We failed to enable the breakpoint
2211     return LLDB_INVALID_BREAK_ID;
2212 
2213 }
2214 
2215 void
2216 Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
2217 {
2218     uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
2219     if (num_owners == 0)
2220     {
2221         // Don't try to disable the site if we don't have a live process anymore.
2222         if (IsAlive())
2223             DisableBreakpointSite (bp_site_sp.get());
2224         m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
2225     }
2226 }
2227 
2228 
2229 size_t
2230 Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
2231 {
2232     size_t bytes_removed = 0;
2233     BreakpointSiteList bp_sites_in_range;
2234 
2235     if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range))
2236     {
2237         bp_sites_in_range.ForEach([bp_addr, size, buf, &bytes_removed](BreakpointSite *bp_site) -> void {
2238             if (bp_site->GetType() == BreakpointSite::eSoftware)
2239             {
2240                 addr_t intersect_addr;
2241                 size_t intersect_size;
2242                 size_t opcode_offset;
2243                 if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
2244                 {
2245                     assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
2246                     assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
2247                     assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
2248                     size_t buf_offset = intersect_addr - bp_addr;
2249                     ::memcpy(buf + buf_offset, bp_site->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
2250                 }
2251             }
2252         });
2253     }
2254     return bytes_removed;
2255 }
2256 
2257 
2258 
2259 size_t
2260 Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
2261 {
2262     PlatformSP platform_sp (m_target.GetPlatform());
2263     if (platform_sp)
2264         return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
2265     return 0;
2266 }
2267 
2268 Error
2269 Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
2270 {
2271     Error error;
2272     assert (bp_site != NULL);
2273     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2274     const addr_t bp_addr = bp_site->GetLoadAddress();
2275     if (log)
2276         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64, bp_site->GetID(), (uint64_t)bp_addr);
2277     if (bp_site->IsEnabled())
2278     {
2279         if (log)
2280             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
2281         return error;
2282     }
2283 
2284     if (bp_addr == LLDB_INVALID_ADDRESS)
2285     {
2286         error.SetErrorString("BreakpointSite contains an invalid load address.");
2287         return error;
2288     }
2289     // Ask the lldb::Process subclass to fill in the correct software breakpoint
2290     // trap for the breakpoint site
2291     const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
2292 
2293     if (bp_opcode_size == 0)
2294     {
2295         error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%" PRIx64, bp_addr);
2296     }
2297     else
2298     {
2299         const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
2300 
2301         if (bp_opcode_bytes == NULL)
2302         {
2303             error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
2304             return error;
2305         }
2306 
2307         // Save the original opcode by reading it
2308         if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
2309         {
2310             // Write a software breakpoint in place of the original opcode
2311             if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2312             {
2313                 uint8_t verify_bp_opcode_bytes[64];
2314                 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2315                 {
2316                     if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
2317                     {
2318                         bp_site->SetEnabled(true);
2319                         bp_site->SetType (BreakpointSite::eSoftware);
2320                         if (log)
2321                             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS",
2322                                          bp_site->GetID(),
2323                                          (uint64_t)bp_addr);
2324                     }
2325                     else
2326                         error.SetErrorString("failed to verify the breakpoint trap in memory.");
2327                 }
2328                 else
2329                     error.SetErrorString("Unable to read memory to verify breakpoint trap.");
2330             }
2331             else
2332                 error.SetErrorString("Unable to write breakpoint trap to memory.");
2333         }
2334         else
2335             error.SetErrorString("Unable to read memory at breakpoint address.");
2336     }
2337     if (log && error.Fail())
2338         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
2339                      bp_site->GetID(),
2340                      (uint64_t)bp_addr,
2341                      error.AsCString());
2342     return error;
2343 }
2344 
2345 Error
2346 Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
2347 {
2348     Error error;
2349     assert (bp_site != NULL);
2350     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2351     addr_t bp_addr = bp_site->GetLoadAddress();
2352     lldb::user_id_t breakID = bp_site->GetID();
2353     if (log)
2354         log->Printf ("Process::DisableSoftwareBreakpoint (breakID = %" PRIu64 ") addr = 0x%" PRIx64, breakID, (uint64_t)bp_addr);
2355 
2356     if (bp_site->IsHardware())
2357     {
2358         error.SetErrorString("Breakpoint site is a hardware breakpoint.");
2359     }
2360     else if (bp_site->IsEnabled())
2361     {
2362         const size_t break_op_size = bp_site->GetByteSize();
2363         const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
2364         if (break_op_size > 0)
2365         {
2366             // Clear a software breakoint instruction
2367             uint8_t curr_break_op[8];
2368             assert (break_op_size <= sizeof(curr_break_op));
2369             bool break_op_found = false;
2370 
2371             // Read the breakpoint opcode
2372             if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
2373             {
2374                 bool verify = false;
2375                 // Make sure we have the a breakpoint opcode exists at this address
2376                 if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
2377                 {
2378                     break_op_found = true;
2379                     // We found a valid breakpoint opcode at this address, now restore
2380                     // the saved opcode.
2381                     if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
2382                     {
2383                         verify = true;
2384                     }
2385                     else
2386                         error.SetErrorString("Memory write failed when restoring original opcode.");
2387                 }
2388                 else
2389                 {
2390                     error.SetErrorString("Original breakpoint trap is no longer in memory.");
2391                     // Set verify to true and so we can check if the original opcode has already been restored
2392                     verify = true;
2393                 }
2394 
2395                 if (verify)
2396                 {
2397                     uint8_t verify_opcode[8];
2398                     assert (break_op_size < sizeof(verify_opcode));
2399                     // Verify that our original opcode made it back to the inferior
2400                     if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
2401                     {
2402                         // compare the memory we just read with the original opcode
2403                         if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
2404                         {
2405                             // SUCCESS
2406                             bp_site->SetEnabled(false);
2407                             if (log)
2408                                 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
2409                             return error;
2410                         }
2411                         else
2412                         {
2413                             if (break_op_found)
2414                                 error.SetErrorString("Failed to restore original opcode.");
2415                         }
2416                     }
2417                     else
2418                         error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
2419                 }
2420             }
2421             else
2422                 error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
2423         }
2424     }
2425     else
2426     {
2427         if (log)
2428             log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
2429         return error;
2430     }
2431 
2432     if (log)
2433         log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
2434                      bp_site->GetID(),
2435                      (uint64_t)bp_addr,
2436                      error.AsCString());
2437     return error;
2438 
2439 }
2440 
2441 // Uncomment to verify memory caching works after making changes to caching code
2442 //#define VERIFY_MEMORY_READS
2443 
2444 size_t
2445 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2446 {
2447     error.Clear();
2448     if (!GetDisableMemoryCache())
2449     {
2450 #if defined (VERIFY_MEMORY_READS)
2451         // Memory caching is enabled, with debug verification
2452 
2453         if (buf && size)
2454         {
2455             // Uncomment the line below to make sure memory caching is working.
2456             // I ran this through the test suite and got no assertions, so I am
2457             // pretty confident this is working well. If any changes are made to
2458             // memory caching, uncomment the line below and test your changes!
2459 
2460             // Verify all memory reads by using the cache first, then redundantly
2461             // reading the same memory from the inferior and comparing to make sure
2462             // everything is exactly the same.
2463             std::string verify_buf (size, '\0');
2464             assert (verify_buf.size() == size);
2465             const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
2466             Error verify_error;
2467             const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
2468             assert (cache_bytes_read == verify_bytes_read);
2469             assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2470             assert (verify_error.Success() == error.Success());
2471             return cache_bytes_read;
2472         }
2473         return 0;
2474 #else // !defined(VERIFY_MEMORY_READS)
2475         // Memory caching is enabled, without debug verification
2476 
2477         return m_memory_cache.Read (addr, buf, size, error);
2478 #endif // defined (VERIFY_MEMORY_READS)
2479     }
2480     else
2481     {
2482         // Memory caching is disabled
2483 
2484         return ReadMemoryFromInferior (addr, buf, size, error);
2485     }
2486 }
2487 
2488 size_t
2489 Process::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error)
2490 {
2491     char buf[256];
2492     out_str.clear();
2493     addr_t curr_addr = addr;
2494     while (1)
2495     {
2496         size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error);
2497         if (length == 0)
2498             break;
2499         out_str.append(buf, length);
2500         // If we got "length - 1" bytes, we didn't get the whole C string, we
2501         // need to read some more characters
2502         if (length == sizeof(buf) - 1)
2503             curr_addr += length;
2504         else
2505             break;
2506     }
2507     return out_str.size();
2508 }
2509 
2510 
2511 size_t
2512 Process::ReadStringFromMemory (addr_t addr, char *dst, size_t max_bytes, Error &error,
2513                                 size_t type_width)
2514 {
2515     size_t total_bytes_read = 0;
2516     if (dst && max_bytes && type_width && max_bytes >= type_width)
2517     {
2518         // Ensure a null terminator independent of the number of bytes that is read.
2519         memset (dst, 0, max_bytes);
2520         size_t bytes_left = max_bytes - type_width;
2521 
2522         const char terminator[4] = {'\0', '\0', '\0', '\0'};
2523         assert(sizeof(terminator) >= type_width &&
2524                "Attempting to validate a string with more than 4 bytes per character!");
2525 
2526         addr_t curr_addr = addr;
2527         const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2528         char *curr_dst = dst;
2529 
2530         error.Clear();
2531         while (bytes_left > 0 && error.Success())
2532         {
2533             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2534             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2535             size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2536 
2537             if (bytes_read == 0)
2538                 break;
2539 
2540             // Search for a null terminator of correct size and alignment in bytes_read
2541             size_t aligned_start = total_bytes_read - total_bytes_read % type_width;
2542             for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width)
2543                 if (::strncmp(&dst[i], terminator, type_width) == 0)
2544                 {
2545                     error.Clear();
2546                     return i;
2547                 }
2548 
2549             total_bytes_read += bytes_read;
2550             curr_dst += bytes_read;
2551             curr_addr += bytes_read;
2552             bytes_left -= bytes_read;
2553         }
2554     }
2555     else
2556     {
2557         if (max_bytes)
2558             error.SetErrorString("invalid arguments");
2559     }
2560     return total_bytes_read;
2561 }
2562 
2563 // Deprecated in favor of ReadStringFromMemory which has wchar support and correct code to find
2564 // null terminators.
2565 size_t
2566 Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error)
2567 {
2568     size_t total_cstr_len = 0;
2569     if (dst && dst_max_len)
2570     {
2571         result_error.Clear();
2572         // NULL out everything just to be safe
2573         memset (dst, 0, dst_max_len);
2574         Error error;
2575         addr_t curr_addr = addr;
2576         const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2577         size_t bytes_left = dst_max_len - 1;
2578         char *curr_dst = dst;
2579 
2580         while (bytes_left > 0)
2581         {
2582             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2583             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2584             size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2585 
2586             if (bytes_read == 0)
2587             {
2588                 result_error = error;
2589                 dst[total_cstr_len] = '\0';
2590                 break;
2591             }
2592             const size_t len = strlen(curr_dst);
2593 
2594             total_cstr_len += len;
2595 
2596             if (len < bytes_to_read)
2597                 break;
2598 
2599             curr_dst += bytes_read;
2600             curr_addr += bytes_read;
2601             bytes_left -= bytes_read;
2602         }
2603     }
2604     else
2605     {
2606         if (dst == NULL)
2607             result_error.SetErrorString("invalid arguments");
2608         else
2609             result_error.Clear();
2610     }
2611     return total_cstr_len;
2612 }
2613 
2614 size_t
2615 Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
2616 {
2617     if (buf == NULL || size == 0)
2618         return 0;
2619 
2620     size_t bytes_read = 0;
2621     uint8_t *bytes = (uint8_t *)buf;
2622 
2623     while (bytes_read < size)
2624     {
2625         const size_t curr_size = size - bytes_read;
2626         const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
2627                                                      bytes + bytes_read,
2628                                                      curr_size,
2629                                                      error);
2630         bytes_read += curr_bytes_read;
2631         if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2632             break;
2633     }
2634 
2635     // Replace any software breakpoint opcodes that fall into this range back
2636     // into "buf" before we return
2637     if (bytes_read > 0)
2638         RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
2639     return bytes_read;
2640 }
2641 
2642 uint64_t
2643 Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
2644 {
2645     Scalar scalar;
2646     if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
2647         return scalar.ULongLong(fail_value);
2648     return fail_value;
2649 }
2650 
2651 addr_t
2652 Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
2653 {
2654     Scalar scalar;
2655     if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
2656         return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2657     return LLDB_INVALID_ADDRESS;
2658 }
2659 
2660 
2661 bool
2662 Process::WritePointerToMemory (lldb::addr_t vm_addr,
2663                                lldb::addr_t ptr_value,
2664                                Error &error)
2665 {
2666     Scalar scalar;
2667     const uint32_t addr_byte_size = GetAddressByteSize();
2668     if (addr_byte_size <= 4)
2669         scalar = (uint32_t)ptr_value;
2670     else
2671         scalar = ptr_value;
2672     return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
2673 }
2674 
2675 size_t
2676 Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
2677 {
2678     size_t bytes_written = 0;
2679     const uint8_t *bytes = (const uint8_t *)buf;
2680 
2681     while (bytes_written < size)
2682     {
2683         const size_t curr_size = size - bytes_written;
2684         const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
2685                                                          bytes + bytes_written,
2686                                                          curr_size,
2687                                                          error);
2688         bytes_written += curr_bytes_written;
2689         if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2690             break;
2691     }
2692     return bytes_written;
2693 }
2694 
2695 size_t
2696 Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2697 {
2698 #if defined (ENABLE_MEMORY_CACHING)
2699     m_memory_cache.Flush (addr, size);
2700 #endif
2701 
2702     if (buf == NULL || size == 0)
2703         return 0;
2704 
2705     m_mod_id.BumpMemoryID();
2706 
2707     // We need to write any data that would go where any current software traps
2708     // (enabled software breakpoints) any software traps (breakpoints) that we
2709     // may have placed in our tasks memory.
2710 
2711     BreakpointSiteList bp_sites_in_range;
2712 
2713     if (m_breakpoint_site_list.FindInRange (addr, addr + size, bp_sites_in_range))
2714     {
2715         // No breakpoint sites overlap
2716         if (bp_sites_in_range.IsEmpty())
2717             return WriteMemoryPrivate (addr, buf, size, error);
2718         else
2719         {
2720             const uint8_t *ubuf = (const uint8_t *)buf;
2721             uint64_t bytes_written = 0;
2722 
2723             bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf, &error](BreakpointSite *bp) -> void {
2724 
2725                 if (error.Success())
2726                 {
2727                     addr_t intersect_addr;
2728                     size_t intersect_size;
2729                     size_t opcode_offset;
2730                     const bool intersects = bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset);
2731                     assert(intersects);
2732                     assert(addr <= intersect_addr && intersect_addr < addr + size);
2733                     assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
2734                     assert(opcode_offset + intersect_size <= bp->GetByteSize());
2735 
2736                     // Check for bytes before this breakpoint
2737                     const addr_t curr_addr = addr + bytes_written;
2738                     if (intersect_addr > curr_addr)
2739                     {
2740                         // There are some bytes before this breakpoint that we need to
2741                         // just write to memory
2742                         size_t curr_size = intersect_addr - curr_addr;
2743                         size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
2744                                                                         ubuf + bytes_written,
2745                                                                         curr_size,
2746                                                                         error);
2747                         bytes_written += curr_bytes_written;
2748                         if (curr_bytes_written != curr_size)
2749                         {
2750                             // We weren't able to write all of the requested bytes, we
2751                             // are done looping and will return the number of bytes that
2752                             // we have written so far.
2753                             if (error.Success())
2754                                 error.SetErrorToGenericError();
2755                         }
2756                     }
2757                     // Now write any bytes that would cover up any software breakpoints
2758                     // directly into the breakpoint opcode buffer
2759                     ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
2760                     bytes_written += intersect_size;
2761                 }
2762             });
2763 
2764             if (bytes_written < size)
2765                 bytes_written += WriteMemoryPrivate (addr + bytes_written,
2766                                                      ubuf + bytes_written,
2767                                                      size - bytes_written,
2768                                                      error);
2769         }
2770     }
2771     else
2772     {
2773         return WriteMemoryPrivate (addr, buf, size, error);
2774     }
2775 
2776     // Write any remaining bytes after the last breakpoint if we have any left
2777     return 0; //bytes_written;
2778 }
2779 
2780 size_t
2781 Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, size_t byte_size, Error &error)
2782 {
2783     if (byte_size == UINT32_MAX)
2784         byte_size = scalar.GetByteSize();
2785     if (byte_size > 0)
2786     {
2787         uint8_t buf[32];
2788         const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
2789         if (mem_size > 0)
2790             return WriteMemory(addr, buf, mem_size, error);
2791         else
2792             error.SetErrorString ("failed to get scalar as memory data");
2793     }
2794     else
2795     {
2796         error.SetErrorString ("invalid scalar value");
2797     }
2798     return 0;
2799 }
2800 
2801 size_t
2802 Process::ReadScalarIntegerFromMemory (addr_t addr,
2803                                       uint32_t byte_size,
2804                                       bool is_signed,
2805                                       Scalar &scalar,
2806                                       Error &error)
2807 {
2808     uint64_t uval = 0;
2809     if (byte_size == 0)
2810     {
2811         error.SetErrorString ("byte size is zero");
2812     }
2813     else if (byte_size & (byte_size - 1))
2814     {
2815         error.SetErrorStringWithFormat ("byte size %u is not a power of 2", byte_size);
2816     }
2817     else if (byte_size <= sizeof(uval))
2818     {
2819         const size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
2820         if (bytes_read == byte_size)
2821         {
2822             DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
2823             lldb::offset_t offset = 0;
2824             if (byte_size <= 4)
2825                 scalar = data.GetMaxU32 (&offset, byte_size);
2826             else
2827                 scalar = data.GetMaxU64 (&offset, byte_size);
2828             if (is_signed)
2829                 scalar.SignExtend(byte_size * 8);
2830             return bytes_read;
2831         }
2832     }
2833     else
2834     {
2835         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
2836     }
2837     return 0;
2838 }
2839 
2840 #define USE_ALLOCATE_MEMORY_CACHE 1
2841 addr_t
2842 Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
2843 {
2844     if (GetPrivateState() != eStateStopped)
2845         return LLDB_INVALID_ADDRESS;
2846 
2847 #if defined (USE_ALLOCATE_MEMORY_CACHE)
2848     return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2849 #else
2850     addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
2851     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2852     if (log)
2853         log->Printf("Process::AllocateMemory(size=%" PRIu64 ", permissions=%s) => 0x%16.16" PRIx64 " (m_stop_id = %u m_memory_id = %u)",
2854                     (uint64_t)size,
2855                     GetPermissionsAsCString (permissions),
2856                     (uint64_t)allocated_addr,
2857                     m_mod_id.GetStopID(),
2858                     m_mod_id.GetMemoryID());
2859     return allocated_addr;
2860 #endif
2861 }
2862 
2863 bool
2864 Process::CanJIT ()
2865 {
2866     if (m_can_jit == eCanJITDontKnow)
2867     {
2868         Error err;
2869 
2870         uint64_t allocated_memory = AllocateMemory(8,
2871                                                    ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2872                                                    err);
2873 
2874         if (err.Success())
2875             m_can_jit = eCanJITYes;
2876         else
2877             m_can_jit = eCanJITNo;
2878 
2879         DeallocateMemory (allocated_memory);
2880     }
2881 
2882     return m_can_jit == eCanJITYes;
2883 }
2884 
2885 void
2886 Process::SetCanJIT (bool can_jit)
2887 {
2888     m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2889 }
2890 
2891 Error
2892 Process::DeallocateMemory (addr_t ptr)
2893 {
2894     Error error;
2895 #if defined (USE_ALLOCATE_MEMORY_CACHE)
2896     if (!m_allocated_memory_cache.DeallocateMemory(ptr))
2897     {
2898         error.SetErrorStringWithFormat ("deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr);
2899     }
2900 #else
2901     error = DoDeallocateMemory (ptr);
2902 
2903     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2904     if (log)
2905         log->Printf("Process::DeallocateMemory(addr=0x%16.16" PRIx64 ") => err = %s (m_stop_id = %u, m_memory_id = %u)",
2906                     ptr,
2907                     error.AsCString("SUCCESS"),
2908                     m_mod_id.GetStopID(),
2909                     m_mod_id.GetMemoryID());
2910 #endif
2911     return error;
2912 }
2913 
2914 
2915 ModuleSP
2916 Process::ReadModuleFromMemory (const FileSpec& file_spec,
2917                                lldb::addr_t header_addr)
2918 {
2919     ModuleSP module_sp (new Module (file_spec, ArchSpec()));
2920     if (module_sp)
2921     {
2922         Error error;
2923         ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error);
2924         if (objfile)
2925             return module_sp;
2926     }
2927     return ModuleSP();
2928 }
2929 
2930 Error
2931 Process::EnableWatchpoint (Watchpoint *watchpoint, bool notify)
2932 {
2933     Error error;
2934     error.SetErrorString("watchpoints are not supported");
2935     return error;
2936 }
2937 
2938 Error
2939 Process::DisableWatchpoint (Watchpoint *watchpoint, bool notify)
2940 {
2941     Error error;
2942     error.SetErrorString("watchpoints are not supported");
2943     return error;
2944 }
2945 
2946 StateType
2947 Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
2948 {
2949     StateType state;
2950     // Now wait for the process to launch and return control to us, and then
2951     // call DidLaunch:
2952     while (1)
2953     {
2954         event_sp.reset();
2955         state = WaitForStateChangedEventsPrivate (timeout, event_sp);
2956 
2957         if (StateIsStoppedState(state, false))
2958             break;
2959 
2960         // If state is invalid, then we timed out
2961         if (state == eStateInvalid)
2962             break;
2963 
2964         if (event_sp)
2965             HandlePrivateEvent (event_sp);
2966     }
2967     return state;
2968 }
2969 
2970 Error
2971 Process::Launch (ProcessLaunchInfo &launch_info)
2972 {
2973     Error error;
2974     m_abi_sp.reset();
2975     m_dyld_ap.reset();
2976     m_system_runtime_ap.reset();
2977     m_os_ap.reset();
2978     m_process_input_reader.reset();
2979 
2980     Module *exe_module = m_target.GetExecutableModulePointer();
2981     if (exe_module)
2982     {
2983         char local_exec_file_path[PATH_MAX];
2984         char platform_exec_file_path[PATH_MAX];
2985         exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
2986         exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
2987         if (exe_module->GetFileSpec().Exists())
2988         {
2989             // Install anything that might need to be installed prior to launching.
2990             // For host systems, this will do nothing, but if we are connected to a
2991             // remote platform it will install any needed binaries
2992             error = GetTarget().Install(&launch_info);
2993             if (error.Fail())
2994                 return error;
2995 
2996             if (PrivateStateThreadIsValid ())
2997                 PausePrivateStateThread ();
2998 
2999             error = WillLaunch (exe_module);
3000             if (error.Success())
3001             {
3002                 const bool restarted = false;
3003                 SetPublicState (eStateLaunching, restarted);
3004                 m_should_detach = false;
3005 
3006                 if (m_public_run_lock.TrySetRunning())
3007                 {
3008                     // Now launch using these arguments.
3009                     error = DoLaunch (exe_module, launch_info);
3010                 }
3011                 else
3012                 {
3013                     // This shouldn't happen
3014                     error.SetErrorString("failed to acquire process run lock");
3015                 }
3016 
3017                 if (error.Fail())
3018                 {
3019                     if (GetID() != LLDB_INVALID_PROCESS_ID)
3020                     {
3021                         SetID (LLDB_INVALID_PROCESS_ID);
3022                         const char *error_string = error.AsCString();
3023                         if (error_string == NULL)
3024                             error_string = "launch failed";
3025                         SetExitStatus (-1, error_string);
3026                     }
3027                 }
3028                 else
3029                 {
3030                     EventSP event_sp;
3031                     TimeValue timeout_time;
3032                     timeout_time = TimeValue::Now();
3033                     timeout_time.OffsetWithSeconds(10);
3034                     StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp);
3035 
3036                     if (state == eStateInvalid || event_sp.get() == NULL)
3037                     {
3038                         // We were able to launch the process, but we failed to
3039                         // catch the initial stop.
3040                         SetExitStatus (0, "failed to catch stop after launch");
3041                         Destroy();
3042                     }
3043                     else if (state == eStateStopped || state == eStateCrashed)
3044                     {
3045 
3046                         DidLaunch ();
3047 
3048                         DynamicLoader *dyld = GetDynamicLoader ();
3049                         if (dyld)
3050                             dyld->DidLaunch();
3051 
3052                         SystemRuntime *system_runtime = GetSystemRuntime ();
3053                         if (system_runtime)
3054                             system_runtime->DidLaunch();
3055 
3056                         m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
3057                         // This delays passing the stopped event to listeners till DidLaunch gets
3058                         // a chance to complete...
3059                         HandlePrivateEvent (event_sp);
3060 
3061                         if (PrivateStateThreadIsValid ())
3062                             ResumePrivateStateThread ();
3063                         else
3064                             StartPrivateStateThread ();
3065                     }
3066                     else if (state == eStateExited)
3067                     {
3068                         // We exited while trying to launch somehow.  Don't call DidLaunch as that's
3069                         // not likely to work, and return an invalid pid.
3070                         HandlePrivateEvent (event_sp);
3071                     }
3072                 }
3073             }
3074         }
3075         else
3076         {
3077             error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path);
3078         }
3079     }
3080     return error;
3081 }
3082 
3083 
3084 Error
3085 Process::LoadCore ()
3086 {
3087     Error error = DoLoadCore();
3088     if (error.Success())
3089     {
3090         if (PrivateStateThreadIsValid ())
3091             ResumePrivateStateThread ();
3092         else
3093             StartPrivateStateThread ();
3094 
3095         DynamicLoader *dyld = GetDynamicLoader ();
3096         if (dyld)
3097             dyld->DidAttach();
3098 
3099         SystemRuntime *system_runtime = GetSystemRuntime ();
3100         if (system_runtime)
3101             system_runtime->DidAttach();
3102 
3103         m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
3104         // We successfully loaded a core file, now pretend we stopped so we can
3105         // show all of the threads in the core file and explore the crashed
3106         // state.
3107         SetPrivateState (eStateStopped);
3108 
3109     }
3110     return error;
3111 }
3112 
3113 DynamicLoader *
3114 Process::GetDynamicLoader ()
3115 {
3116     if (m_dyld_ap.get() == NULL)
3117         m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
3118     return m_dyld_ap.get();
3119 }
3120 
3121 SystemRuntime *
3122 Process::GetSystemRuntime ()
3123 {
3124     if (m_system_runtime_ap.get() == NULL)
3125         m_system_runtime_ap.reset (SystemRuntime::FindPlugin(this));
3126     return m_system_runtime_ap.get();
3127 }
3128 
3129 
3130 Process::NextEventAction::EventActionResult
3131 Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
3132 {
3133     StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
3134     switch (state)
3135     {
3136         case eStateRunning:
3137         case eStateConnected:
3138             return eEventActionRetry;
3139 
3140         case eStateStopped:
3141         case eStateCrashed:
3142             {
3143                 // During attach, prior to sending the eStateStopped event,
3144                 // lldb_private::Process subclasses must set the new process ID.
3145                 assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
3146                 // We don't want these events to be reported, so go set the ShouldReportStop here:
3147                 m_process->GetThreadList().SetShouldReportStop (eVoteNo);
3148 
3149                 if (m_exec_count > 0)
3150                 {
3151                     --m_exec_count;
3152                     RequestResume();
3153                     return eEventActionRetry;
3154                 }
3155                 else
3156                 {
3157                     m_process->CompleteAttach ();
3158                     return eEventActionSuccess;
3159                 }
3160             }
3161             break;
3162 
3163         default:
3164         case eStateExited:
3165         case eStateInvalid:
3166             break;
3167     }
3168 
3169     m_exit_string.assign ("No valid Process");
3170     return eEventActionExit;
3171 }
3172 
3173 Process::NextEventAction::EventActionResult
3174 Process::AttachCompletionHandler::HandleBeingInterrupted()
3175 {
3176     return eEventActionSuccess;
3177 }
3178 
3179 const char *
3180 Process::AttachCompletionHandler::GetExitString ()
3181 {
3182     return m_exit_string.c_str();
3183 }
3184 
3185 Error
3186 Process::Attach (ProcessAttachInfo &attach_info)
3187 {
3188     m_abi_sp.reset();
3189     m_process_input_reader.reset();
3190     m_dyld_ap.reset();
3191     m_system_runtime_ap.reset();
3192     m_os_ap.reset();
3193 
3194     lldb::pid_t attach_pid = attach_info.GetProcessID();
3195     Error error;
3196     if (attach_pid == LLDB_INVALID_PROCESS_ID)
3197     {
3198         char process_name[PATH_MAX];
3199 
3200         if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name)))
3201         {
3202             const bool wait_for_launch = attach_info.GetWaitForLaunch();
3203 
3204             if (wait_for_launch)
3205             {
3206                 error = WillAttachToProcessWithName(process_name, wait_for_launch);
3207                 if (error.Success())
3208                 {
3209                     if (m_public_run_lock.TrySetRunning())
3210                     {
3211                         m_should_detach = true;
3212                         const bool restarted = false;
3213                         SetPublicState (eStateAttaching, restarted);
3214                         // Now attach using these arguments.
3215                         error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info);
3216                     }
3217                     else
3218                     {
3219                         // This shouldn't happen
3220                         error.SetErrorString("failed to acquire process run lock");
3221                     }
3222 
3223                     if (error.Fail())
3224                     {
3225                         if (GetID() != LLDB_INVALID_PROCESS_ID)
3226                         {
3227                             SetID (LLDB_INVALID_PROCESS_ID);
3228                             if (error.AsCString() == NULL)
3229                                 error.SetErrorString("attach failed");
3230 
3231                             SetExitStatus(-1, error.AsCString());
3232                         }
3233                     }
3234                     else
3235                     {
3236                         SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3237                         StartPrivateStateThread();
3238                     }
3239                     return error;
3240                 }
3241             }
3242             else
3243             {
3244                 ProcessInstanceInfoList process_infos;
3245                 PlatformSP platform_sp (m_target.GetPlatform ());
3246 
3247                 if (platform_sp)
3248                 {
3249                     ProcessInstanceInfoMatch match_info;
3250                     match_info.GetProcessInfo() = attach_info;
3251                     match_info.SetNameMatchType (eNameMatchEquals);
3252                     platform_sp->FindProcesses (match_info, process_infos);
3253                     const uint32_t num_matches = process_infos.GetSize();
3254                     if (num_matches == 1)
3255                     {
3256                         attach_pid = process_infos.GetProcessIDAtIndex(0);
3257                         // Fall through and attach using the above process ID
3258                     }
3259                     else
3260                     {
3261                         match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name));
3262                         if (num_matches > 1)
3263                             error.SetErrorStringWithFormat ("more than one process named %s", process_name);
3264                         else
3265                             error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
3266                     }
3267                 }
3268                 else
3269                 {
3270                     error.SetErrorString ("invalid platform, can't find processes by name");
3271                     return error;
3272                 }
3273             }
3274         }
3275         else
3276         {
3277             error.SetErrorString ("invalid process name");
3278         }
3279     }
3280 
3281     if (attach_pid != LLDB_INVALID_PROCESS_ID)
3282     {
3283         error = WillAttachToProcessWithID(attach_pid);
3284         if (error.Success())
3285         {
3286 
3287             if (m_public_run_lock.TrySetRunning())
3288             {
3289                 // Now attach using these arguments.
3290                 m_should_detach = true;
3291                 const bool restarted = false;
3292                 SetPublicState (eStateAttaching, restarted);
3293                 error = DoAttachToProcessWithID (attach_pid, attach_info);
3294             }
3295             else
3296             {
3297                 // This shouldn't happen
3298                 error.SetErrorString("failed to acquire process run lock");
3299             }
3300 
3301             if (error.Success())
3302             {
3303 
3304                 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3305                 StartPrivateStateThread();
3306             }
3307             else
3308             {
3309                 if (GetID() != LLDB_INVALID_PROCESS_ID)
3310                 {
3311                     SetID (LLDB_INVALID_PROCESS_ID);
3312                     const char *error_string = error.AsCString();
3313                     if (error_string == NULL)
3314                         error_string = "attach failed";
3315 
3316                     SetExitStatus(-1, error_string);
3317                 }
3318             }
3319         }
3320     }
3321     return error;
3322 }
3323 
3324 void
3325 Process::CompleteAttach ()
3326 {
3327     // Let the process subclass figure out at much as it can about the process
3328     // before we go looking for a dynamic loader plug-in.
3329     DidAttach();
3330 
3331     // We just attached.  If we have a platform, ask it for the process architecture, and if it isn't
3332     // the same as the one we've already set, switch architectures.
3333     PlatformSP platform_sp (m_target.GetPlatform ());
3334     assert (platform_sp.get());
3335     if (platform_sp)
3336     {
3337         const ArchSpec &target_arch = m_target.GetArchitecture();
3338         if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture (target_arch, false, NULL))
3339         {
3340             ArchSpec platform_arch;
3341             platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch);
3342             if (platform_sp)
3343             {
3344                 m_target.SetPlatform (platform_sp);
3345                 m_target.SetArchitecture(platform_arch);
3346             }
3347         }
3348         else
3349         {
3350             ProcessInstanceInfo process_info;
3351             platform_sp->GetProcessInfo (GetID(), process_info);
3352             const ArchSpec &process_arch = process_info.GetArchitecture();
3353             if (process_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(process_arch))
3354                 m_target.SetArchitecture (process_arch);
3355         }
3356     }
3357 
3358     // We have completed the attach, now it is time to find the dynamic loader
3359     // plug-in
3360     DynamicLoader *dyld = GetDynamicLoader ();
3361     if (dyld)
3362         dyld->DidAttach();
3363 
3364     SystemRuntime *system_runtime = GetSystemRuntime ();
3365     if (system_runtime)
3366         system_runtime->DidAttach();
3367 
3368     m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
3369     // Figure out which one is the executable, and set that in our target:
3370     const ModuleList &target_modules = m_target.GetImages();
3371     Mutex::Locker modules_locker(target_modules.GetMutex());
3372     size_t num_modules = target_modules.GetSize();
3373     ModuleSP new_executable_module_sp;
3374 
3375     for (size_t i = 0; i < num_modules; i++)
3376     {
3377         ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i));
3378         if (module_sp && module_sp->IsExecutable())
3379         {
3380             if (m_target.GetExecutableModulePointer() != module_sp.get())
3381                 new_executable_module_sp = module_sp;
3382             break;
3383         }
3384     }
3385     if (new_executable_module_sp)
3386         m_target.SetExecutableModule (new_executable_module_sp, false);
3387 }
3388 
3389 Error
3390 Process::ConnectRemote (Stream *strm, const char *remote_url)
3391 {
3392     m_abi_sp.reset();
3393     m_process_input_reader.reset();
3394 
3395     // Find the process and its architecture.  Make sure it matches the architecture
3396     // of the current Target, and if not adjust it.
3397 
3398     Error error (DoConnectRemote (strm, remote_url));
3399     if (error.Success())
3400     {
3401         if (GetID() != LLDB_INVALID_PROCESS_ID)
3402         {
3403             EventSP event_sp;
3404             StateType state = WaitForProcessStopPrivate(NULL, event_sp);
3405 
3406             if (state == eStateStopped || state == eStateCrashed)
3407             {
3408                 // If we attached and actually have a process on the other end, then
3409                 // this ended up being the equivalent of an attach.
3410                 CompleteAttach ();
3411 
3412                 // This delays passing the stopped event to listeners till
3413                 // CompleteAttach gets a chance to complete...
3414                 HandlePrivateEvent (event_sp);
3415 
3416             }
3417         }
3418 
3419         if (PrivateStateThreadIsValid ())
3420             ResumePrivateStateThread ();
3421         else
3422             StartPrivateStateThread ();
3423     }
3424     return error;
3425 }
3426 
3427 
3428 Error
3429 Process::PrivateResume ()
3430 {
3431     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_STEP));
3432     if (log)
3433         log->Printf("Process::PrivateResume() m_stop_id = %u, public state: %s private state: %s",
3434                     m_mod_id.GetStopID(),
3435                     StateAsCString(m_public_state.GetValue()),
3436                     StateAsCString(m_private_state.GetValue()));
3437 
3438     Error error (WillResume());
3439     // Tell the process it is about to resume before the thread list
3440     if (error.Success())
3441     {
3442         // Now let the thread list know we are about to resume so it
3443         // can let all of our threads know that they are about to be
3444         // resumed. Threads will each be called with
3445         // Thread::WillResume(StateType) where StateType contains the state
3446         // that they are supposed to have when the process is resumed
3447         // (suspended/running/stepping). Threads should also check
3448         // their resume signal in lldb::Thread::GetResumeSignal()
3449         // to see if they are supposed to start back up with a signal.
3450         if (m_thread_list.WillResume())
3451         {
3452             // Last thing, do the PreResumeActions.
3453             if (!RunPreResumeActions())
3454             {
3455                 error.SetErrorStringWithFormat ("Process::PrivateResume PreResumeActions failed, not resuming.");
3456             }
3457             else
3458             {
3459                 m_mod_id.BumpResumeID();
3460                 error = DoResume();
3461                 if (error.Success())
3462                 {
3463                     DidResume();
3464                     m_thread_list.DidResume();
3465                     if (log)
3466                         log->Printf ("Process thinks the process has resumed.");
3467                 }
3468             }
3469         }
3470         else
3471         {
3472             // Somebody wanted to run without running.  So generate a continue & a stopped event,
3473             // and let the world handle them.
3474             if (log)
3475                 log->Printf ("Process::PrivateResume() asked to simulate a start & stop.");
3476 
3477             SetPrivateState(eStateRunning);
3478             SetPrivateState(eStateStopped);
3479         }
3480     }
3481     else if (log)
3482         log->Printf ("Process::PrivateResume() got an error \"%s\".", error.AsCString("<unknown error>"));
3483     return error;
3484 }
3485 
3486 Error
3487 Process::Halt (bool clear_thread_plans)
3488 {
3489     // Don't clear the m_clear_thread_plans_on_stop, only set it to true if
3490     // in case it was already set and some thread plan logic calls halt on its
3491     // own.
3492     m_clear_thread_plans_on_stop |= clear_thread_plans;
3493 
3494     // First make sure we aren't in the middle of handling an event, or we might restart.  This is pretty weak, since
3495     // we could just straightaway get another event.  It just narrows the window...
3496     m_currently_handling_event.WaitForValueEqualTo(false);
3497 
3498 
3499     // Pause our private state thread so we can ensure no one else eats
3500     // the stop event out from under us.
3501     Listener halt_listener ("lldb.process.halt_listener");
3502     HijackPrivateProcessEvents(&halt_listener);
3503 
3504     EventSP event_sp;
3505     Error error (WillHalt());
3506 
3507     if (error.Success())
3508     {
3509 
3510         bool caused_stop = false;
3511 
3512         // Ask the process subclass to actually halt our process
3513         error = DoHalt(caused_stop);
3514         if (error.Success())
3515         {
3516             if (m_public_state.GetValue() == eStateAttaching)
3517             {
3518                 SetExitStatus(SIGKILL, "Cancelled async attach.");
3519                 Destroy ();
3520             }
3521             else
3522             {
3523                 // If "caused_stop" is true, then DoHalt stopped the process. If
3524                 // "caused_stop" is false, the process was already stopped.
3525                 // If the DoHalt caused the process to stop, then we want to catch
3526                 // this event and set the interrupted bool to true before we pass
3527                 // this along so clients know that the process was interrupted by
3528                 // a halt command.
3529                 if (caused_stop)
3530                 {
3531                     // Wait for 1 second for the process to stop.
3532                     TimeValue timeout_time;
3533                     timeout_time = TimeValue::Now();
3534                     timeout_time.OffsetWithSeconds(1);
3535                     bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp);
3536                     StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
3537 
3538                     if (!got_event || state == eStateInvalid)
3539                     {
3540                         // We timeout out and didn't get a stop event...
3541                         error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState()));
3542                     }
3543                     else
3544                     {
3545                         if (StateIsStoppedState (state, false))
3546                         {
3547                             // We caused the process to interrupt itself, so mark this
3548                             // as such in the stop event so clients can tell an interrupted
3549                             // process from a natural stop
3550                             ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
3551                         }
3552                         else
3553                         {
3554                             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3555                             if (log)
3556                                 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
3557                             error.SetErrorString ("Did not get stopped event after halt.");
3558                         }
3559                     }
3560                 }
3561                 DidHalt();
3562             }
3563         }
3564     }
3565     // Resume our private state thread before we post the event (if any)
3566     RestorePrivateProcessEvents();
3567 
3568     // Post any event we might have consumed. If all goes well, we will have
3569     // stopped the process, intercepted the event and set the interrupted
3570     // bool in the event.  Post it to the private event queue and that will end up
3571     // correctly setting the state.
3572     if (event_sp)
3573         m_private_state_broadcaster.BroadcastEvent(event_sp);
3574 
3575     return error;
3576 }
3577 
3578 Error
3579 Process::HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp)
3580 {
3581     Error error;
3582     if (m_public_state.GetValue() == eStateRunning)
3583     {
3584         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3585         if (log)
3586             log->Printf("Process::Destroy() About to halt.");
3587         error = Halt();
3588         if (error.Success())
3589         {
3590             // Consume the halt event.
3591             TimeValue timeout (TimeValue::Now());
3592             timeout.OffsetWithSeconds(1);
3593             StateType state = WaitForProcessToStop (&timeout, &exit_event_sp);
3594 
3595             // If the process exited while we were waiting for it to stop, put the exited event into
3596             // the shared pointer passed in and return.  Our caller doesn't need to do anything else, since
3597             // they don't have a process anymore...
3598 
3599             if (state == eStateExited || m_private_state.GetValue() == eStateExited)
3600             {
3601                 if (log)
3602                     log->Printf("Process::HaltForDestroyOrDetach() Process exited while waiting to Halt.");
3603                 return error;
3604             }
3605             else
3606                 exit_event_sp.reset(); // It is ok to consume any non-exit stop events
3607 
3608             if (state != eStateStopped)
3609             {
3610                 if (log)
3611                     log->Printf("Process::HaltForDestroyOrDetach() Halt failed to stop, state is: %s", StateAsCString(state));
3612                 // If we really couldn't stop the process then we should just error out here, but if the
3613                 // lower levels just bobbled sending the event and we really are stopped, then continue on.
3614                 StateType private_state = m_private_state.GetValue();
3615                 if (private_state != eStateStopped)
3616                 {
3617                     return error;
3618                 }
3619             }
3620         }
3621         else
3622         {
3623             if (log)
3624                 log->Printf("Process::HaltForDestroyOrDetach() Halt got error: %s", error.AsCString());
3625         }
3626     }
3627     return error;
3628 }
3629 
3630 Error
3631 Process::Detach (bool keep_stopped)
3632 {
3633     EventSP exit_event_sp;
3634     Error error;
3635     m_destroy_in_process = true;
3636 
3637     error = WillDetach();
3638 
3639     if (error.Success())
3640     {
3641         if (DetachRequiresHalt())
3642         {
3643             error = HaltForDestroyOrDetach (exit_event_sp);
3644             if (!error.Success())
3645             {
3646                 m_destroy_in_process = false;
3647                 return error;
3648             }
3649             else if (exit_event_sp)
3650             {
3651                 // We shouldn't need to do anything else here.  There's no process left to detach from...
3652                 StopPrivateStateThread();
3653                 m_destroy_in_process = false;
3654                 return error;
3655             }
3656         }
3657 
3658         error = DoDetach(keep_stopped);
3659         if (error.Success())
3660         {
3661             DidDetach();
3662             StopPrivateStateThread();
3663         }
3664         else
3665         {
3666             return error;
3667         }
3668     }
3669     m_destroy_in_process = false;
3670 
3671     // If we exited when we were waiting for a process to stop, then
3672     // forward the event here so we don't lose the event
3673     if (exit_event_sp)
3674     {
3675         // Directly broadcast our exited event because we shut down our
3676         // private state thread above
3677         BroadcastEvent(exit_event_sp);
3678     }
3679 
3680     // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3681     // the last events through the event system, in which case we might strand the write lock.  Unlock
3682     // it here so when we do to tear down the process we don't get an error destroying the lock.
3683 
3684     m_public_run_lock.SetStopped();
3685     return error;
3686 }
3687 
3688 Error
3689 Process::Destroy ()
3690 {
3691 
3692     // Tell ourselves we are in the process of destroying the process, so that we don't do any unnecessary work
3693     // that might hinder the destruction.  Remember to set this back to false when we are done.  That way if the attempt
3694     // failed and the process stays around for some reason it won't be in a confused state.
3695 
3696     m_destroy_in_process = true;
3697 
3698     Error error (WillDestroy());
3699     if (error.Success())
3700     {
3701         EventSP exit_event_sp;
3702         if (DestroyRequiresHalt())
3703         {
3704             error = HaltForDestroyOrDetach(exit_event_sp);
3705         }
3706 
3707         if (m_public_state.GetValue() != eStateRunning)
3708         {
3709             // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to
3710             // kill it, we don't want it hitting a breakpoint...
3711             // Only do this if we've stopped, however, since if we didn't manage to halt it above, then
3712             // we're not going to have much luck doing this now.
3713             m_thread_list.DiscardThreadPlans();
3714             DisableAllBreakpointSites();
3715         }
3716 
3717         error = DoDestroy();
3718         if (error.Success())
3719         {
3720             DidDestroy();
3721             StopPrivateStateThread();
3722         }
3723         m_stdio_communication.StopReadThread();
3724         m_stdio_communication.Disconnect();
3725         if (m_process_input_reader && m_process_input_reader->IsActive())
3726             m_target.GetDebugger().PopInputReader (m_process_input_reader);
3727         if (m_process_input_reader)
3728             m_process_input_reader.reset();
3729 
3730         // If we exited when we were waiting for a process to stop, then
3731         // forward the event here so we don't lose the event
3732         if (exit_event_sp)
3733         {
3734             // Directly broadcast our exited event because we shut down our
3735             // private state thread above
3736             BroadcastEvent(exit_event_sp);
3737         }
3738 
3739         // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3740         // the last events through the event system, in which case we might strand the write lock.  Unlock
3741         // it here so when we do to tear down the process we don't get an error destroying the lock.
3742         m_public_run_lock.SetStopped();
3743     }
3744 
3745     m_destroy_in_process = false;
3746 
3747     return error;
3748 }
3749 
3750 Error
3751 Process::Signal (int signal)
3752 {
3753     Error error (WillSignal());
3754     if (error.Success())
3755     {
3756         error = DoSignal(signal);
3757         if (error.Success())
3758             DidSignal();
3759     }
3760     return error;
3761 }
3762 
3763 lldb::ByteOrder
3764 Process::GetByteOrder () const
3765 {
3766     return m_target.GetArchitecture().GetByteOrder();
3767 }
3768 
3769 uint32_t
3770 Process::GetAddressByteSize () const
3771 {
3772     return m_target.GetArchitecture().GetAddressByteSize();
3773 }
3774 
3775 
3776 bool
3777 Process::ShouldBroadcastEvent (Event *event_ptr)
3778 {
3779     const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
3780     bool return_value = true;
3781     Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EVENTS | LIBLLDB_LOG_PROCESS));
3782 
3783     switch (state)
3784     {
3785         case eStateConnected:
3786         case eStateAttaching:
3787         case eStateLaunching:
3788         case eStateDetached:
3789         case eStateExited:
3790         case eStateUnloaded:
3791             // These events indicate changes in the state of the debugging session, always report them.
3792             return_value = true;
3793             break;
3794         case eStateInvalid:
3795             // We stopped for no apparent reason, don't report it.
3796             return_value = false;
3797             break;
3798         case eStateRunning:
3799         case eStateStepping:
3800             // If we've started the target running, we handle the cases where we
3801             // are already running and where there is a transition from stopped to
3802             // running differently.
3803             // running -> running: Automatically suppress extra running events
3804             // stopped -> running: Report except when there is one or more no votes
3805             //     and no yes votes.
3806             SynchronouslyNotifyStateChanged (state);
3807             switch (m_last_broadcast_state)
3808             {
3809                 case eStateRunning:
3810                 case eStateStepping:
3811                     // We always suppress multiple runnings with no PUBLIC stop in between.
3812                     return_value = false;
3813                     break;
3814                 default:
3815                     // TODO: make this work correctly. For now always report
3816                     // run if we aren't running so we don't miss any runnning
3817                     // events. If I run the lldb/test/thread/a.out file and
3818                     // break at main.cpp:58, run and hit the breakpoints on
3819                     // multiple threads, then somehow during the stepping over
3820                     // of all breakpoints no run gets reported.
3821 
3822                     // This is a transition from stop to run.
3823                     switch (m_thread_list.ShouldReportRun (event_ptr))
3824                     {
3825                         case eVoteYes:
3826                         case eVoteNoOpinion:
3827                             return_value = true;
3828                             break;
3829                         case eVoteNo:
3830                             return_value = false;
3831                             break;
3832                     }
3833                     break;
3834             }
3835             break;
3836         case eStateStopped:
3837         case eStateCrashed:
3838         case eStateSuspended:
3839         {
3840             // We've stopped.  First see if we're going to restart the target.
3841             // If we are going to stop, then we always broadcast the event.
3842             // If we aren't going to stop, let the thread plans decide if we're going to report this event.
3843             // If no thread has an opinion, we don't report it.
3844 
3845             RefreshStateAfterStop ();
3846             if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
3847             {
3848                 if (log)
3849                     log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s",
3850                                  event_ptr,
3851                                  StateAsCString(state));
3852                 return_value = true;
3853             }
3854             else
3855             {
3856                 bool was_restarted = ProcessEventData::GetRestartedFromEvent (event_ptr);
3857                 bool should_resume = false;
3858 
3859                 // It makes no sense to ask "ShouldStop" if we've already been restarted...
3860                 // Asking the thread list is also not likely to go well, since we are running again.
3861                 // So in that case just report the event.
3862 
3863                 if (!was_restarted)
3864                     should_resume = m_thread_list.ShouldStop (event_ptr) == false;
3865 
3866                 if (was_restarted || should_resume || m_resume_requested)
3867                 {
3868                     Vote stop_vote = m_thread_list.ShouldReportStop (event_ptr);
3869                     if (log)
3870                         log->Printf ("Process::ShouldBroadcastEvent: should_stop: %i state: %s was_restarted: %i stop_vote: %d.",
3871                                      should_resume,
3872                                      StateAsCString(state),
3873                                      was_restarted,
3874                                      stop_vote);
3875 
3876                     switch (stop_vote)
3877                     {
3878                         case eVoteYes:
3879                             return_value = true;
3880                             break;
3881                         case eVoteNoOpinion:
3882                         case eVoteNo:
3883                             return_value = false;
3884                             break;
3885                     }
3886 
3887                     if (!was_restarted)
3888                     {
3889                         if (log)
3890                             log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
3891                         ProcessEventData::SetRestartedInEvent(event_ptr, true);
3892                         PrivateResume ();
3893                     }
3894 
3895                 }
3896                 else
3897                 {
3898                     return_value = true;
3899                     SynchronouslyNotifyStateChanged (state);
3900                 }
3901             }
3902         }
3903         break;
3904     }
3905 
3906     // We do some coalescing of events (for instance two consecutive running events get coalesced.)
3907     // But we only coalesce against events we actually broadcast.  So we use m_last_broadcast_state
3908     // to track that.  NB - you can't use "m_public_state.GetValue()" for that purpose, as was originally done,
3909     // because the PublicState reflects the last event pulled off the queue, and there may be several
3910     // events stacked up on the queue unserviced.  So the PublicState may not reflect the last broadcasted event
3911     // yet.  m_last_broadcast_state gets updated here.
3912 
3913     if (return_value)
3914         m_last_broadcast_state = state;
3915 
3916     if (log)
3917         log->Printf ("Process::ShouldBroadcastEvent (%p) => new state: %s, last broadcast state: %s - %s",
3918                      event_ptr,
3919                      StateAsCString(state),
3920                      StateAsCString(m_last_broadcast_state),
3921                      return_value ? "YES" : "NO");
3922     return return_value;
3923 }
3924 
3925 
3926 bool
3927 Process::StartPrivateStateThread (bool force)
3928 {
3929     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
3930 
3931     bool already_running = PrivateStateThreadIsValid ();
3932     if (log)
3933         log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
3934 
3935     if (!force && already_running)
3936         return true;
3937 
3938     // Create a thread that watches our internal state and controls which
3939     // events make it to clients (into the DCProcess event queue).
3940     char thread_name[1024];
3941     if (already_running)
3942         snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%" PRIu64 ")>", GetID());
3943     else
3944         snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID());
3945 
3946     // Create the private state thread, and start it running.
3947     m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL);
3948     bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread);
3949     if (success)
3950     {
3951         ResumePrivateStateThread();
3952         return true;
3953     }
3954     else
3955         return false;
3956 }
3957 
3958 void
3959 Process::PausePrivateStateThread ()
3960 {
3961     ControlPrivateStateThread (eBroadcastInternalStateControlPause);
3962 }
3963 
3964 void
3965 Process::ResumePrivateStateThread ()
3966 {
3967     ControlPrivateStateThread (eBroadcastInternalStateControlResume);
3968 }
3969 
3970 void
3971 Process::StopPrivateStateThread ()
3972 {
3973     if (PrivateStateThreadIsValid ())
3974         ControlPrivateStateThread (eBroadcastInternalStateControlStop);
3975     else
3976     {
3977         Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3978         if (log)
3979             log->Printf ("Went to stop the private state thread, but it was already invalid.");
3980     }
3981 }
3982 
3983 void
3984 Process::ControlPrivateStateThread (uint32_t signal)
3985 {
3986     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3987 
3988     assert (signal == eBroadcastInternalStateControlStop ||
3989             signal == eBroadcastInternalStateControlPause ||
3990             signal == eBroadcastInternalStateControlResume);
3991 
3992     if (log)
3993         log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
3994 
3995     // Signal the private state thread. First we should copy this is case the
3996     // thread starts exiting since the private state thread will NULL this out
3997     // when it exits
3998     const lldb::thread_t private_state_thread = m_private_state_thread;
3999     if (IS_VALID_LLDB_HOST_THREAD(private_state_thread))
4000     {
4001         TimeValue timeout_time;
4002         bool timed_out;
4003 
4004         m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
4005 
4006         timeout_time = TimeValue::Now();
4007         timeout_time.OffsetWithSeconds(2);
4008         if (log)
4009             log->Printf ("Sending control event of type: %d.", signal);
4010         m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
4011         m_private_state_control_wait.SetValue (false, eBroadcastNever);
4012 
4013         if (signal == eBroadcastInternalStateControlStop)
4014         {
4015             if (timed_out)
4016             {
4017                 Error error;
4018                 Host::ThreadCancel (private_state_thread, &error);
4019                 if (log)
4020                     log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString());
4021             }
4022             else
4023             {
4024                 if (log)
4025                     log->Printf ("The control event killed the private state thread without having to cancel.");
4026             }
4027 
4028             thread_result_t result = NULL;
4029             Host::ThreadJoin (private_state_thread, &result, NULL);
4030             m_private_state_thread = LLDB_INVALID_HOST_THREAD;
4031         }
4032     }
4033     else
4034     {
4035         if (log)
4036             log->Printf ("Private state thread already dead, no need to signal it to stop.");
4037     }
4038 }
4039 
4040 void
4041 Process::SendAsyncInterrupt ()
4042 {
4043     if (PrivateStateThreadIsValid())
4044         m_private_state_broadcaster.BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
4045     else
4046         BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
4047 }
4048 
4049 void
4050 Process::HandlePrivateEvent (EventSP &event_sp)
4051 {
4052     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4053     m_resume_requested = false;
4054 
4055     m_currently_handling_event.SetValue(true, eBroadcastNever);
4056 
4057     const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4058 
4059     // First check to see if anybody wants a shot at this event:
4060     if (m_next_event_action_ap.get() != NULL)
4061     {
4062         NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
4063         if (log)
4064             log->Printf ("Ran next event action, result was %d.", action_result);
4065 
4066         switch (action_result)
4067         {
4068             case NextEventAction::eEventActionSuccess:
4069                 SetNextEventAction(NULL);
4070                 break;
4071 
4072             case NextEventAction::eEventActionRetry:
4073                 break;
4074 
4075             case NextEventAction::eEventActionExit:
4076                 // Handle Exiting Here.  If we already got an exited event,
4077                 // we should just propagate it.  Otherwise, swallow this event,
4078                 // and set our state to exit so the next event will kill us.
4079                 if (new_state != eStateExited)
4080                 {
4081                     // FIXME: should cons up an exited event, and discard this one.
4082                     SetExitStatus(0, m_next_event_action_ap->GetExitString());
4083                     m_currently_handling_event.SetValue(false, eBroadcastAlways);
4084                     SetNextEventAction(NULL);
4085                     return;
4086                 }
4087                 SetNextEventAction(NULL);
4088                 break;
4089         }
4090     }
4091 
4092     // See if we should broadcast this state to external clients?
4093     const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
4094 
4095     if (should_broadcast)
4096     {
4097         if (log)
4098         {
4099             log->Printf ("Process::%s (pid = %" PRIu64 ") broadcasting new state %s (old state %s) to %s",
4100                          __FUNCTION__,
4101                          GetID(),
4102                          StateAsCString(new_state),
4103                          StateAsCString (GetState ()),
4104                          IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
4105         }
4106         Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
4107         if (StateIsRunningState (new_state))
4108             PushProcessInputReader ();
4109         else if (!Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
4110             PopProcessInputReader ();
4111 
4112         BroadcastEvent (event_sp);
4113     }
4114     else
4115     {
4116         if (log)
4117         {
4118             log->Printf ("Process::%s (pid = %" PRIu64 ") suppressing state %s (old state %s): should_broadcast == false",
4119                          __FUNCTION__,
4120                          GetID(),
4121                          StateAsCString(new_state),
4122                          StateAsCString (GetState ()));
4123         }
4124     }
4125     m_currently_handling_event.SetValue(false, eBroadcastAlways);
4126 }
4127 
4128 thread_result_t
4129 Process::PrivateStateThread (void *arg)
4130 {
4131     Process *proc = static_cast<Process*> (arg);
4132     thread_result_t result = proc->RunPrivateStateThread();
4133     return result;
4134 }
4135 
4136 thread_result_t
4137 Process::RunPrivateStateThread ()
4138 {
4139     bool control_only = true;
4140     m_private_state_control_wait.SetValue (false, eBroadcastNever);
4141 
4142     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4143     if (log)
4144         log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...", __FUNCTION__, this, GetID());
4145 
4146     bool exit_now = false;
4147     while (!exit_now)
4148     {
4149         EventSP event_sp;
4150         WaitForEventsPrivate (NULL, event_sp, control_only);
4151         if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
4152         {
4153             if (log)
4154                 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
4155 
4156             switch (event_sp->GetType())
4157             {
4158             case eBroadcastInternalStateControlStop:
4159                 exit_now = true;
4160                 break;      // doing any internal state managment below
4161 
4162             case eBroadcastInternalStateControlPause:
4163                 control_only = true;
4164                 break;
4165 
4166             case eBroadcastInternalStateControlResume:
4167                 control_only = false;
4168                 break;
4169             }
4170 
4171             m_private_state_control_wait.SetValue (true, eBroadcastAlways);
4172             continue;
4173         }
4174         else if (event_sp->GetType() == eBroadcastBitInterrupt)
4175         {
4176             if (m_public_state.GetValue() == eStateAttaching)
4177             {
4178                 if (log)
4179                     log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt while attaching - forwarding interrupt.", __FUNCTION__, this, GetID());
4180                 BroadcastEvent (eBroadcastBitInterrupt, NULL);
4181             }
4182             else
4183             {
4184                 if (log)
4185                     log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt - Halting.", __FUNCTION__, this, GetID());
4186                 Halt();
4187             }
4188             continue;
4189         }
4190 
4191         const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4192 
4193         if (internal_state != eStateInvalid)
4194         {
4195             if (m_clear_thread_plans_on_stop &&
4196                 StateIsStoppedState(internal_state, true))
4197             {
4198                 m_clear_thread_plans_on_stop = false;
4199                 m_thread_list.DiscardThreadPlans();
4200             }
4201             HandlePrivateEvent (event_sp);
4202         }
4203 
4204         if (internal_state == eStateInvalid ||
4205             internal_state == eStateExited  ||
4206             internal_state == eStateDetached )
4207         {
4208             if (log)
4209                 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
4210 
4211             break;
4212         }
4213     }
4214 
4215     // Verify log is still enabled before attempting to write to it...
4216     if (log)
4217         log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...", __FUNCTION__, this, GetID());
4218 
4219     m_public_run_lock.SetStopped();
4220     m_private_state_control_wait.SetValue (true, eBroadcastAlways);
4221     m_private_state_thread = LLDB_INVALID_HOST_THREAD;
4222     return NULL;
4223 }
4224 
4225 //------------------------------------------------------------------
4226 // Process Event Data
4227 //------------------------------------------------------------------
4228 
4229 Process::ProcessEventData::ProcessEventData () :
4230     EventData (),
4231     m_process_sp (),
4232     m_state (eStateInvalid),
4233     m_restarted (false),
4234     m_update_state (0),
4235     m_interrupted (false)
4236 {
4237 }
4238 
4239 Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
4240     EventData (),
4241     m_process_sp (process_sp),
4242     m_state (state),
4243     m_restarted (false),
4244     m_update_state (0),
4245     m_interrupted (false)
4246 {
4247 }
4248 
4249 Process::ProcessEventData::~ProcessEventData()
4250 {
4251 }
4252 
4253 const ConstString &
4254 Process::ProcessEventData::GetFlavorString ()
4255 {
4256     static ConstString g_flavor ("Process::ProcessEventData");
4257     return g_flavor;
4258 }
4259 
4260 const ConstString &
4261 Process::ProcessEventData::GetFlavor () const
4262 {
4263     return ProcessEventData::GetFlavorString ();
4264 }
4265 
4266 void
4267 Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
4268 {
4269     // This function gets called twice for each event, once when the event gets pulled
4270     // off of the private process event queue, and then any number of times, first when it gets pulled off of
4271     // the public event queue, then other times when we're pretending that this is where we stopped at the
4272     // end of expression evaluation.  m_update_state is used to distinguish these
4273     // three cases; it is 0 when we're just pulling it off for private handling,
4274     // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
4275     if (m_update_state != 1)
4276         return;
4277 
4278     m_process_sp->SetPublicState (m_state, Process::ProcessEventData::GetRestartedFromEvent(event_ptr));
4279 
4280     // If we're stopped and haven't restarted, then do the breakpoint commands here:
4281     if (m_state == eStateStopped && ! m_restarted)
4282     {
4283         ThreadList &curr_thread_list = m_process_sp->GetThreadList();
4284         uint32_t num_threads = curr_thread_list.GetSize();
4285         uint32_t idx;
4286 
4287         // The actions might change one of the thread's stop_info's opinions about whether we should
4288         // stop the process, so we need to query that as we go.
4289 
4290         // One other complication here, is that we try to catch any case where the target has run (except for expressions)
4291         // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and
4292         // that would cause our iteration here to crash.  We could make a copy of the thread list, but we'd really like
4293         // 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
4294         // against this list & bag out if anything differs.
4295         std::vector<uint32_t> thread_index_array(num_threads);
4296         for (idx = 0; idx < num_threads; ++idx)
4297             thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID();
4298 
4299         // Use this to track whether we should continue from here.  We will only continue the target running if
4300         // no thread says we should stop.  Of course if some thread's PerformAction actually sets the target running,
4301         // then it doesn't matter what the other threads say...
4302 
4303         bool still_should_stop = false;
4304 
4305         // Sometimes - for instance if we have a bug in the stub we are talking to, we stop but no thread has a
4306         // valid stop reason.  In that case we should just stop, because we have no way of telling what the right
4307         // thing to do is, and it's better to let the user decide than continue behind their backs.
4308 
4309         bool does_anybody_have_an_opinion = false;
4310 
4311         for (idx = 0; idx < num_threads; ++idx)
4312         {
4313             curr_thread_list = m_process_sp->GetThreadList();
4314             if (curr_thread_list.GetSize() != num_threads)
4315             {
4316                 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
4317                 if (log)
4318                     log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize());
4319                 break;
4320             }
4321 
4322             lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
4323 
4324             if (thread_sp->GetIndexID() != thread_index_array[idx])
4325             {
4326                 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
4327                 if (log)
4328                     log->Printf("The thread at position %u changed from %u to %u while processing event.",
4329                                 idx,
4330                                 thread_index_array[idx],
4331                                 thread_sp->GetIndexID());
4332                 break;
4333             }
4334 
4335             StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
4336             if (stop_info_sp && stop_info_sp->IsValid())
4337             {
4338                 does_anybody_have_an_opinion = true;
4339                 bool this_thread_wants_to_stop;
4340                 if (stop_info_sp->GetOverrideShouldStop())
4341                 {
4342                     this_thread_wants_to_stop = stop_info_sp->GetOverriddenShouldStopValue();
4343                 }
4344                 else
4345                 {
4346                     stop_info_sp->PerformAction(event_ptr);
4347                     // The stop action might restart the target.  If it does, then we want to mark that in the
4348                     // event so that whoever is receiving it will know to wait for the running event and reflect
4349                     // that state appropriately.
4350                     // We also need to stop processing actions, since they aren't expecting the target to be running.
4351 
4352                     // FIXME: we might have run.
4353                     if (stop_info_sp->HasTargetRunSinceMe())
4354                     {
4355                         SetRestarted (true);
4356                         break;
4357                     }
4358 
4359                     this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
4360                 }
4361 
4362                 if (still_should_stop == false)
4363                     still_should_stop = this_thread_wants_to_stop;
4364             }
4365         }
4366 
4367 
4368         if (!GetRestarted())
4369         {
4370             if (!still_should_stop && does_anybody_have_an_opinion)
4371             {
4372                 // We've been asked to continue, so do that here.
4373                 SetRestarted(true);
4374                 // Use the public resume method here, since this is just
4375                 // extending a public resume.
4376                 m_process_sp->PrivateResume();
4377             }
4378             else
4379             {
4380                 // If we didn't restart, run the Stop Hooks here:
4381                 // They might also restart the target, so watch for that.
4382                 m_process_sp->GetTarget().RunStopHooks();
4383                 if (m_process_sp->GetPrivateState() == eStateRunning)
4384                     SetRestarted(true);
4385             }
4386         }
4387     }
4388 }
4389 
4390 void
4391 Process::ProcessEventData::Dump (Stream *s) const
4392 {
4393     if (m_process_sp)
4394         s->Printf(" process = %p (pid = %" PRIu64 "), ", m_process_sp.get(), m_process_sp->GetID());
4395 
4396     s->Printf("state = %s", StateAsCString(GetState()));
4397 }
4398 
4399 const Process::ProcessEventData *
4400 Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
4401 {
4402     if (event_ptr)
4403     {
4404         const EventData *event_data = event_ptr->GetData();
4405         if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
4406             return static_cast <const ProcessEventData *> (event_ptr->GetData());
4407     }
4408     return NULL;
4409 }
4410 
4411 ProcessSP
4412 Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
4413 {
4414     ProcessSP process_sp;
4415     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4416     if (data)
4417         process_sp = data->GetProcessSP();
4418     return process_sp;
4419 }
4420 
4421 StateType
4422 Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
4423 {
4424     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4425     if (data == NULL)
4426         return eStateInvalid;
4427     else
4428         return data->GetState();
4429 }
4430 
4431 bool
4432 Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
4433 {
4434     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4435     if (data == NULL)
4436         return false;
4437     else
4438         return data->GetRestarted();
4439 }
4440 
4441 void
4442 Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
4443 {
4444     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4445     if (data != NULL)
4446         data->SetRestarted(new_value);
4447 }
4448 
4449 size_t
4450 Process::ProcessEventData::GetNumRestartedReasons(const Event *event_ptr)
4451 {
4452     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4453     if (data != NULL)
4454         return data->GetNumRestartedReasons();
4455     else
4456         return 0;
4457 }
4458 
4459 const char *
4460 Process::ProcessEventData::GetRestartedReasonAtIndex(const Event *event_ptr, size_t idx)
4461 {
4462     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4463     if (data != NULL)
4464         return data->GetRestartedReasonAtIndex(idx);
4465     else
4466         return NULL;
4467 }
4468 
4469 void
4470 Process::ProcessEventData::AddRestartedReason (Event *event_ptr, const char *reason)
4471 {
4472     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4473     if (data != NULL)
4474         data->AddRestartedReason(reason);
4475 }
4476 
4477 bool
4478 Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
4479 {
4480     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4481     if (data == NULL)
4482         return false;
4483     else
4484         return data->GetInterrupted ();
4485 }
4486 
4487 void
4488 Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
4489 {
4490     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4491     if (data != NULL)
4492         data->SetInterrupted(new_value);
4493 }
4494 
4495 bool
4496 Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
4497 {
4498     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4499     if (data)
4500     {
4501         data->SetUpdateStateOnRemoval();
4502         return true;
4503     }
4504     return false;
4505 }
4506 
4507 lldb::TargetSP
4508 Process::CalculateTarget ()
4509 {
4510     return m_target.shared_from_this();
4511 }
4512 
4513 void
4514 Process::CalculateExecutionContext (ExecutionContext &exe_ctx)
4515 {
4516     exe_ctx.SetTargetPtr (&m_target);
4517     exe_ctx.SetProcessPtr (this);
4518     exe_ctx.SetThreadPtr(NULL);
4519     exe_ctx.SetFramePtr (NULL);
4520 }
4521 
4522 //uint32_t
4523 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
4524 //{
4525 //    return 0;
4526 //}
4527 //
4528 //ArchSpec
4529 //Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
4530 //{
4531 //    return Host::GetArchSpecForExistingProcess (pid);
4532 //}
4533 //
4534 //ArchSpec
4535 //Process::GetArchSpecForExistingProcess (const char *process_name)
4536 //{
4537 //    return Host::GetArchSpecForExistingProcess (process_name);
4538 //}
4539 //
4540 void
4541 Process::AppendSTDOUT (const char * s, size_t len)
4542 {
4543     Mutex::Locker locker (m_stdio_communication_mutex);
4544     m_stdout_data.append (s, len);
4545     BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (shared_from_this(), GetState()));
4546 }
4547 
4548 void
4549 Process::AppendSTDERR (const char * s, size_t len)
4550 {
4551     Mutex::Locker locker (m_stdio_communication_mutex);
4552     m_stderr_data.append (s, len);
4553     BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState()));
4554 }
4555 
4556 void
4557 Process::BroadcastAsyncProfileData(const std::string &one_profile_data)
4558 {
4559     Mutex::Locker locker (m_profile_data_comm_mutex);
4560     m_profile_data.push_back(one_profile_data);
4561     BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState()));
4562 }
4563 
4564 size_t
4565 Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
4566 {
4567     Mutex::Locker locker(m_profile_data_comm_mutex);
4568     if (m_profile_data.empty())
4569         return 0;
4570 
4571     std::string &one_profile_data = m_profile_data.front();
4572     size_t bytes_available = one_profile_data.size();
4573     if (bytes_available > 0)
4574     {
4575         Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4576         if (log)
4577             log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
4578         if (bytes_available > buf_size)
4579         {
4580             memcpy(buf, one_profile_data.c_str(), buf_size);
4581             one_profile_data.erase(0, buf_size);
4582             bytes_available = buf_size;
4583         }
4584         else
4585         {
4586             memcpy(buf, one_profile_data.c_str(), bytes_available);
4587             m_profile_data.erase(m_profile_data.begin());
4588         }
4589     }
4590     return bytes_available;
4591 }
4592 
4593 
4594 //------------------------------------------------------------------
4595 // Process STDIO
4596 //------------------------------------------------------------------
4597 
4598 size_t
4599 Process::GetSTDOUT (char *buf, size_t buf_size, Error &error)
4600 {
4601     Mutex::Locker locker(m_stdio_communication_mutex);
4602     size_t bytes_available = m_stdout_data.size();
4603     if (bytes_available > 0)
4604     {
4605         Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4606         if (log)
4607             log->Printf ("Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
4608         if (bytes_available > buf_size)
4609         {
4610             memcpy(buf, m_stdout_data.c_str(), buf_size);
4611             m_stdout_data.erase(0, buf_size);
4612             bytes_available = buf_size;
4613         }
4614         else
4615         {
4616             memcpy(buf, m_stdout_data.c_str(), bytes_available);
4617             m_stdout_data.clear();
4618         }
4619     }
4620     return bytes_available;
4621 }
4622 
4623 
4624 size_t
4625 Process::GetSTDERR (char *buf, size_t buf_size, Error &error)
4626 {
4627     Mutex::Locker locker(m_stdio_communication_mutex);
4628     size_t bytes_available = m_stderr_data.size();
4629     if (bytes_available > 0)
4630     {
4631         Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
4632         if (log)
4633             log->Printf ("Process::GetSTDERR (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
4634         if (bytes_available > buf_size)
4635         {
4636             memcpy(buf, m_stderr_data.c_str(), buf_size);
4637             m_stderr_data.erase(0, buf_size);
4638             bytes_available = buf_size;
4639         }
4640         else
4641         {
4642             memcpy(buf, m_stderr_data.c_str(), bytes_available);
4643             m_stderr_data.clear();
4644         }
4645     }
4646     return bytes_available;
4647 }
4648 
4649 void
4650 Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
4651 {
4652     Process *process = (Process *) baton;
4653     process->AppendSTDOUT (static_cast<const char *>(src), src_len);
4654 }
4655 
4656 size_t
4657 Process::ProcessInputReaderCallback (void *baton,
4658                                      InputReader &reader,
4659                                      lldb::InputReaderAction notification,
4660                                      const char *bytes,
4661                                      size_t bytes_len)
4662 {
4663     Process *process = (Process *) baton;
4664 
4665     switch (notification)
4666     {
4667     case eInputReaderActivate:
4668         break;
4669 
4670     case eInputReaderDeactivate:
4671         break;
4672 
4673     case eInputReaderReactivate:
4674         break;
4675 
4676     case eInputReaderAsynchronousOutputWritten:
4677         break;
4678 
4679     case eInputReaderGotToken:
4680         {
4681             Error error;
4682             process->PutSTDIN (bytes, bytes_len, error);
4683         }
4684         break;
4685 
4686     case eInputReaderInterrupt:
4687         process->SendAsyncInterrupt();
4688         break;
4689 
4690     case eInputReaderEndOfFile:
4691         process->AppendSTDOUT ("^D", 2);
4692         break;
4693 
4694     case eInputReaderDone:
4695         break;
4696 
4697     }
4698 
4699     return bytes_len;
4700 }
4701 
4702 void
4703 Process::ResetProcessInputReader ()
4704 {
4705     m_process_input_reader.reset();
4706 }
4707 
4708 void
4709 Process::SetSTDIOFileDescriptor (int file_descriptor)
4710 {
4711     // First set up the Read Thread for reading/handling process I/O
4712 
4713     std::unique_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
4714 
4715     if (conn_ap.get())
4716     {
4717         m_stdio_communication.SetConnection (conn_ap.release());
4718         if (m_stdio_communication.IsConnected())
4719         {
4720             m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
4721             m_stdio_communication.StartReadThread();
4722 
4723             // Now read thread is set up, set up input reader.
4724 
4725             if (!m_process_input_reader.get())
4726             {
4727                 m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
4728                 Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
4729                                                                this,
4730                                                                eInputReaderGranularityByte,
4731                                                                NULL,
4732                                                                NULL,
4733                                                                false));
4734 
4735                 if  (err.Fail())
4736                     m_process_input_reader.reset();
4737             }
4738         }
4739     }
4740 }
4741 
4742 void
4743 Process::PushProcessInputReader ()
4744 {
4745     if (m_process_input_reader && !m_process_input_reader->IsActive())
4746         m_target.GetDebugger().PushInputReader (m_process_input_reader);
4747 }
4748 
4749 void
4750 Process::PopProcessInputReader ()
4751 {
4752     if (m_process_input_reader && m_process_input_reader->IsActive())
4753         m_target.GetDebugger().PopInputReader (m_process_input_reader);
4754 }
4755 
4756 // The process needs to know about installed plug-ins
4757 void
4758 Process::SettingsInitialize ()
4759 {
4760 //    static std::vector<OptionEnumValueElement> g_plugins;
4761 //
4762 //    int i=0;
4763 //    const char *name;
4764 //    OptionEnumValueElement option_enum;
4765 //    while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL)
4766 //    {
4767 //        if (name)
4768 //        {
4769 //            option_enum.value = i;
4770 //            option_enum.string_value = name;
4771 //            option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i);
4772 //            g_plugins.push_back (option_enum);
4773 //        }
4774 //        ++i;
4775 //    }
4776 //    option_enum.value = 0;
4777 //    option_enum.string_value = NULL;
4778 //    option_enum.usage = NULL;
4779 //    g_plugins.push_back (option_enum);
4780 //
4781 //    for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i)
4782 //    {
4783 //        if (::strcmp (name, "plugin") == 0)
4784 //        {
4785 //            SettingsController::instance_settings_table[i].enum_values = &g_plugins[0];
4786 //            break;
4787 //        }
4788 //    }
4789 //
4790     Thread::SettingsInitialize ();
4791 }
4792 
4793 void
4794 Process::SettingsTerminate ()
4795 {
4796     Thread::SettingsTerminate ();
4797 }
4798 
4799 ExecutionResults
4800 Process::RunThreadPlan (ExecutionContext &exe_ctx,
4801                         lldb::ThreadPlanSP &thread_plan_sp,
4802                         const EvaluateExpressionOptions &options,
4803                         Stream &errors)
4804 {
4805     ExecutionResults return_value = eExecutionSetupError;
4806 
4807     if (thread_plan_sp.get() == NULL)
4808     {
4809         errors.Printf("RunThreadPlan called with empty thread plan.");
4810         return eExecutionSetupError;
4811     }
4812 
4813     if (!thread_plan_sp->ValidatePlan(NULL))
4814     {
4815         errors.Printf ("RunThreadPlan called with an invalid thread plan.");
4816         return eExecutionSetupError;
4817     }
4818 
4819     if (exe_ctx.GetProcessPtr() != this)
4820     {
4821         errors.Printf("RunThreadPlan called on wrong process.");
4822         return eExecutionSetupError;
4823     }
4824 
4825     Thread *thread = exe_ctx.GetThreadPtr();
4826     if (thread == NULL)
4827     {
4828         errors.Printf("RunThreadPlan called with invalid thread.");
4829         return eExecutionSetupError;
4830     }
4831 
4832     // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
4833     // For that to be true the plan can't be private - since private plans suppress themselves in the
4834     // GetCompletedPlan call.
4835 
4836     bool orig_plan_private = thread_plan_sp->GetPrivate();
4837     thread_plan_sp->SetPrivate(false);
4838 
4839     if (m_private_state.GetValue() != eStateStopped)
4840     {
4841         errors.Printf ("RunThreadPlan called while the private state was not stopped.");
4842         return eExecutionSetupError;
4843     }
4844 
4845     // Save the thread & frame from the exe_ctx for restoration after we run
4846     const uint32_t thread_idx_id = thread->GetIndexID();
4847     StackFrameSP selected_frame_sp = thread->GetSelectedFrame();
4848     if (!selected_frame_sp)
4849     {
4850         thread->SetSelectedFrame(0);
4851         selected_frame_sp = thread->GetSelectedFrame();
4852         if (!selected_frame_sp)
4853         {
4854             errors.Printf("RunThreadPlan called without a selected frame on thread %d", thread_idx_id);
4855             return eExecutionSetupError;
4856         }
4857     }
4858 
4859     StackID ctx_frame_id = selected_frame_sp->GetStackID();
4860 
4861     // N.B. Running the target may unset the currently selected thread and frame.  We don't want to do that either,
4862     // so we should arrange to reset them as well.
4863 
4864     lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
4865 
4866     uint32_t selected_tid;
4867     StackID selected_stack_id;
4868     if (selected_thread_sp)
4869     {
4870         selected_tid = selected_thread_sp->GetIndexID();
4871         selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID();
4872     }
4873     else
4874     {
4875         selected_tid = LLDB_INVALID_THREAD_ID;
4876     }
4877 
4878     lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD;
4879     lldb::StateType old_state;
4880     lldb::ThreadPlanSP stopper_base_plan_sp;
4881 
4882     Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
4883     if (Host::GetCurrentThread() == m_private_state_thread)
4884     {
4885         // Yikes, we are running on the private state thread!  So we can't wait for public events on this thread, since
4886         // we are the thread that is generating public events.
4887         // The simplest thing to do is to spin up a temporary thread to handle private state thread events while
4888         // we are fielding public events here.
4889         if (log)
4890             log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events.");
4891 
4892 
4893         backup_private_state_thread = m_private_state_thread;
4894 
4895         // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop,
4896         // returning control here.
4897         // But in the normal course of things, the plan above us on the stack would be given a shot at the stop
4898         // event before deciding to stop, and we don't want that.  So we insert a "stopper" base plan on the stack
4899         // before the plan we want to run.  Since base plans always stop and return control to the user, that will
4900         // do just what we want.
4901         stopper_base_plan_sp.reset(new ThreadPlanBase (*thread));
4902         thread->QueueThreadPlan (stopper_base_plan_sp, false);
4903         // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly.
4904         old_state = m_public_state.GetValue();
4905         m_public_state.SetValueNoLock(eStateStopped);
4906 
4907         // Now spin up the private state thread:
4908         StartPrivateStateThread(true);
4909     }
4910 
4911     thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense?
4912 
4913     if (options.GetDebug())
4914     {
4915         // In this case, we aren't actually going to run, we just want to stop right away.
4916         // Flush this thread so we will refetch the stacks and show the correct backtrace.
4917         // FIXME: To make this prettier we should invent some stop reason for this, but that
4918         // is only cosmetic, and this functionality is only of use to lldb developers who can
4919         // live with not pretty...
4920         thread->Flush();
4921         return eExecutionStoppedForDebug;
4922     }
4923 
4924     Listener listener("lldb.process.listener.run-thread-plan");
4925 
4926     lldb::EventSP event_to_broadcast_sp;
4927 
4928     {
4929         // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
4930         // restored on exit to the function.
4931         //
4932         // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event
4933         // is put into event_to_broadcast_sp for rebroadcasting.
4934 
4935         ProcessEventHijacker run_thread_plan_hijacker (*this, &listener);
4936 
4937         if (log)
4938         {
4939             StreamString s;
4940             thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
4941             log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64 " to run thread plan \"%s\".",
4942                          thread->GetIndexID(),
4943                          thread->GetID(),
4944                          s.GetData());
4945         }
4946 
4947         bool got_event;
4948         lldb::EventSP event_sp;
4949         lldb::StateType stop_state = lldb::eStateInvalid;
4950 
4951         TimeValue* timeout_ptr = NULL;
4952         TimeValue real_timeout;
4953 
4954         bool before_first_timeout = true;  // This is set to false the first time that we have to halt the target.
4955         bool do_resume = true;
4956         bool handle_running_event = true;
4957         const uint64_t default_one_thread_timeout_usec = 250000;
4958 
4959         // This is just for accounting:
4960         uint32_t num_resumes = 0;
4961 
4962         TimeValue one_thread_timeout = TimeValue::Now();
4963         TimeValue final_timeout = one_thread_timeout;
4964 
4965         uint32_t timeout_usec = options.GetTimeoutUsec();
4966         if (options.GetTryAllThreads())
4967         {
4968             // If we are running all threads then we take half the time to run all threads, bounded by
4969             // .25 sec.
4970             if (options.GetTimeoutUsec() == 0)
4971                 one_thread_timeout.OffsetWithMicroSeconds(default_one_thread_timeout_usec);
4972             else
4973             {
4974                 uint64_t computed_timeout = timeout_usec / 2;
4975                 if (computed_timeout > default_one_thread_timeout_usec)
4976                     computed_timeout = default_one_thread_timeout_usec;
4977                 one_thread_timeout.OffsetWithMicroSeconds(computed_timeout);
4978             }
4979             final_timeout.OffsetWithMicroSeconds (timeout_usec);
4980         }
4981         else
4982         {
4983             if (timeout_usec != 0)
4984                 final_timeout.OffsetWithMicroSeconds(timeout_usec);
4985         }
4986 
4987         // This while loop must exit out the bottom, there's cleanup that we need to do when we are done.
4988         // So don't call return anywhere within it.
4989 
4990         while (1)
4991         {
4992             // We usually want to resume the process if we get to the top of the loop.
4993             // The only exception is if we get two running events with no intervening
4994             // stop, which can happen, we will just wait for then next stop event.
4995             if (log)
4996                 log->Printf ("Top of while loop: do_resume: %i handle_running_event: %i before_first_timeout: %i.",
4997                              do_resume,
4998                              handle_running_event,
4999                              before_first_timeout);
5000 
5001             if (do_resume || handle_running_event)
5002             {
5003                 // Do the initial resume and wait for the running event before going further.
5004 
5005                 if (do_resume)
5006                 {
5007                     num_resumes++;
5008                     Error resume_error = PrivateResume ();
5009                     if (!resume_error.Success())
5010                     {
5011                         errors.Printf("Error resuming inferior the %d time: \"%s\".\n",
5012                                       num_resumes,
5013                                       resume_error.AsCString());
5014                         return_value = eExecutionSetupError;
5015                         break;
5016                     }
5017                 }
5018 
5019                 TimeValue resume_timeout = TimeValue::Now();
5020                 resume_timeout.OffsetWithMicroSeconds(500000);
5021 
5022                 got_event = listener.WaitForEvent(&resume_timeout, event_sp);
5023                 if (!got_event)
5024                 {
5025                     if (log)
5026                         log->Printf ("Process::RunThreadPlan(): didn't get any event after resume %d, exiting.",
5027                                         num_resumes);
5028 
5029                     errors.Printf("Didn't get any event after resume %d, exiting.", num_resumes);
5030                     return_value = eExecutionSetupError;
5031                     break;
5032                 }
5033 
5034                 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5035 
5036                 if (stop_state != eStateRunning)
5037                 {
5038                     bool restarted = false;
5039 
5040                     if (stop_state == eStateStopped)
5041                     {
5042                         restarted = Process::ProcessEventData::GetRestartedFromEvent(event_sp.get());
5043                         if (log)
5044                             log->Printf("Process::RunThreadPlan(): didn't get running event after "
5045                                         "resume %d, got %s instead (restarted: %i, do_resume: %i, handle_running_event: %i).",
5046                                         num_resumes,
5047                                         StateAsCString(stop_state),
5048                                         restarted,
5049                                         do_resume,
5050                                         handle_running_event);
5051                     }
5052 
5053                     if (restarted)
5054                     {
5055                         // This is probably an overabundance of caution, I don't think I should ever get a stopped & restarted
5056                         // event here.  But if I do, the best thing is to Halt and then get out of here.
5057                         Halt();
5058                     }
5059 
5060                     errors.Printf("Didn't get running event after initial resume, got %s instead.",
5061                                   StateAsCString(stop_state));
5062                     return_value = eExecutionSetupError;
5063                     break;
5064                 }
5065 
5066                 if (log)
5067                     log->PutCString ("Process::RunThreadPlan(): resuming succeeded.");
5068                 // We need to call the function synchronously, so spin waiting for it to return.
5069                 // If we get interrupted while executing, we're going to lose our context, and
5070                 // won't be able to gather the result at this point.
5071                 // We set the timeout AFTER the resume, since the resume takes some time and we
5072                 // don't want to charge that to the timeout.
5073             }
5074             else
5075             {
5076                 if (log)
5077                     log->PutCString ("Process::RunThreadPlan(): waiting for next event.");
5078             }
5079 
5080             if (before_first_timeout)
5081             {
5082                 if (options.GetTryAllThreads())
5083                     timeout_ptr = &one_thread_timeout;
5084                 else
5085                 {
5086                     if (timeout_usec == 0)
5087                         timeout_ptr = NULL;
5088                     else
5089                         timeout_ptr = &final_timeout;
5090                 }
5091             }
5092             else
5093             {
5094                 if (timeout_usec == 0)
5095                     timeout_ptr = NULL;
5096                 else
5097                     timeout_ptr = &final_timeout;
5098             }
5099 
5100             do_resume = true;
5101             handle_running_event = true;
5102 
5103             // Now wait for the process to stop again:
5104             event_sp.reset();
5105 
5106             if (log)
5107             {
5108                 if (timeout_ptr)
5109                 {
5110                     log->Printf ("Process::RunThreadPlan(): about to wait - now is %" PRIu64 " - endpoint is %" PRIu64,
5111                                  TimeValue::Now().GetAsMicroSecondsSinceJan1_1970(),
5112                                  timeout_ptr->GetAsMicroSecondsSinceJan1_1970());
5113                 }
5114                 else
5115                 {
5116                     log->Printf ("Process::RunThreadPlan(): about to wait forever.");
5117                 }
5118             }
5119 
5120             got_event = listener.WaitForEvent (timeout_ptr, event_sp);
5121 
5122             if (got_event)
5123             {
5124                 if (event_sp.get())
5125                 {
5126                     bool keep_going = false;
5127                     if (event_sp->GetType() == eBroadcastBitInterrupt)
5128                     {
5129                         Halt();
5130                         return_value = eExecutionInterrupted;
5131                         errors.Printf ("Execution halted by user interrupt.");
5132                         if (log)
5133                             log->Printf ("Process::RunThreadPlan(): Got  interrupted by eBroadcastBitInterrupted, exiting.");
5134                         break;
5135                     }
5136                     else
5137                     {
5138                         stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5139                         if (log)
5140                             log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state));
5141 
5142                         switch (stop_state)
5143                         {
5144                         case lldb::eStateStopped:
5145                             {
5146                                 // We stopped, figure out what we are going to do now.
5147                                 ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id);
5148                                 if (!thread_sp)
5149                                 {
5150                                     // Ooh, our thread has vanished.  Unlikely that this was successful execution...
5151                                     if (log)
5152                                         log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
5153                                     return_value = eExecutionInterrupted;
5154                                 }
5155                                 else
5156                                 {
5157                                     // If we were restarted, we just need to go back up to fetch another event.
5158                                     if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
5159                                     {
5160                                         if (log)
5161                                         {
5162                                             log->Printf ("Process::RunThreadPlan(): Got a stop and restart, so we'll continue waiting.");
5163                                         }
5164                                        keep_going = true;
5165                                        do_resume = false;
5166                                        handle_running_event = true;
5167 
5168                                     }
5169                                     else
5170                                     {
5171 
5172                                         StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
5173                                         StopReason stop_reason = eStopReasonInvalid;
5174                                         if (stop_info_sp)
5175                                              stop_reason = stop_info_sp->GetStopReason();
5176 
5177 
5178                                         // FIXME: We only check if the stop reason is plan complete, should we make sure that
5179                                         // it is OUR plan that is complete?
5180                                         if (stop_reason == eStopReasonPlanComplete)
5181                                         {
5182                                             if (log)
5183                                                 log->PutCString ("Process::RunThreadPlan(): execution completed successfully.");
5184                                             // Now mark this plan as private so it doesn't get reported as the stop reason
5185                                             // after this point.
5186                                             if (thread_plan_sp)
5187                                                 thread_plan_sp->SetPrivate (orig_plan_private);
5188                                             return_value = eExecutionCompleted;
5189                                         }
5190                                         else
5191                                         {
5192                                             // Something restarted the target, so just wait for it to stop for real.
5193                                             if (stop_reason == eStopReasonBreakpoint)
5194                                             {
5195                                                 if (log)
5196                                                     log->Printf ("Process::RunThreadPlan() stopped for breakpoint: %s.", stop_info_sp->GetDescription());
5197                                                 return_value = eExecutionHitBreakpoint;
5198                                                 if (!options.DoesIgnoreBreakpoints())
5199                                                 {
5200                                                     event_to_broadcast_sp = event_sp;
5201                                                 }
5202                                             }
5203                                             else
5204                                             {
5205                                                 if (log)
5206                                                     log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete.");
5207                                                 if (!options.DoesUnwindOnError())
5208                                                     event_to_broadcast_sp = event_sp;
5209                                                 return_value = eExecutionInterrupted;
5210                                             }
5211                                         }
5212                                     }
5213                                 }
5214                             }
5215                             break;
5216 
5217                         case lldb::eStateRunning:
5218                             // This shouldn't really happen, but sometimes we do get two running events without an
5219                             // intervening stop, and in that case we should just go back to waiting for the stop.
5220                             do_resume = false;
5221                             keep_going = true;
5222                             handle_running_event = false;
5223                             break;
5224 
5225                         default:
5226                             if (log)
5227                                 log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state));
5228 
5229                             if (stop_state == eStateExited)
5230                                 event_to_broadcast_sp = event_sp;
5231 
5232                             errors.Printf ("Execution stopped with unexpected state.\n");
5233                             return_value = eExecutionInterrupted;
5234                             break;
5235                         }
5236                     }
5237 
5238                     if (keep_going)
5239                         continue;
5240                     else
5241                         break;
5242                 }
5243                 else
5244                 {
5245                     if (log)
5246                         log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null.  How odd...");
5247                     return_value = eExecutionInterrupted;
5248                     break;
5249                 }
5250             }
5251             else
5252             {
5253                 // If we didn't get an event that means we've timed out...
5254                 // We will interrupt the process here.  Depending on what we were asked to do we will
5255                 // either exit, or try with all threads running for the same timeout.
5256 
5257                 if (log) {
5258                     if (options.GetTryAllThreads())
5259                     {
5260                         uint64_t remaining_time = final_timeout - TimeValue::Now();
5261                         if (before_first_timeout)
5262                             log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, "
5263                                          "running till  for %" PRIu64 " usec with all threads enabled.",
5264                                          remaining_time);
5265                         else
5266                             log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
5267                                          "and timeout: %u timed out, abandoning execution.",
5268                                          timeout_usec);
5269                     }
5270                     else
5271                         log->Printf ("Process::RunThreadPlan(): Running function with timeout: %u timed out, "
5272                                      "abandoning execution.",
5273                                      timeout_usec);
5274                 }
5275 
5276                 // It is possible that between the time we issued the Halt, and we get around to calling Halt the target
5277                 // could have stopped.  That's fine, Halt will figure that out and send the appropriate Stopped event.
5278                 // BUT it is also possible that we stopped & restarted (e.g. hit a signal with "stop" set to false.)  In
5279                 // that case, we'll get the stopped & restarted event, and we should go back to waiting for the Halt's
5280                 // stopped event.  That's what this while loop does.
5281 
5282                 bool back_to_top = true;
5283                 uint32_t try_halt_again = 0;
5284                 bool do_halt = true;
5285                 const uint32_t num_retries = 5;
5286                 while (try_halt_again < num_retries)
5287                 {
5288                     Error halt_error;
5289                     if (do_halt)
5290                     {
5291                         if (log)
5292                             log->Printf ("Process::RunThreadPlan(): Running Halt.");
5293                         halt_error = Halt();
5294                     }
5295                     if (halt_error.Success())
5296                     {
5297                         if (log)
5298                             log->PutCString ("Process::RunThreadPlan(): Halt succeeded.");
5299 
5300                         real_timeout = TimeValue::Now();
5301                         real_timeout.OffsetWithMicroSeconds(500000);
5302 
5303                         got_event = listener.WaitForEvent(&real_timeout, event_sp);
5304 
5305                         if (got_event)
5306                         {
5307                             stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5308                             if (log)
5309                             {
5310                                 log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
5311                                 if (stop_state == lldb::eStateStopped
5312                                     && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
5313                                     log->PutCString ("    Event was the Halt interruption event.");
5314                             }
5315 
5316                             if (stop_state == lldb::eStateStopped)
5317                             {
5318                                 // Between the time we initiated the Halt and the time we delivered it, the process could have
5319                                 // already finished its job.  Check that here:
5320 
5321                                 if (thread->IsThreadPlanDone (thread_plan_sp.get()))
5322                                 {
5323                                     if (log)
5324                                         log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
5325                                                      "Exiting wait loop.");
5326                                     return_value = eExecutionCompleted;
5327                                     back_to_top = false;
5328                                     break;
5329                                 }
5330 
5331                                 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
5332                                 {
5333                                     if (log)
5334                                         log->PutCString ("Process::RunThreadPlan(): Went to halt but got a restarted event, there must be an un-restarted stopped event so try again...  "
5335                                                      "Exiting wait loop.");
5336                                     try_halt_again++;
5337                                     do_halt = false;
5338                                     continue;
5339                                 }
5340 
5341                                 if (!options.GetTryAllThreads())
5342                                 {
5343                                     if (log)
5344                                         log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting.");
5345                                     return_value = eExecutionInterrupted;
5346                                     back_to_top = false;
5347                                     break;
5348                                 }
5349 
5350                                 if (before_first_timeout)
5351                                 {
5352                                     // Set all the other threads to run, and return to the top of the loop, which will continue;
5353                                     before_first_timeout = false;
5354                                     thread_plan_sp->SetStopOthers (false);
5355                                     if (log)
5356                                         log->PutCString ("Process::RunThreadPlan(): about to resume.");
5357 
5358                                     back_to_top = true;
5359                                     break;
5360                                 }
5361                                 else
5362                                 {
5363                                     // Running all threads failed, so return Interrupted.
5364                                     if (log)
5365                                         log->PutCString("Process::RunThreadPlan(): running all threads timed out.");
5366                                     return_value = eExecutionInterrupted;
5367                                     back_to_top = false;
5368                                     break;
5369                                 }
5370                             }
5371                         }
5372                         else
5373                         {   if (log)
5374                                 log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event.  "
5375                                         "I'm getting out of here passing Interrupted.");
5376                             return_value = eExecutionInterrupted;
5377                             back_to_top = false;
5378                             break;
5379                         }
5380                     }
5381                     else
5382                     {
5383                         try_halt_again++;
5384                         continue;
5385                     }
5386                 }
5387 
5388                 if (!back_to_top || try_halt_again > num_retries)
5389                     break;
5390                 else
5391                     continue;
5392             }
5393         }  // END WAIT LOOP
5394 
5395         // If we had to start up a temporary private state thread to run this thread plan, shut it down now.
5396         if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread))
5397         {
5398             StopPrivateStateThread();
5399             Error error;
5400             m_private_state_thread = backup_private_state_thread;
5401             if (stopper_base_plan_sp)
5402             {
5403                 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5404             }
5405             m_public_state.SetValueNoLock(old_state);
5406 
5407         }
5408 
5409         // Restore the thread state if we are going to discard the plan execution.  There are three cases where this
5410         // could happen:
5411         // 1) The execution successfully completed
5412         // 2) We hit a breakpoint, and ignore_breakpoints was true
5413         // 3) We got some other error, and discard_on_error was true
5414         bool should_unwind = (return_value == eExecutionInterrupted && options.DoesUnwindOnError())
5415                              || (return_value == eExecutionHitBreakpoint && options.DoesIgnoreBreakpoints());
5416 
5417         if (return_value == eExecutionCompleted
5418             || should_unwind)
5419         {
5420             thread_plan_sp->RestoreThreadState();
5421         }
5422 
5423         // Now do some processing on the results of the run:
5424         if (return_value == eExecutionInterrupted || return_value == eExecutionHitBreakpoint)
5425         {
5426             if (log)
5427             {
5428                 StreamString s;
5429                 if (event_sp)
5430                     event_sp->Dump (&s);
5431                 else
5432                 {
5433                     log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
5434                 }
5435 
5436                 StreamString ts;
5437 
5438                 const char *event_explanation = NULL;
5439 
5440                 do
5441                 {
5442                     if (!event_sp)
5443                     {
5444                         event_explanation = "<no event>";
5445                         break;
5446                     }
5447                     else if (event_sp->GetType() == eBroadcastBitInterrupt)
5448                     {
5449                         event_explanation = "<user interrupt>";
5450                         break;
5451                     }
5452                     else
5453                     {
5454                         const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
5455 
5456                         if (!event_data)
5457                         {
5458                             event_explanation = "<no event data>";
5459                             break;
5460                         }
5461 
5462                         Process *process = event_data->GetProcessSP().get();
5463 
5464                         if (!process)
5465                         {
5466                             event_explanation = "<no process>";
5467                             break;
5468                         }
5469 
5470                         ThreadList &thread_list = process->GetThreadList();
5471 
5472                         uint32_t num_threads = thread_list.GetSize();
5473                         uint32_t thread_index;
5474 
5475                         ts.Printf("<%u threads> ", num_threads);
5476 
5477                         for (thread_index = 0;
5478                              thread_index < num_threads;
5479                              ++thread_index)
5480                         {
5481                             Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
5482 
5483                             if (!thread)
5484                             {
5485                                 ts.Printf("<?> ");
5486                                 continue;
5487                             }
5488 
5489                             ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID());
5490                             RegisterContext *register_context = thread->GetRegisterContext().get();
5491 
5492                             if (register_context)
5493                                 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC());
5494                             else
5495                                 ts.Printf("[ip unknown] ");
5496 
5497                             lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
5498                             if (stop_info_sp)
5499                             {
5500                                 const char *stop_desc = stop_info_sp->GetDescription();
5501                                 if (stop_desc)
5502                                     ts.PutCString (stop_desc);
5503                             }
5504                             ts.Printf(">");
5505                         }
5506 
5507                         event_explanation = ts.GetData();
5508                     }
5509                 } while (0);
5510 
5511                 if (event_explanation)
5512                     log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
5513                 else
5514                     log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData());
5515             }
5516 
5517             if (should_unwind)
5518             {
5519                 if (log)
5520                     log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.", thread_plan_sp.get());
5521                 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
5522                 thread_plan_sp->SetPrivate (orig_plan_private);
5523             }
5524             else
5525             {
5526                 if (log)
5527                     log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.", thread_plan_sp.get());
5528             }
5529         }
5530         else if (return_value == eExecutionSetupError)
5531         {
5532             if (log)
5533                 log->PutCString("Process::RunThreadPlan(): execution set up error.");
5534 
5535             if (options.DoesUnwindOnError())
5536             {
5537                 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
5538                 thread_plan_sp->SetPrivate (orig_plan_private);
5539             }
5540         }
5541         else
5542         {
5543             if (thread->IsThreadPlanDone (thread_plan_sp.get()))
5544             {
5545                 if (log)
5546                     log->PutCString("Process::RunThreadPlan(): thread plan is done");
5547                 return_value = eExecutionCompleted;
5548             }
5549             else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
5550             {
5551                 if (log)
5552                     log->PutCString("Process::RunThreadPlan(): thread plan was discarded");
5553                 return_value = eExecutionDiscarded;
5554             }
5555             else
5556             {
5557                 if (log)
5558                     log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course");
5559                 if (options.DoesUnwindOnError() && thread_plan_sp)
5560                 {
5561                     if (log)
5562                         log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause unwind_on_error is set.");
5563                     thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
5564                     thread_plan_sp->SetPrivate (orig_plan_private);
5565                 }
5566             }
5567         }
5568 
5569         // Thread we ran the function in may have gone away because we ran the target
5570         // Check that it's still there, and if it is put it back in the context.  Also restore the
5571         // frame in the context if it is still present.
5572         thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
5573         if (thread)
5574         {
5575             exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id));
5576         }
5577 
5578         // Also restore the current process'es selected frame & thread, since this function calling may
5579         // be done behind the user's back.
5580 
5581         if (selected_tid != LLDB_INVALID_THREAD_ID)
5582         {
5583             if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid())
5584             {
5585                 // We were able to restore the selected thread, now restore the frame:
5586                 Mutex::Locker lock(GetThreadList().GetMutex());
5587                 StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id);
5588                 if (old_frame_sp)
5589                     GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get());
5590             }
5591         }
5592     }
5593 
5594     // If the process exited during the run of the thread plan, notify everyone.
5595 
5596     if (event_to_broadcast_sp)
5597     {
5598         if (log)
5599             log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
5600         BroadcastEvent(event_to_broadcast_sp);
5601     }
5602 
5603     return return_value;
5604 }
5605 
5606 const char *
5607 Process::ExecutionResultAsCString (ExecutionResults result)
5608 {
5609     const char *result_name;
5610 
5611     switch (result)
5612     {
5613         case eExecutionCompleted:
5614             result_name = "eExecutionCompleted";
5615             break;
5616         case eExecutionDiscarded:
5617             result_name = "eExecutionDiscarded";
5618             break;
5619         case eExecutionInterrupted:
5620             result_name = "eExecutionInterrupted";
5621             break;
5622         case eExecutionHitBreakpoint:
5623             result_name = "eExecutionHitBreakpoint";
5624             break;
5625         case eExecutionSetupError:
5626             result_name = "eExecutionSetupError";
5627             break;
5628         case eExecutionTimedOut:
5629             result_name = "eExecutionTimedOut";
5630             break;
5631         case eExecutionStoppedForDebug:
5632             result_name = "eExecutionStoppedForDebug";
5633             break;
5634     }
5635     return result_name;
5636 }
5637 
5638 void
5639 Process::GetStatus (Stream &strm)
5640 {
5641     const StateType state = GetState();
5642     if (StateIsStoppedState(state, false))
5643     {
5644         if (state == eStateExited)
5645         {
5646             int exit_status = GetExitStatus();
5647             const char *exit_description = GetExitDescription();
5648             strm.Printf ("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n",
5649                           GetID(),
5650                           exit_status,
5651                           exit_status,
5652                           exit_description ? exit_description : "");
5653         }
5654         else
5655         {
5656             if (state == eStateConnected)
5657                 strm.Printf ("Connected to remote target.\n");
5658             else
5659                 strm.Printf ("Process %" PRIu64 " %s\n", GetID(), StateAsCString (state));
5660         }
5661     }
5662     else
5663     {
5664         strm.Printf ("Process %" PRIu64 " is running.\n", GetID());
5665     }
5666 }
5667 
5668 size_t
5669 Process::GetThreadStatus (Stream &strm,
5670                           bool only_threads_with_stop_reason,
5671                           uint32_t start_frame,
5672                           uint32_t num_frames,
5673                           uint32_t num_frames_with_source)
5674 {
5675     size_t num_thread_infos_dumped = 0;
5676 
5677     Mutex::Locker locker (GetThreadList().GetMutex());
5678     const size_t num_threads = GetThreadList().GetSize();
5679     for (uint32_t i = 0; i < num_threads; i++)
5680     {
5681         Thread *thread = GetThreadList().GetThreadAtIndex(i).get();
5682         if (thread)
5683         {
5684             if (only_threads_with_stop_reason)
5685             {
5686                 StopInfoSP stop_info_sp = thread->GetStopInfo();
5687                 if (stop_info_sp.get() == NULL || !stop_info_sp->IsValid())
5688                     continue;
5689             }
5690             thread->GetStatus (strm,
5691                                start_frame,
5692                                num_frames,
5693                                num_frames_with_source);
5694             ++num_thread_infos_dumped;
5695         }
5696     }
5697     return num_thread_infos_dumped;
5698 }
5699 
5700 void
5701 Process::AddInvalidMemoryRegion (const LoadRange &region)
5702 {
5703     m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
5704 }
5705 
5706 bool
5707 Process::RemoveInvalidMemoryRange (const LoadRange &region)
5708 {
5709     return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize());
5710 }
5711 
5712 void
5713 Process::AddPreResumeAction (PreResumeActionCallback callback, void *baton)
5714 {
5715     m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton));
5716 }
5717 
5718 bool
5719 Process::RunPreResumeActions ()
5720 {
5721     bool result = true;
5722     while (!m_pre_resume_actions.empty())
5723     {
5724         struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
5725         m_pre_resume_actions.pop_back();
5726         bool this_result = action.callback (action.baton);
5727         if (result == true) result = this_result;
5728     }
5729     return result;
5730 }
5731 
5732 void
5733 Process::ClearPreResumeActions ()
5734 {
5735     m_pre_resume_actions.clear();
5736 }
5737 
5738 void
5739 Process::Flush ()
5740 {
5741     m_thread_list.Flush();
5742     m_extended_thread_list.Flush();
5743     m_extended_thread_stop_id =  0;
5744     m_queue_list.Clear();
5745     m_queue_list_stop_id = 0;
5746 }
5747 
5748 void
5749 Process::DidExec ()
5750 {
5751     Target &target = GetTarget();
5752     target.CleanupProcess ();
5753     target.ClearModules(false);
5754     m_dynamic_checkers_ap.reset();
5755     m_abi_sp.reset();
5756     m_system_runtime_ap.reset();
5757     m_os_ap.reset();
5758     m_dyld_ap.reset();
5759     m_image_tokens.clear();
5760     m_allocated_memory_cache.Clear();
5761     m_language_runtimes.clear();
5762     m_thread_list.DiscardThreadPlans();
5763     m_memory_cache.Clear(true);
5764     DoDidExec();
5765     CompleteAttach ();
5766     // Flush the process (threads and all stack frames) after running CompleteAttach()
5767     // in case the dynamic loader loaded things in new locations.
5768     Flush();
5769 
5770     // After we figure out what was loaded/unloaded in CompleteAttach,
5771     // we need to let the target know so it can do any cleanup it needs to.
5772     target.DidExec();
5773 }
5774 
5775