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/Target/Process.h"
11 
12 #include "lldb/lldb-private-log.h"
13 
14 #include "lldb/Breakpoint/StoppointCallbackContext.h"
15 #include "lldb/Breakpoint/BreakpointLocation.h"
16 #include "lldb/Core/Event.h"
17 #include "lldb/Core/ConnectionFileDescriptor.h"
18 #include "lldb/Core/Debugger.h"
19 #include "lldb/Core/InputReader.h"
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/PluginManager.h"
22 #include "lldb/Core/State.h"
23 #include "lldb/Expression/ClangUserExpression.h"
24 #include "lldb/Interpreter/CommandInterpreter.h"
25 #include "lldb/Host/Host.h"
26 #include "lldb/Target/ABI.h"
27 #include "lldb/Target/DynamicLoader.h"
28 #include "lldb/Target/LanguageRuntime.h"
29 #include "lldb/Target/CPPLanguageRuntime.h"
30 #include "lldb/Target/ObjCLanguageRuntime.h"
31 #include "lldb/Target/Platform.h"
32 #include "lldb/Target/RegisterContext.h"
33 #include "lldb/Target/StopInfo.h"
34 #include "lldb/Target/Target.h"
35 #include "lldb/Target/TargetList.h"
36 #include "lldb/Target/Thread.h"
37 #include "lldb/Target/ThreadPlan.h"
38 
39 using namespace lldb;
40 using namespace lldb_private;
41 
42 void
43 ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
44 {
45     const char *cstr;
46     if (m_pid != LLDB_INVALID_PROCESS_ID)
47         s.Printf ("    pid = %i\n", m_pid);
48 
49     if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
50         s.Printf (" parent = %i\n", m_parent_pid);
51 
52     if (m_executable)
53     {
54         s.Printf ("   name = %s\n", m_executable.GetFilename().GetCString());
55         s.PutCString ("   file = ");
56         m_executable.Dump(&s);
57         s.EOL();
58     }
59     const uint32_t argc = m_arguments.GetArgumentCount();
60     if (argc > 0)
61     {
62         for (uint32_t i=0; i<argc; i++)
63         {
64             const char *arg = m_arguments.GetArgumentAtIndex(i);
65             if (i < 10)
66                 s.Printf (" arg[%u] = %s\n", i, arg);
67             else
68                 s.Printf ("arg[%u] = %s\n", i, arg);
69         }
70     }
71 
72     const uint32_t envc = m_environment.GetArgumentCount();
73     if (envc > 0)
74     {
75         for (uint32_t i=0; i<envc; i++)
76         {
77             const char *env = m_environment.GetArgumentAtIndex(i);
78             if (i < 10)
79                 s.Printf (" env[%u] = %s\n", i, env);
80             else
81                 s.Printf ("env[%u] = %s\n", i, env);
82         }
83     }
84 
85     if (m_arch.IsValid())
86         s.Printf ("   arch = %s\n", m_arch.GetTriple().str().c_str());
87 
88     if (m_uid != UINT32_MAX)
89     {
90         cstr = platform->GetUserName (m_uid);
91         s.Printf ("    uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
92     }
93     if (m_gid != UINT32_MAX)
94     {
95         cstr = platform->GetGroupName (m_gid);
96         s.Printf ("    gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
97     }
98     if (m_euid != UINT32_MAX)
99     {
100         cstr = platform->GetUserName (m_euid);
101         s.Printf ("   euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
102     }
103     if (m_egid != UINT32_MAX)
104     {
105         cstr = platform->GetGroupName (m_egid);
106         s.Printf ("   egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
107     }
108 }
109 
110 void
111 ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
112 {
113     const char *label;
114     if (show_args || verbose)
115         label = "ARGUMENTS";
116     else
117         label = "NAME";
118 
119     if (verbose)
120     {
121         s.Printf     ("PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                   %s\n", label);
122         s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
123     }
124     else
125     {
126         s.Printf     ("PID    PARENT USER       ARCH    %s\n", label);
127         s.PutCString ("====== ====== ========== ======= ============================\n");
128     }
129 }
130 
131 void
132 ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
133 {
134     if (m_pid != LLDB_INVALID_PROCESS_ID)
135     {
136         const char *cstr;
137         s.Printf ("%-6u %-6u ", m_pid, m_parent_pid);
138 
139 
140         if (verbose)
141         {
142             cstr = platform->GetUserName (m_uid);
143             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
144                 s.Printf ("%-10s ", cstr);
145             else
146                 s.Printf ("%-10u ", m_uid);
147 
148             cstr = platform->GetGroupName (m_gid);
149             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
150                 s.Printf ("%-10s ", cstr);
151             else
152                 s.Printf ("%-10u ", m_gid);
153 
154             cstr = platform->GetUserName (m_euid);
155             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
156                 s.Printf ("%-10s ", cstr);
157             else
158                 s.Printf ("%-10u ", m_euid);
159 
160             cstr = platform->GetGroupName (m_egid);
161             if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
162                 s.Printf ("%-10s ", cstr);
163             else
164                 s.Printf ("%-10u ", m_egid);
165             s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : "");
166         }
167         else
168         {
169             s.Printf ("%-10s %.*-7s ",
170                       platform->GetUserName (m_euid),
171                       (int)m_arch.GetTriple().getArchName().size(),
172                       m_arch.GetTriple().getArchName().data());
173         }
174 
175         if (verbose || show_args)
176         {
177             const uint32_t argc = m_arguments.GetArgumentCount();
178             if (argc > 0)
179             {
180                 for (uint32_t i=0; i<argc; i++)
181                 {
182                     if (i > 0)
183                         s.PutChar (' ');
184                     s.PutCString (m_arguments.GetArgumentAtIndex(i));
185                 }
186             }
187         }
188         else
189         {
190             s.PutCString (GetName());
191         }
192 
193         s.EOL();
194     }
195 }
196 
197 
198 void
199 ProcessInfo::SetArgumentsFromArgs (const Args& args,
200                                        bool first_arg_is_executable,
201                                        bool first_arg_is_executable_and_argument)
202 {
203     // Copy all arguments
204     m_arguments = args;
205 
206     // Is the first argument the executable?
207     if (first_arg_is_executable)
208     {
209         const char *first_arg = args.GetArgumentAtIndex (0);
210         if (first_arg)
211         {
212             // Yes the first argument is an executable, set it as the executable
213             // in the launch options. Don't resolve the file path as the path
214             // could be a remote platform path
215             const bool resolve = false;
216             m_executable.SetFile(first_arg, resolve);
217 
218             // If argument zero is an executable and shouldn't be included
219             // in the arguments, remove it from the front of the arguments
220             if (first_arg_is_executable_and_argument == false)
221                 m_arguments.DeleteArgumentAtIndex (0);
222         }
223     }
224 }
225 
226 bool
227 ProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write)
228 {
229     if ((read || write) && fd >= 0 && path && path[0])
230     {
231         m_action = eFileActionOpen;
232         m_fd = fd;
233         if (read && write)
234             m_arg = O_RDWR;
235         else if (read)
236             m_arg = O_RDONLY;
237         else
238             m_arg = O_WRONLY;
239         m_path.assign (path);
240         return true;
241     }
242     else
243     {
244         Clear();
245     }
246     return false;
247 }
248 
249 bool
250 ProcessLaunchInfo::FileAction::Close (int fd)
251 {
252     Clear();
253     if (fd >= 0)
254     {
255         m_action = eFileActionClose;
256         m_fd = fd;
257     }
258     return m_fd >= 0;
259 }
260 
261 
262 bool
263 ProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd)
264 {
265     Clear();
266     if (fd >= 0 && dup_fd >= 0)
267     {
268         m_action = eFileActionDuplicate;
269         m_fd = fd;
270         m_arg = dup_fd;
271     }
272     return m_fd >= 0;
273 }
274 
275 
276 
277 bool
278 ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions,
279                                                         const FileAction *info,
280                                                         Log *log,
281                                                         Error& error)
282 {
283     if (info == NULL)
284         return false;
285 
286     switch (info->m_action)
287     {
288         case eFileActionNone:
289             error.Clear();
290             break;
291 
292         case eFileActionClose:
293             if (info->m_fd == -1)
294                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)");
295             else
296             {
297                 error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd),
298                                 eErrorTypePOSIX);
299                 if (log && (error.Fail() || log))
300                     error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)",
301                                    file_actions, info->m_fd);
302             }
303             break;
304 
305         case eFileActionDuplicate:
306             if (info->m_fd == -1)
307                 error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)");
308             else if (info->m_arg == -1)
309                 error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
310             else
311             {
312                 error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg),
313                                 eErrorTypePOSIX);
314                 if (log && (error.Fail() || log))
315                     error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)",
316                                    file_actions, info->m_fd, info->m_arg);
317             }
318             break;
319 
320         case eFileActionOpen:
321             if (info->m_fd == -1)
322                 error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)");
323             else
324             {
325                 int oflag = info->m_arg;
326                 mode_t mode = 0;
327 
328                 error.SetError (::posix_spawn_file_actions_addopen (file_actions,
329                                                                     info->m_fd,
330                                                                     info->m_path.c_str(),
331                                                                     oflag,
332                                                                     mode),
333                                 eErrorTypePOSIX);
334                 if (error.Fail() || log)
335                     error.PutToLog(log,
336                                    "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)",
337                                    file_actions, info->m_fd, info->m_path.c_str(), oflag, mode);
338             }
339             break;
340 
341         default:
342             error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action);
343             break;
344     }
345     return error.Success();
346 }
347 
348 Error
349 ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
350 {
351     Error error;
352     char short_option = (char) m_getopt_table[option_idx].val;
353 
354     switch (short_option)
355     {
356         case 's':   // Stop at program entry point
357             launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
358             break;
359 
360         case 'e':   // STDERR for read + write
361             {
362                 ProcessLaunchInfo::FileAction action;
363                 if (action.Open(STDERR_FILENO, option_arg, true, true))
364                     launch_info.AppendFileAction (action);
365             }
366             break;
367 
368         case 'i':   // STDIN for read only
369             {
370                 ProcessLaunchInfo::FileAction action;
371                 if (action.Open(STDIN_FILENO, option_arg, true, false))
372                     launch_info.AppendFileAction (action);
373             }
374             break;
375 
376         case 'o':   // Open STDOUT for write only
377             {
378                 ProcessLaunchInfo::FileAction action;
379                 if (action.Open(STDOUT_FILENO, option_arg, false, true))
380                     launch_info.AppendFileAction (action);
381             }
382             break;
383 
384         case 'p':   // Process plug-in name
385             launch_info.SetProcessPluginName (option_arg);
386             break;
387 
388         case 'n':   // Disable STDIO
389             {
390                 ProcessLaunchInfo::FileAction action;
391                 if (action.Open(STDERR_FILENO, "/dev/null", true, true))
392                     launch_info.AppendFileAction (action);
393                 if (action.Open(STDOUT_FILENO, "/dev/null", false, true))
394                     launch_info.AppendFileAction (action);
395                 if (action.Open(STDIN_FILENO, "/dev/null", true, false))
396                     launch_info.AppendFileAction (action);
397             }
398             break;
399 
400         case 'w':
401             launch_info.SetWorkingDirectory (option_arg);
402             break;
403 
404         case 't':   // Open process in new terminal window
405             launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
406             break;
407 
408         case 'a':
409             launch_info.GetArchitecture().SetTriple (option_arg,
410                                                      m_interpreter.GetPlatform(true).get());
411             break;
412 
413         case 'A':
414             launch_info.GetFlags().Set (eLaunchFlagDisableASLR);
415             break;
416 
417         case 'v':
418             launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
419             break;
420 
421         default:
422             error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
423             break;
424 
425     }
426     return error;
427 }
428 
429 OptionDefinition
430 ProcessLaunchCommandOptions::g_option_table[] =
431 {
432 { LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument,       NULL, 0, eArgTypeNone,          "Stop at the entry point of the program when launching a process."},
433 { LLDB_OPT_SET_ALL, false, "disable-aslr",  'A', no_argument,       NULL, 0, eArgTypeNone,          "Disable address space layout randomization when launching a process."},
434 { LLDB_OPT_SET_ALL, false, "plugin",        'p', required_argument, NULL, 0, eArgTypePlugin,        "Name of the process plugin you want to use."},
435 { LLDB_OPT_SET_ALL, false, "working-dir",   'w', required_argument, NULL, 0, eArgTypePath,          "Set the current working directory to <path> when running the inferior."},
436 { LLDB_OPT_SET_ALL, false, "arch",          'a', required_argument, NULL, 0, eArgTypeArchitecture,  "Set the architecture for the process to launch when ambiguous."},
437 { LLDB_OPT_SET_ALL, false, "environment",   'v', required_argument, NULL, 0, eArgTypeNone,          "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."},
438 
439 { LLDB_OPT_SET_1  , false, "stdin",         'i', required_argument, NULL, 0, eArgTypePath,    "Redirect stdin for the process to <path>."},
440 { LLDB_OPT_SET_1  , false, "stdout",        'o', required_argument, NULL, 0, eArgTypePath,    "Redirect stdout for the process to <path>."},
441 { LLDB_OPT_SET_1  , false, "stderr",        'e', required_argument, NULL, 0, eArgTypePath,    "Redirect stderr for the process to <path>."},
442 
443 { LLDB_OPT_SET_2  , false, "tty",           't', no_argument,       NULL, 0, eArgTypeNone,    "Start the process in a terminal (not supported on all platforms)."},
444 
445 { LLDB_OPT_SET_3  , false, "no-stdio",      'n', no_argument,       NULL, 0, eArgTypeNone,    "Do not set up for terminal I/O to go to running process."},
446 
447 { 0               , false, NULL,             0,  0,                 NULL, 0, eArgTypeNone,    NULL }
448 };
449 
450 
451 
452 bool
453 ProcessInstanceInfoMatch::NameMatches (const char *process_name) const
454 {
455     if (m_name_match_type == eNameMatchIgnore || process_name == NULL)
456         return true;
457     const char *match_name = m_match_info.GetName();
458     if (!match_name)
459         return true;
460 
461     return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
462 }
463 
464 bool
465 ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
466 {
467     if (!NameMatches (proc_info.GetName()))
468         return false;
469 
470     if (m_match_info.ProcessIDIsValid() &&
471         m_match_info.GetProcessID() != proc_info.GetProcessID())
472         return false;
473 
474     if (m_match_info.ParentProcessIDIsValid() &&
475         m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
476         return false;
477 
478     if (m_match_info.UserIDIsValid () &&
479         m_match_info.GetUserID() != proc_info.GetUserID())
480         return false;
481 
482     if (m_match_info.GroupIDIsValid () &&
483         m_match_info.GetGroupID() != proc_info.GetGroupID())
484         return false;
485 
486     if (m_match_info.EffectiveUserIDIsValid () &&
487         m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
488         return false;
489 
490     if (m_match_info.EffectiveGroupIDIsValid () &&
491         m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
492         return false;
493 
494     if (m_match_info.GetArchitecture().IsValid() &&
495         m_match_info.GetArchitecture() != proc_info.GetArchitecture())
496         return false;
497     return true;
498 }
499 
500 bool
501 ProcessInstanceInfoMatch::MatchAllProcesses () const
502 {
503     if (m_name_match_type != eNameMatchIgnore)
504         return false;
505 
506     if (m_match_info.ProcessIDIsValid())
507         return false;
508 
509     if (m_match_info.ParentProcessIDIsValid())
510         return false;
511 
512     if (m_match_info.UserIDIsValid ())
513         return false;
514 
515     if (m_match_info.GroupIDIsValid ())
516         return false;
517 
518     if (m_match_info.EffectiveUserIDIsValid ())
519         return false;
520 
521     if (m_match_info.EffectiveGroupIDIsValid ())
522         return false;
523 
524     if (m_match_info.GetArchitecture().IsValid())
525         return false;
526 
527     if (m_match_all_users)
528         return false;
529 
530     return true;
531 
532 }
533 
534 void
535 ProcessInstanceInfoMatch::Clear()
536 {
537     m_match_info.Clear();
538     m_name_match_type = eNameMatchIgnore;
539     m_match_all_users = false;
540 }
541 
542 Process*
543 Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener)
544 {
545     ProcessCreateInstance create_callback = NULL;
546     if (plugin_name)
547     {
548         create_callback  = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name);
549         if (create_callback)
550         {
551             std::auto_ptr<Process> debugger_ap(create_callback(target, listener));
552             if (debugger_ap->CanDebug(target))
553                 return debugger_ap.release();
554         }
555     }
556     else
557     {
558         for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
559         {
560             std::auto_ptr<Process> debugger_ap(create_callback(target, listener));
561             if (debugger_ap->CanDebug(target))
562                 return debugger_ap.release();
563         }
564     }
565     return NULL;
566 }
567 
568 
569 //----------------------------------------------------------------------
570 // Process constructor
571 //----------------------------------------------------------------------
572 Process::Process(Target &target, Listener &listener) :
573     UserID (LLDB_INVALID_PROCESS_ID),
574     Broadcaster ("lldb.process"),
575     ProcessInstanceSettings (*GetSettingsController()),
576     m_target (target),
577     m_public_state (eStateUnloaded),
578     m_private_state (eStateUnloaded),
579     m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"),
580     m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"),
581     m_private_state_listener ("lldb.process.internal_state_listener"),
582     m_private_state_control_wait(),
583     m_private_state_thread (LLDB_INVALID_HOST_THREAD),
584     m_stop_id (0),
585     m_thread_index_id (0),
586     m_exit_status (-1),
587     m_exit_string (),
588     m_thread_list (this),
589     m_notifications (),
590     m_image_tokens (),
591     m_listener (listener),
592     m_breakpoint_site_list (),
593     m_dynamic_checkers_ap (),
594     m_unix_signals (),
595     m_abi_sp (),
596     m_process_input_reader (),
597     m_stdio_communication ("process.stdio"),
598     m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
599     m_stdout_data (),
600     m_memory_cache (*this),
601     m_allocated_memory_cache (*this),
602     m_next_event_action_ap()
603 {
604     UpdateInstanceName();
605 
606     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
607     if (log)
608         log->Printf ("%p Process::Process()", this);
609 
610     SetEventName (eBroadcastBitStateChanged, "state-changed");
611     SetEventName (eBroadcastBitInterrupt, "interrupt");
612     SetEventName (eBroadcastBitSTDOUT, "stdout-available");
613     SetEventName (eBroadcastBitSTDERR, "stderr-available");
614 
615     listener.StartListeningForEvents (this,
616                                       eBroadcastBitStateChanged |
617                                       eBroadcastBitInterrupt |
618                                       eBroadcastBitSTDOUT |
619                                       eBroadcastBitSTDERR);
620 
621     m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
622                                                      eBroadcastBitStateChanged);
623 
624     m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
625                                                      eBroadcastInternalStateControlStop |
626                                                      eBroadcastInternalStateControlPause |
627                                                      eBroadcastInternalStateControlResume);
628 }
629 
630 //----------------------------------------------------------------------
631 // Destructor
632 //----------------------------------------------------------------------
633 Process::~Process()
634 {
635     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
636     if (log)
637         log->Printf ("%p Process::~Process()", this);
638     StopPrivateStateThread();
639 }
640 
641 void
642 Process::Finalize()
643 {
644     // Do any cleanup needed prior to being destructed... Subclasses
645     // that override this method should call this superclass method as well.
646 
647     // We need to destroy the loader before the derived Process class gets destroyed
648     // since it is very likely that undoing the loader will require access to the real process.
649     if (m_dyld_ap.get() != NULL)
650         m_dyld_ap.reset();
651 }
652 
653 void
654 Process::RegisterNotificationCallbacks (const Notifications& callbacks)
655 {
656     m_notifications.push_back(callbacks);
657     if (callbacks.initialize != NULL)
658         callbacks.initialize (callbacks.baton, this);
659 }
660 
661 bool
662 Process::UnregisterNotificationCallbacks(const Notifications& callbacks)
663 {
664     std::vector<Notifications>::iterator pos, end = m_notifications.end();
665     for (pos = m_notifications.begin(); pos != end; ++pos)
666     {
667         if (pos->baton == callbacks.baton &&
668             pos->initialize == callbacks.initialize &&
669             pos->process_state_changed == callbacks.process_state_changed)
670         {
671             m_notifications.erase(pos);
672             return true;
673         }
674     }
675     return false;
676 }
677 
678 void
679 Process::SynchronouslyNotifyStateChanged (StateType state)
680 {
681     std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
682     for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
683     {
684         if (notification_pos->process_state_changed)
685             notification_pos->process_state_changed (notification_pos->baton, this, state);
686     }
687 }
688 
689 // FIXME: We need to do some work on events before the general Listener sees them.
690 // For instance if we are continuing from a breakpoint, we need to ensure that we do
691 // the little "insert real insn, step & stop" trick.  But we can't do that when the
692 // event is delivered by the broadcaster - since that is done on the thread that is
693 // waiting for new events, so if we needed more than one event for our handling, we would
694 // stall.  So instead we do it when we fetch the event off of the queue.
695 //
696 
697 StateType
698 Process::GetNextEvent (EventSP &event_sp)
699 {
700     StateType state = eStateInvalid;
701 
702     if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
703         state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
704 
705     return state;
706 }
707 
708 
709 StateType
710 Process::WaitForProcessToStop (const TimeValue *timeout)
711 {
712     StateType match_states[] = { eStateStopped, eStateCrashed, eStateDetached, eStateExited, eStateUnloaded };
713     return WaitForState (timeout, match_states, sizeof(match_states) / sizeof(StateType));
714 }
715 
716 
717 StateType
718 Process::WaitForState
719 (
720     const TimeValue *timeout,
721     const StateType *match_states, const uint32_t num_match_states
722 )
723 {
724     EventSP event_sp;
725     uint32_t i;
726     StateType state = GetState();
727     while (state != eStateInvalid)
728     {
729         // If we are exited or detached, we won't ever get back to any
730         // other valid state...
731         if (state == eStateDetached || state == eStateExited)
732             return state;
733 
734         state = WaitForStateChangedEvents (timeout, event_sp);
735 
736         for (i=0; i<num_match_states; ++i)
737         {
738             if (match_states[i] == state)
739                 return state;
740         }
741     }
742     return state;
743 }
744 
745 bool
746 Process::HijackProcessEvents (Listener *listener)
747 {
748     if (listener != NULL)
749     {
750         return HijackBroadcaster(listener, eBroadcastBitStateChanged);
751     }
752     else
753         return false;
754 }
755 
756 void
757 Process::RestoreProcessEvents ()
758 {
759     RestoreBroadcaster();
760 }
761 
762 bool
763 Process::HijackPrivateProcessEvents (Listener *listener)
764 {
765     if (listener != NULL)
766     {
767         return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged);
768     }
769     else
770         return false;
771 }
772 
773 void
774 Process::RestorePrivateProcessEvents ()
775 {
776     m_private_state_broadcaster.RestoreBroadcaster();
777 }
778 
779 StateType
780 Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
781 {
782     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
783 
784     if (log)
785         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
786 
787     StateType state = eStateInvalid;
788     if (m_listener.WaitForEventForBroadcasterWithType (timeout,
789                                                        this,
790                                                        eBroadcastBitStateChanged,
791                                                        event_sp))
792         state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
793 
794     if (log)
795         log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
796                      __FUNCTION__,
797                      timeout,
798                      StateAsCString(state));
799     return state;
800 }
801 
802 Event *
803 Process::PeekAtStateChangedEvents ()
804 {
805     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
806 
807     if (log)
808         log->Printf ("Process::%s...", __FUNCTION__);
809 
810     Event *event_ptr;
811     event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
812                                                                   eBroadcastBitStateChanged);
813     if (log)
814     {
815         if (event_ptr)
816         {
817             log->Printf ("Process::%s (event_ptr) => %s",
818                          __FUNCTION__,
819                          StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
820         }
821         else
822         {
823             log->Printf ("Process::%s no events found",
824                          __FUNCTION__);
825         }
826     }
827     return event_ptr;
828 }
829 
830 StateType
831 Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
832 {
833     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
834 
835     if (log)
836         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
837 
838     StateType state = eStateInvalid;
839     if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout,
840                                                                      &m_private_state_broadcaster,
841                                                                      eBroadcastBitStateChanged,
842                                                                      event_sp))
843         state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
844 
845     // This is a bit of a hack, but when we wait here we could very well return
846     // to the command-line, and that could disable the log, which would render the
847     // log we got above invalid.
848     if (log)
849     {
850         if (state == eStateInvalid)
851             log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout);
852         else
853             log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
854     }
855     return state;
856 }
857 
858 bool
859 Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
860 {
861     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
862 
863     if (log)
864         log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
865 
866     if (control_only)
867         return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
868     else
869         return m_private_state_listener.WaitForEvent(timeout, event_sp);
870 }
871 
872 bool
873 Process::IsRunning () const
874 {
875     return StateIsRunningState (m_public_state.GetValue());
876 }
877 
878 int
879 Process::GetExitStatus ()
880 {
881     if (m_public_state.GetValue() == eStateExited)
882         return m_exit_status;
883     return -1;
884 }
885 
886 
887 void
888 Process::ProcessInstanceSettings::GetHostEnvironmentIfNeeded ()
889 {
890     if (m_inherit_host_env && !m_got_host_env)
891     {
892         m_got_host_env = true;
893         StringList host_env;
894         const size_t host_env_count = Host::GetEnvironment (host_env);
895         for (size_t idx=0; idx<host_env_count; idx++)
896         {
897             const char *env_entry = host_env.GetStringAtIndex (idx);
898             if (env_entry)
899             {
900                 const char *equal_pos = ::strchr(env_entry, '=');
901                 if (equal_pos)
902                 {
903                     std::string key (env_entry, equal_pos - env_entry);
904                     std::string value (equal_pos + 1);
905                     if (m_env_vars.find (key) == m_env_vars.end())
906                         m_env_vars[key] = value;
907                 }
908             }
909         }
910     }
911 }
912 
913 
914 size_t
915 Process::ProcessInstanceSettings::GetEnvironmentAsArgs (Args &env)
916 {
917     GetHostEnvironmentIfNeeded ();
918 
919     dictionary::const_iterator pos, end = m_env_vars.end();
920     for (pos = m_env_vars.begin(); pos != end; ++pos)
921     {
922         std::string env_var_equal_value (pos->first);
923         env_var_equal_value.append(1, '=');
924         env_var_equal_value.append (pos->second);
925         env.AppendArgument (env_var_equal_value.c_str());
926     }
927     return env.GetArgumentCount();
928 }
929 
930 
931 const char *
932 Process::GetExitDescription ()
933 {
934     if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
935         return m_exit_string.c_str();
936     return NULL;
937 }
938 
939 bool
940 Process::SetExitStatus (int status, const char *cstr)
941 {
942     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
943     if (log)
944         log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
945                     status, status,
946                     cstr ? "\"" : "",
947                     cstr ? cstr : "NULL",
948                     cstr ? "\"" : "");
949 
950     // We were already in the exited state
951     if (m_private_state.GetValue() == eStateExited)
952     {
953         if (log)
954             log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
955         return false;
956     }
957 
958     m_exit_status = status;
959     if (cstr)
960         m_exit_string = cstr;
961     else
962         m_exit_string.clear();
963 
964     DidExit ();
965 
966     SetPrivateState (eStateExited);
967     return true;
968 }
969 
970 // This static callback can be used to watch for local child processes on
971 // the current host. The the child process exits, the process will be
972 // found in the global target list (we want to be completely sure that the
973 // lldb_private::Process doesn't go away before we can deliver the signal.
974 bool
975 Process::SetProcessExitStatus
976 (
977     void *callback_baton,
978     lldb::pid_t pid,
979     int signo,      // Zero for no signal
980     int exit_status      // Exit value of process if signal is zero
981 )
982 {
983     if (signo == 0 || exit_status)
984     {
985         TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
986         if (target_sp)
987         {
988             ProcessSP process_sp (target_sp->GetProcessSP());
989             if (process_sp)
990             {
991                 const char *signal_cstr = NULL;
992                 if (signo)
993                     signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
994 
995                 process_sp->SetExitStatus (exit_status, signal_cstr);
996             }
997         }
998         return true;
999     }
1000     return false;
1001 }
1002 
1003 
1004 uint32_t
1005 Process::GetNextThreadIndexID ()
1006 {
1007     return ++m_thread_index_id;
1008 }
1009 
1010 StateType
1011 Process::GetState()
1012 {
1013     // If any other threads access this we will need a mutex for it
1014     return m_public_state.GetValue ();
1015 }
1016 
1017 void
1018 Process::SetPublicState (StateType new_state)
1019 {
1020     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1021     if (log)
1022         log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state));
1023     m_public_state.SetValue (new_state);
1024 }
1025 
1026 StateType
1027 Process::GetPrivateState ()
1028 {
1029     return m_private_state.GetValue();
1030 }
1031 
1032 void
1033 Process::SetPrivateState (StateType new_state)
1034 {
1035     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1036     bool state_changed = false;
1037 
1038     if (log)
1039         log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1040 
1041     Mutex::Locker locker(m_private_state.GetMutex());
1042 
1043     const StateType old_state = m_private_state.GetValueNoLock ();
1044     state_changed = old_state != new_state;
1045     if (state_changed)
1046     {
1047         m_private_state.SetValueNoLock (new_state);
1048         if (StateIsStoppedState(new_state))
1049         {
1050             m_stop_id++;
1051             m_memory_cache.Clear();
1052             if (log)
1053                 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_stop_id);
1054         }
1055         // Use our target to get a shared pointer to ourselves...
1056         m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state));
1057     }
1058     else
1059     {
1060         if (log)
1061             log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state), StateAsCString(old_state));
1062     }
1063 }
1064 
1065 
1066 uint32_t
1067 Process::GetStopID() const
1068 {
1069     return m_stop_id;
1070 }
1071 
1072 addr_t
1073 Process::GetImageInfoAddress()
1074 {
1075     return LLDB_INVALID_ADDRESS;
1076 }
1077 
1078 //----------------------------------------------------------------------
1079 // LoadImage
1080 //
1081 // This function provides a default implementation that works for most
1082 // unix variants. Any Process subclasses that need to do shared library
1083 // loading differently should override LoadImage and UnloadImage and
1084 // do what is needed.
1085 //----------------------------------------------------------------------
1086 uint32_t
1087 Process::LoadImage (const FileSpec &image_spec, Error &error)
1088 {
1089     DynamicLoader *loader = GetDynamicLoader();
1090     if (loader)
1091     {
1092         error = loader->CanLoadImage();
1093         if (error.Fail())
1094             return LLDB_INVALID_IMAGE_TOKEN;
1095     }
1096 
1097     if (error.Success())
1098     {
1099         ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1100         if (thread_sp == NULL)
1101             thread_sp = GetThreadList ().GetThreadAtIndex(0, true);
1102 
1103         if (thread_sp)
1104         {
1105             StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1106 
1107             if (frame_sp)
1108             {
1109                 ExecutionContext exe_ctx;
1110                 frame_sp->CalculateExecutionContext (exe_ctx);
1111                 bool unwind_on_error = true;
1112                 StreamString expr;
1113                 char path[PATH_MAX];
1114                 image_spec.GetPath(path, sizeof(path));
1115                 expr.Printf("dlopen (\"%s\", 2)", path);
1116                 const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
1117                 lldb::ValueObjectSP result_valobj_sp;
1118                 ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
1119                 if (result_valobj_sp->GetError().Success())
1120                 {
1121                     Scalar scalar;
1122                     if (result_valobj_sp->ResolveValue (scalar))
1123                     {
1124                         addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1125                         if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
1126                         {
1127                             uint32_t image_token = m_image_tokens.size();
1128                             m_image_tokens.push_back (image_ptr);
1129                             return image_token;
1130                         }
1131                     }
1132                 }
1133             }
1134         }
1135     }
1136     return LLDB_INVALID_IMAGE_TOKEN;
1137 }
1138 
1139 //----------------------------------------------------------------------
1140 // UnloadImage
1141 //
1142 // This function provides a default implementation that works for most
1143 // unix variants. Any Process subclasses that need to do shared library
1144 // loading differently should override LoadImage and UnloadImage and
1145 // do what is needed.
1146 //----------------------------------------------------------------------
1147 Error
1148 Process::UnloadImage (uint32_t image_token)
1149 {
1150     Error error;
1151     if (image_token < m_image_tokens.size())
1152     {
1153         const addr_t image_addr = m_image_tokens[image_token];
1154         if (image_addr == LLDB_INVALID_ADDRESS)
1155         {
1156             error.SetErrorString("image already unloaded");
1157         }
1158         else
1159         {
1160             DynamicLoader *loader = GetDynamicLoader();
1161             if (loader)
1162                 error = loader->CanLoadImage();
1163 
1164             if (error.Success())
1165             {
1166                 ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
1167                 if (thread_sp == NULL)
1168                     thread_sp = GetThreadList ().GetThreadAtIndex(0, true);
1169 
1170                 if (thread_sp)
1171                 {
1172                     StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1173 
1174                     if (frame_sp)
1175                     {
1176                         ExecutionContext exe_ctx;
1177                         frame_sp->CalculateExecutionContext (exe_ctx);
1178                         bool unwind_on_error = true;
1179                         StreamString expr;
1180                         expr.Printf("dlclose ((void *)0x%llx)", image_addr);
1181                         const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
1182                         lldb::ValueObjectSP result_valobj_sp;
1183                         ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
1184                         if (result_valobj_sp->GetError().Success())
1185                         {
1186                             Scalar scalar;
1187                             if (result_valobj_sp->ResolveValue (scalar))
1188                             {
1189                                 if (scalar.UInt(1))
1190                                 {
1191                                     error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
1192                                 }
1193                                 else
1194                                 {
1195                                     m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
1196                                 }
1197                             }
1198                         }
1199                         else
1200                         {
1201                             error = result_valobj_sp->GetError();
1202                         }
1203                     }
1204                 }
1205             }
1206         }
1207     }
1208     else
1209     {
1210         error.SetErrorString("invalid image token");
1211     }
1212     return error;
1213 }
1214 
1215 const lldb::ABISP &
1216 Process::GetABI()
1217 {
1218     if (!m_abi_sp)
1219         m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture());
1220     return m_abi_sp;
1221 }
1222 
1223 LanguageRuntime *
1224 Process::GetLanguageRuntime(lldb::LanguageType language)
1225 {
1226     LanguageRuntimeCollection::iterator pos;
1227     pos = m_language_runtimes.find (language);
1228     if (pos == m_language_runtimes.end())
1229     {
1230         lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language));
1231 
1232         m_language_runtimes[language]
1233             = runtime;
1234         return runtime.get();
1235     }
1236     else
1237         return (*pos).second.get();
1238 }
1239 
1240 CPPLanguageRuntime *
1241 Process::GetCPPLanguageRuntime ()
1242 {
1243     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus);
1244     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
1245         return static_cast<CPPLanguageRuntime *> (runtime);
1246     return NULL;
1247 }
1248 
1249 ObjCLanguageRuntime *
1250 Process::GetObjCLanguageRuntime ()
1251 {
1252     LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC);
1253     if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
1254         return static_cast<ObjCLanguageRuntime *> (runtime);
1255     return NULL;
1256 }
1257 
1258 BreakpointSiteList &
1259 Process::GetBreakpointSiteList()
1260 {
1261     return m_breakpoint_site_list;
1262 }
1263 
1264 const BreakpointSiteList &
1265 Process::GetBreakpointSiteList() const
1266 {
1267     return m_breakpoint_site_list;
1268 }
1269 
1270 
1271 void
1272 Process::DisableAllBreakpointSites ()
1273 {
1274     m_breakpoint_site_list.SetEnabledForAll (false);
1275 }
1276 
1277 Error
1278 Process::ClearBreakpointSiteByID (lldb::user_id_t break_id)
1279 {
1280     Error error (DisableBreakpointSiteByID (break_id));
1281 
1282     if (error.Success())
1283         m_breakpoint_site_list.Remove(break_id);
1284 
1285     return error;
1286 }
1287 
1288 Error
1289 Process::DisableBreakpointSiteByID (lldb::user_id_t break_id)
1290 {
1291     Error error;
1292     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
1293     if (bp_site_sp)
1294     {
1295         if (bp_site_sp->IsEnabled())
1296             error = DisableBreakpoint (bp_site_sp.get());
1297     }
1298     else
1299     {
1300         error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id);
1301     }
1302 
1303     return error;
1304 }
1305 
1306 Error
1307 Process::EnableBreakpointSiteByID (lldb::user_id_t break_id)
1308 {
1309     Error error;
1310     BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
1311     if (bp_site_sp)
1312     {
1313         if (!bp_site_sp->IsEnabled())
1314             error = EnableBreakpoint (bp_site_sp.get());
1315     }
1316     else
1317     {
1318         error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id);
1319     }
1320     return error;
1321 }
1322 
1323 lldb::break_id_t
1324 Process::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware)
1325 {
1326     const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
1327     if (load_addr != LLDB_INVALID_ADDRESS)
1328     {
1329         BreakpointSiteSP bp_site_sp;
1330 
1331         // Look up this breakpoint site.  If it exists, then add this new owner, otherwise
1332         // create a new breakpoint site and add it.
1333 
1334         bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
1335 
1336         if (bp_site_sp)
1337         {
1338             bp_site_sp->AddOwner (owner);
1339             owner->SetBreakpointSite (bp_site_sp);
1340             return bp_site_sp->GetID();
1341         }
1342         else
1343         {
1344             bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware));
1345             if (bp_site_sp)
1346             {
1347                 if (EnableBreakpoint (bp_site_sp.get()).Success())
1348                 {
1349                     owner->SetBreakpointSite (bp_site_sp);
1350                     return m_breakpoint_site_list.Add (bp_site_sp);
1351                 }
1352             }
1353         }
1354     }
1355     // We failed to enable the breakpoint
1356     return LLDB_INVALID_BREAK_ID;
1357 
1358 }
1359 
1360 void
1361 Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
1362 {
1363     uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
1364     if (num_owners == 0)
1365     {
1366         DisableBreakpoint(bp_site_sp.get());
1367         m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
1368     }
1369 }
1370 
1371 
1372 size_t
1373 Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
1374 {
1375     size_t bytes_removed = 0;
1376     addr_t intersect_addr;
1377     size_t intersect_size;
1378     size_t opcode_offset;
1379     size_t idx;
1380     BreakpointSiteSP bp;
1381 
1382     for (idx = 0; (bp = m_breakpoint_site_list.GetByIndex(idx)) != NULL; ++idx)
1383     {
1384         if (bp->GetType() == BreakpointSite::eSoftware)
1385         {
1386             if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
1387             {
1388                 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
1389                 assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
1390                 assert(opcode_offset + intersect_size <= bp->GetByteSize());
1391                 size_t buf_offset = intersect_addr - bp_addr;
1392                 ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
1393             }
1394         }
1395     }
1396     return bytes_removed;
1397 }
1398 
1399 
1400 
1401 size_t
1402 Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
1403 {
1404     PlatformSP platform_sp (m_target.GetPlatform());
1405     if (platform_sp)
1406         return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
1407     return 0;
1408 }
1409 
1410 Error
1411 Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
1412 {
1413     Error error;
1414     assert (bp_site != NULL);
1415     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
1416     const addr_t bp_addr = bp_site->GetLoadAddress();
1417     if (log)
1418         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr);
1419     if (bp_site->IsEnabled())
1420     {
1421         if (log)
1422             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
1423         return error;
1424     }
1425 
1426     if (bp_addr == LLDB_INVALID_ADDRESS)
1427     {
1428         error.SetErrorString("BreakpointSite contains an invalid load address.");
1429         return error;
1430     }
1431     // Ask the lldb::Process subclass to fill in the correct software breakpoint
1432     // trap for the breakpoint site
1433     const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
1434 
1435     if (bp_opcode_size == 0)
1436     {
1437         error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx.\n", bp_addr);
1438     }
1439     else
1440     {
1441         const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
1442 
1443         if (bp_opcode_bytes == NULL)
1444         {
1445             error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
1446             return error;
1447         }
1448 
1449         // Save the original opcode by reading it
1450         if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
1451         {
1452             // Write a software breakpoint in place of the original opcode
1453             if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
1454             {
1455                 uint8_t verify_bp_opcode_bytes[64];
1456                 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
1457                 {
1458                     if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
1459                     {
1460                         bp_site->SetEnabled(true);
1461                         bp_site->SetType (BreakpointSite::eSoftware);
1462                         if (log)
1463                             log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS",
1464                                          bp_site->GetID(),
1465                                          (uint64_t)bp_addr);
1466                     }
1467                     else
1468                         error.SetErrorString("Failed to verify the breakpoint trap in memory.");
1469                 }
1470                 else
1471                     error.SetErrorString("Unable to read memory to verify breakpoint trap.");
1472             }
1473             else
1474                 error.SetErrorString("Unable to write breakpoint trap to memory.");
1475         }
1476         else
1477             error.SetErrorString("Unable to read memory at breakpoint address.");
1478     }
1479     if (log && error.Fail())
1480         log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
1481                      bp_site->GetID(),
1482                      (uint64_t)bp_addr,
1483                      error.AsCString());
1484     return error;
1485 }
1486 
1487 Error
1488 Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
1489 {
1490     Error error;
1491     assert (bp_site != NULL);
1492     LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
1493     addr_t bp_addr = bp_site->GetLoadAddress();
1494     lldb::user_id_t breakID = bp_site->GetID();
1495     if (log)
1496         log->Printf ("Process::DisableBreakpoint (breakID = %d) addr = 0x%llx", breakID, (uint64_t)bp_addr);
1497 
1498     if (bp_site->IsHardware())
1499     {
1500         error.SetErrorString("Breakpoint site is a hardware breakpoint.");
1501     }
1502     else if (bp_site->IsEnabled())
1503     {
1504         const size_t break_op_size = bp_site->GetByteSize();
1505         const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
1506         if (break_op_size > 0)
1507         {
1508             // Clear a software breakoint instruction
1509             uint8_t curr_break_op[8];
1510             assert (break_op_size <= sizeof(curr_break_op));
1511             bool break_op_found = false;
1512 
1513             // Read the breakpoint opcode
1514             if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
1515             {
1516                 bool verify = false;
1517                 // Make sure we have the a breakpoint opcode exists at this address
1518                 if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
1519                 {
1520                     break_op_found = true;
1521                     // We found a valid breakpoint opcode at this address, now restore
1522                     // the saved opcode.
1523                     if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
1524                     {
1525                         verify = true;
1526                     }
1527                     else
1528                         error.SetErrorString("Memory write failed when restoring original opcode.");
1529                 }
1530                 else
1531                 {
1532                     error.SetErrorString("Original breakpoint trap is no longer in memory.");
1533                     // Set verify to true and so we can check if the original opcode has already been restored
1534                     verify = true;
1535                 }
1536 
1537                 if (verify)
1538                 {
1539                     uint8_t verify_opcode[8];
1540                     assert (break_op_size < sizeof(verify_opcode));
1541                     // Verify that our original opcode made it back to the inferior
1542                     if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
1543                     {
1544                         // compare the memory we just read with the original opcode
1545                         if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
1546                         {
1547                             // SUCCESS
1548                             bp_site->SetEnabled(false);
1549                             if (log)
1550                                 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
1551                             return error;
1552                         }
1553                         else
1554                         {
1555                             if (break_op_found)
1556                                 error.SetErrorString("Failed to restore original opcode.");
1557                         }
1558                     }
1559                     else
1560                         error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
1561                 }
1562             }
1563             else
1564                 error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
1565         }
1566     }
1567     else
1568     {
1569         if (log)
1570             log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
1571         return error;
1572     }
1573 
1574     if (log)
1575         log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
1576                      bp_site->GetID(),
1577                      (uint64_t)bp_addr,
1578                      error.AsCString());
1579     return error;
1580 
1581 }
1582 
1583 // Comment out line below to disable memory caching
1584 #define ENABLE_MEMORY_CACHING
1585 // Uncomment to verify memory caching works after making changes to caching code
1586 //#define VERIFY_MEMORY_READS
1587 
1588 #if defined (ENABLE_MEMORY_CACHING)
1589 
1590 #if defined (VERIFY_MEMORY_READS)
1591 
1592 size_t
1593 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1594 {
1595     // Memory caching is enabled, with debug verification
1596     if (buf && size)
1597     {
1598         // Uncomment the line below to make sure memory caching is working.
1599         // I ran this through the test suite and got no assertions, so I am
1600         // pretty confident this is working well. If any changes are made to
1601         // memory caching, uncomment the line below and test your changes!
1602 
1603         // Verify all memory reads by using the cache first, then redundantly
1604         // reading the same memory from the inferior and comparing to make sure
1605         // everything is exactly the same.
1606         std::string verify_buf (size, '\0');
1607         assert (verify_buf.size() == size);
1608         const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
1609         Error verify_error;
1610         const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
1611         assert (cache_bytes_read == verify_bytes_read);
1612         assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
1613         assert (verify_error.Success() == error.Success());
1614         return cache_bytes_read;
1615     }
1616     return 0;
1617 }
1618 
1619 #else   // #if defined (VERIFY_MEMORY_READS)
1620 
1621 size_t
1622 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1623 {
1624     // Memory caching enabled, no verification
1625     return m_memory_cache.Read (addr, buf, size, error);
1626 }
1627 
1628 #endif  // #else for #if defined (VERIFY_MEMORY_READS)
1629 
1630 #else   // #if defined (ENABLE_MEMORY_CACHING)
1631 
1632 size_t
1633 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1634 {
1635     // Memory caching is disabled
1636     return ReadMemoryFromInferior (addr, buf, size, error);
1637 }
1638 
1639 #endif  // #else for #if defined (ENABLE_MEMORY_CACHING)
1640 
1641 
1642 size_t
1643 Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len)
1644 {
1645     size_t total_cstr_len = 0;
1646     if (dst && dst_max_len)
1647     {
1648         // NULL out everything just to be safe
1649         memset (dst, 0, dst_max_len);
1650         Error error;
1651         addr_t curr_addr = addr;
1652         const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
1653         size_t bytes_left = dst_max_len - 1;
1654         char *curr_dst = dst;
1655 
1656         while (bytes_left > 0)
1657         {
1658             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1659             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1660             size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
1661 
1662             if (bytes_read == 0)
1663             {
1664                 dst[total_cstr_len] = '\0';
1665                 break;
1666             }
1667             const size_t len = strlen(curr_dst);
1668 
1669             total_cstr_len += len;
1670 
1671             if (len < bytes_to_read)
1672                 break;
1673 
1674             curr_dst += bytes_read;
1675             curr_addr += bytes_read;
1676             bytes_left -= bytes_read;
1677         }
1678     }
1679     return total_cstr_len;
1680 }
1681 
1682 size_t
1683 Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
1684 {
1685     if (buf == NULL || size == 0)
1686         return 0;
1687 
1688     size_t bytes_read = 0;
1689     uint8_t *bytes = (uint8_t *)buf;
1690 
1691     while (bytes_read < size)
1692     {
1693         const size_t curr_size = size - bytes_read;
1694         const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
1695                                                      bytes + bytes_read,
1696                                                      curr_size,
1697                                                      error);
1698         bytes_read += curr_bytes_read;
1699         if (curr_bytes_read == curr_size || curr_bytes_read == 0)
1700             break;
1701     }
1702 
1703     // Replace any software breakpoint opcodes that fall into this range back
1704     // into "buf" before we return
1705     if (bytes_read > 0)
1706         RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
1707     return bytes_read;
1708 }
1709 
1710 uint64_t
1711 Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
1712 {
1713     Scalar scalar;
1714     if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
1715         return scalar.ULongLong(fail_value);
1716     return fail_value;
1717 }
1718 
1719 addr_t
1720 Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
1721 {
1722     Scalar scalar;
1723     if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
1724         return scalar.ULongLong(LLDB_INVALID_ADDRESS);
1725     return LLDB_INVALID_ADDRESS;
1726 }
1727 
1728 
1729 bool
1730 Process::WritePointerToMemory (lldb::addr_t vm_addr,
1731                                lldb::addr_t ptr_value,
1732                                Error &error)
1733 {
1734     Scalar scalar;
1735     const uint32_t addr_byte_size = GetAddressByteSize();
1736     if (addr_byte_size <= 4)
1737         scalar = (uint32_t)ptr_value;
1738     else
1739         scalar = ptr_value;
1740     return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
1741 }
1742 
1743 size_t
1744 Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
1745 {
1746     size_t bytes_written = 0;
1747     const uint8_t *bytes = (const uint8_t *)buf;
1748 
1749     while (bytes_written < size)
1750     {
1751         const size_t curr_size = size - bytes_written;
1752         const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
1753                                                          bytes + bytes_written,
1754                                                          curr_size,
1755                                                          error);
1756         bytes_written += curr_bytes_written;
1757         if (curr_bytes_written == curr_size || curr_bytes_written == 0)
1758             break;
1759     }
1760     return bytes_written;
1761 }
1762 
1763 size_t
1764 Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
1765 {
1766 #if defined (ENABLE_MEMORY_CACHING)
1767     m_memory_cache.Flush (addr, size);
1768 #endif
1769 
1770     if (buf == NULL || size == 0)
1771         return 0;
1772 
1773     // Need to bump the stop ID after writing so that ValueObjects will know to re-read themselves.
1774     // FUTURE: Doing this should be okay, but if anybody else gets upset about the stop_id changing when
1775     // the target hasn't run, then we will need to add a "memory generation" as well as a stop_id...
1776     m_stop_id++;
1777 
1778     // We need to write any data that would go where any current software traps
1779     // (enabled software breakpoints) any software traps (breakpoints) that we
1780     // may have placed in our tasks memory.
1781 
1782     BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr);
1783     BreakpointSiteList::collection::const_iterator end =  m_breakpoint_site_list.GetMap()->end();
1784 
1785     if (iter == end || iter->second->GetLoadAddress() > addr + size)
1786         return WriteMemoryPrivate (addr, buf, size, error);
1787 
1788     BreakpointSiteList::collection::const_iterator pos;
1789     size_t bytes_written = 0;
1790     addr_t intersect_addr = 0;
1791     size_t intersect_size = 0;
1792     size_t opcode_offset = 0;
1793     const uint8_t *ubuf = (const uint8_t *)buf;
1794 
1795     for (pos = iter; pos != end; ++pos)
1796     {
1797         BreakpointSiteSP bp;
1798         bp = pos->second;
1799 
1800         assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset));
1801         assert(addr <= intersect_addr && intersect_addr < addr + size);
1802         assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
1803         assert(opcode_offset + intersect_size <= bp->GetByteSize());
1804 
1805         // Check for bytes before this breakpoint
1806         const addr_t curr_addr = addr + bytes_written;
1807         if (intersect_addr > curr_addr)
1808         {
1809             // There are some bytes before this breakpoint that we need to
1810             // just write to memory
1811             size_t curr_size = intersect_addr - curr_addr;
1812             size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
1813                                                             ubuf + bytes_written,
1814                                                             curr_size,
1815                                                             error);
1816             bytes_written += curr_bytes_written;
1817             if (curr_bytes_written != curr_size)
1818             {
1819                 // We weren't able to write all of the requested bytes, we
1820                 // are done looping and will return the number of bytes that
1821                 // we have written so far.
1822                 break;
1823             }
1824         }
1825 
1826         // Now write any bytes that would cover up any software breakpoints
1827         // directly into the breakpoint opcode buffer
1828         ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
1829         bytes_written += intersect_size;
1830     }
1831 
1832     // Write any remaining bytes after the last breakpoint if we have any left
1833     if (bytes_written < size)
1834         bytes_written += WriteMemoryPrivate (addr + bytes_written,
1835                                              ubuf + bytes_written,
1836                                              size - bytes_written,
1837                                              error);
1838 
1839     return bytes_written;
1840 }
1841 
1842 size_t
1843 Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error)
1844 {
1845     if (byte_size == UINT32_MAX)
1846         byte_size = scalar.GetByteSize();
1847     if (byte_size > 0)
1848     {
1849         uint8_t buf[32];
1850         const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
1851         if (mem_size > 0)
1852             return WriteMemory(addr, buf, mem_size, error);
1853         else
1854             error.SetErrorString ("failed to get scalar as memory data");
1855     }
1856     else
1857     {
1858         error.SetErrorString ("invalid scalar value");
1859     }
1860     return 0;
1861 }
1862 
1863 size_t
1864 Process::ReadScalarIntegerFromMemory (addr_t addr,
1865                                       uint32_t byte_size,
1866                                       bool is_signed,
1867                                       Scalar &scalar,
1868                                       Error &error)
1869 {
1870     uint64_t uval;
1871 
1872     if (byte_size <= sizeof(uval))
1873     {
1874         size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
1875         if (bytes_read == byte_size)
1876         {
1877             DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
1878             uint32_t offset = 0;
1879             if (byte_size <= 4)
1880                 scalar = data.GetMaxU32 (&offset, byte_size);
1881             else
1882                 scalar = data.GetMaxU64 (&offset, byte_size);
1883 
1884             if (is_signed)
1885                 scalar.SignExtend(byte_size * 8);
1886             return bytes_read;
1887         }
1888     }
1889     else
1890     {
1891         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1892     }
1893     return 0;
1894 }
1895 
1896 #define USE_ALLOCATE_MEMORY_CACHE 1
1897 addr_t
1898 Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
1899 {
1900 #if defined (USE_ALLOCATE_MEMORY_CACHE)
1901     return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
1902 #else
1903     addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
1904     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1905     if (log)
1906         log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u)",
1907                     size,
1908                     GetPermissionsAsCString (permissions),
1909                     (uint64_t)allocated_addr,
1910                     m_stop_id);
1911     return allocated_addr;
1912 #endif
1913 }
1914 
1915 Error
1916 Process::DeallocateMemory (addr_t ptr)
1917 {
1918     Error error;
1919 #if defined (USE_ALLOCATE_MEMORY_CACHE)
1920     if (!m_allocated_memory_cache.DeallocateMemory(ptr))
1921     {
1922         error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr);
1923     }
1924 #else
1925     error = DoDeallocateMemory (ptr);
1926 
1927     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1928     if (log)
1929         log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u)",
1930                     ptr,
1931                     error.AsCString("SUCCESS"),
1932                     m_stop_id);
1933 #endif
1934     return error;
1935 }
1936 
1937 
1938 Error
1939 Process::EnableWatchpoint (WatchpointLocation *watchpoint)
1940 {
1941     Error error;
1942     error.SetErrorString("watchpoints are not supported");
1943     return error;
1944 }
1945 
1946 Error
1947 Process::DisableWatchpoint (WatchpointLocation *watchpoint)
1948 {
1949     Error error;
1950     error.SetErrorString("watchpoints are not supported");
1951     return error;
1952 }
1953 
1954 StateType
1955 Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
1956 {
1957     StateType state;
1958     // Now wait for the process to launch and return control to us, and then
1959     // call DidLaunch:
1960     while (1)
1961     {
1962         event_sp.reset();
1963         state = WaitForStateChangedEventsPrivate (timeout, event_sp);
1964 
1965         if (StateIsStoppedState(state))
1966             break;
1967 
1968         // If state is invalid, then we timed out
1969         if (state == eStateInvalid)
1970             break;
1971 
1972         if (event_sp)
1973             HandlePrivateEvent (event_sp);
1974     }
1975     return state;
1976 }
1977 
1978 Error
1979 Process::Launch
1980 (
1981     char const *argv[],
1982     char const *envp[],
1983     uint32_t launch_flags,
1984     const char *stdin_path,
1985     const char *stdout_path,
1986     const char *stderr_path,
1987     const char *working_directory
1988 )
1989 {
1990     Error error;
1991     m_abi_sp.reset();
1992     m_dyld_ap.reset();
1993     m_process_input_reader.reset();
1994 
1995     Module *exe_module = m_target.GetExecutableModule().get();
1996     if (exe_module)
1997     {
1998         char local_exec_file_path[PATH_MAX];
1999         char platform_exec_file_path[PATH_MAX];
2000         exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
2001         exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
2002         if (exe_module->GetFileSpec().Exists())
2003         {
2004             if (PrivateStateThreadIsValid ())
2005                 PausePrivateStateThread ();
2006 
2007             error = WillLaunch (exe_module);
2008             if (error.Success())
2009             {
2010                 SetPublicState (eStateLaunching);
2011                 // The args coming in should not contain the application name, the
2012                 // lldb_private::Process class will add this in case the executable
2013                 // gets resolved to a different file than was given on the command
2014                 // line (like when an applicaiton bundle is specified and will
2015                 // resolve to the contained exectuable file, or the file given was
2016                 // a symlink or other file system link that resolves to a different
2017                 // file).
2018 
2019                 // Get the resolved exectuable path
2020 
2021                 // Make a new argument vector
2022                 std::vector<const char *> exec_path_plus_argv;
2023                 // Append the resolved executable path
2024                 exec_path_plus_argv.push_back (platform_exec_file_path);
2025 
2026                 // Push all args if there are any
2027                 if (argv)
2028                 {
2029                     for (int i = 0; argv[i]; ++i)
2030                         exec_path_plus_argv.push_back(argv[i]);
2031                 }
2032 
2033                 // Push a NULL to terminate the args.
2034                 exec_path_plus_argv.push_back(NULL);
2035 
2036                 // Now launch using these arguments.
2037                 error = DoLaunch (exe_module,
2038                                   exec_path_plus_argv.empty() ? NULL : &exec_path_plus_argv.front(),
2039                                   envp,
2040                                   launch_flags,
2041                                   stdin_path,
2042                                   stdout_path,
2043                                   stderr_path,
2044                                   working_directory);
2045 
2046                 if (error.Fail())
2047                 {
2048                     if (GetID() != LLDB_INVALID_PROCESS_ID)
2049                     {
2050                         SetID (LLDB_INVALID_PROCESS_ID);
2051                         const char *error_string = error.AsCString();
2052                         if (error_string == NULL)
2053                             error_string = "launch failed";
2054                         SetExitStatus (-1, error_string);
2055                     }
2056                 }
2057                 else
2058                 {
2059                     EventSP event_sp;
2060                     StateType state = WaitForProcessStopPrivate(NULL, event_sp);
2061 
2062                     if (state == eStateStopped || state == eStateCrashed)
2063                     {
2064 
2065                         DidLaunch ();
2066 
2067                         m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
2068                         if (m_dyld_ap.get())
2069                             m_dyld_ap->DidLaunch();
2070 
2071                         // This delays passing the stopped event to listeners till DidLaunch gets
2072                         // a chance to complete...
2073                         HandlePrivateEvent (event_sp);
2074 
2075                         if (PrivateStateThreadIsValid ())
2076                             ResumePrivateStateThread ();
2077                         else
2078                             StartPrivateStateThread ();
2079                     }
2080                     else if (state == eStateExited)
2081                     {
2082                         // We exited while trying to launch somehow.  Don't call DidLaunch as that's
2083                         // not likely to work, and return an invalid pid.
2084                         HandlePrivateEvent (event_sp);
2085                     }
2086                 }
2087             }
2088         }
2089         else
2090         {
2091             error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", local_exec_file_path);
2092         }
2093     }
2094     return error;
2095 }
2096 
2097 Process::NextEventAction::EventActionResult
2098 Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
2099 {
2100     StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
2101     switch (state)
2102     {
2103         case eStateRunning:
2104         case eStateConnected:
2105             return eEventActionRetry;
2106 
2107         case eStateStopped:
2108         case eStateCrashed:
2109         {
2110             // During attach, prior to sending the eStateStopped event,
2111             // lldb_private::Process subclasses must set the process must set
2112             // the new process ID.
2113             assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
2114             m_process->CompleteAttach ();
2115             return eEventActionSuccess;
2116         }
2117 
2118 
2119             break;
2120         default:
2121         case eStateExited:
2122         case eStateInvalid:
2123             m_exit_string.assign ("No valid Process");
2124             return eEventActionExit;
2125             break;
2126     }
2127 }
2128 
2129 Process::NextEventAction::EventActionResult
2130 Process::AttachCompletionHandler::HandleBeingInterrupted()
2131 {
2132     return eEventActionSuccess;
2133 }
2134 
2135 const char *
2136 Process::AttachCompletionHandler::GetExitString ()
2137 {
2138     return m_exit_string.c_str();
2139 }
2140 
2141 Error
2142 Process::Attach (lldb::pid_t attach_pid)
2143 {
2144 
2145     m_abi_sp.reset();
2146     m_process_input_reader.reset();
2147 
2148     // Find the process and its architecture.  Make sure it matches the architecture
2149     // of the current Target, and if not adjust it.
2150 
2151     ProcessInstanceInfo process_info;
2152     PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ());
2153     if (platform_sp)
2154     {
2155         if (platform_sp->GetProcessInfo (attach_pid, process_info))
2156         {
2157             const ArchSpec &process_arch = process_info.GetArchitecture();
2158             if (process_arch.IsValid())
2159                 GetTarget().SetArchitecture(process_arch);
2160         }
2161     }
2162 
2163     m_dyld_ap.reset();
2164 
2165     Error error (WillAttachToProcessWithID(attach_pid));
2166     if (error.Success())
2167     {
2168         SetPublicState (eStateAttaching);
2169 
2170         error = DoAttachToProcessWithID (attach_pid);
2171         if (error.Success())
2172         {
2173             SetNextEventAction(new Process::AttachCompletionHandler(this));
2174             StartPrivateStateThread();
2175         }
2176         else
2177         {
2178             if (GetID() != LLDB_INVALID_PROCESS_ID)
2179             {
2180                 SetID (LLDB_INVALID_PROCESS_ID);
2181                 const char *error_string = error.AsCString();
2182                 if (error_string == NULL)
2183                     error_string = "attach failed";
2184 
2185                 SetExitStatus(-1, error_string);
2186             }
2187         }
2188     }
2189     return error;
2190 }
2191 
2192 Error
2193 Process::Attach (const char *process_name, bool wait_for_launch)
2194 {
2195     m_abi_sp.reset();
2196     m_process_input_reader.reset();
2197 
2198     // Find the process and its architecture.  Make sure it matches the architecture
2199     // of the current Target, and if not adjust it.
2200     Error error;
2201 
2202     if (!wait_for_launch)
2203     {
2204         ProcessInstanceInfoList process_infos;
2205         PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ());
2206         if (platform_sp)
2207         {
2208             ProcessInstanceInfoMatch match_info;
2209             match_info.GetProcessInfo().SetName(process_name);
2210             match_info.SetNameMatchType (eNameMatchEquals);
2211             platform_sp->FindProcesses (match_info, process_infos);
2212             if (process_infos.GetSize() > 1)
2213             {
2214                 error.SetErrorStringWithFormat ("More than one process named %s\n", process_name);
2215             }
2216             else if (process_infos.GetSize() == 0)
2217             {
2218                 error.SetErrorStringWithFormat ("Could not find a process named %s\n", process_name);
2219             }
2220             else
2221             {
2222                 ProcessInstanceInfo process_info;
2223                 if (process_infos.GetInfoAtIndex (0, process_info))
2224                 {
2225                     const ArchSpec &process_arch = process_info.GetArchitecture();
2226                     if (process_arch.IsValid() && process_arch != GetTarget().GetArchitecture())
2227                     {
2228                         // Set the architecture on the target.
2229                         GetTarget().SetArchitecture (process_arch);
2230                     }
2231                 }
2232             }
2233         }
2234         else
2235         {
2236             error.SetErrorString ("Invalid platform");
2237         }
2238     }
2239 
2240     if (error.Success())
2241     {
2242         m_dyld_ap.reset();
2243 
2244         error = WillAttachToProcessWithName(process_name, wait_for_launch);
2245         if (error.Success())
2246         {
2247             SetPublicState (eStateAttaching);
2248             error = DoAttachToProcessWithName (process_name, wait_for_launch);
2249             if (error.Fail())
2250             {
2251                 if (GetID() != LLDB_INVALID_PROCESS_ID)
2252                 {
2253                     SetID (LLDB_INVALID_PROCESS_ID);
2254                     const char *error_string = error.AsCString();
2255                     if (error_string == NULL)
2256                         error_string = "attach failed";
2257 
2258                     SetExitStatus(-1, error_string);
2259                 }
2260             }
2261             else
2262             {
2263                 SetNextEventAction(new Process::AttachCompletionHandler(this));
2264                 StartPrivateStateThread();
2265             }
2266         }
2267     }
2268     return error;
2269 }
2270 
2271 void
2272 Process::CompleteAttach ()
2273 {
2274     // Let the process subclass figure out at much as it can about the process
2275     // before we go looking for a dynamic loader plug-in.
2276     DidAttach();
2277 
2278     // We have complete the attach, now it is time to find the dynamic loader
2279     // plug-in
2280     m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
2281     if (m_dyld_ap.get())
2282         m_dyld_ap->DidAttach();
2283 
2284     // Figure out which one is the executable, and set that in our target:
2285     ModuleList &modules = m_target.GetImages();
2286 
2287     size_t num_modules = modules.GetSize();
2288     for (int i = 0; i < num_modules; i++)
2289     {
2290         ModuleSP module_sp (modules.GetModuleAtIndex(i));
2291         if (module_sp && module_sp->IsExecutable())
2292         {
2293             ModuleSP target_exe_module_sp (m_target.GetExecutableModule());
2294             if (target_exe_module_sp != module_sp)
2295                 m_target.SetExecutableModule (module_sp, false);
2296             break;
2297         }
2298     }
2299 }
2300 
2301 Error
2302 Process::ConnectRemote (const char *remote_url)
2303 {
2304     m_abi_sp.reset();
2305     m_process_input_reader.reset();
2306 
2307     // Find the process and its architecture.  Make sure it matches the architecture
2308     // of the current Target, and if not adjust it.
2309 
2310     Error error (DoConnectRemote (remote_url));
2311     if (error.Success())
2312     {
2313         if (GetID() != LLDB_INVALID_PROCESS_ID)
2314         {
2315             EventSP event_sp;
2316             StateType state = WaitForProcessStopPrivate(NULL, event_sp);
2317 
2318             if (state == eStateStopped || state == eStateCrashed)
2319             {
2320                 // If we attached and actually have a process on the other end, then
2321                 // this ended up being the equivalent of an attach.
2322                 CompleteAttach ();
2323 
2324                 // This delays passing the stopped event to listeners till
2325                 // CompleteAttach gets a chance to complete...
2326                 HandlePrivateEvent (event_sp);
2327 
2328             }
2329         }
2330 
2331         if (PrivateStateThreadIsValid ())
2332             ResumePrivateStateThread ();
2333         else
2334             StartPrivateStateThread ();
2335     }
2336     return error;
2337 }
2338 
2339 
2340 Error
2341 Process::Resume ()
2342 {
2343     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2344     if (log)
2345         log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s",
2346                     m_stop_id,
2347                     StateAsCString(m_public_state.GetValue()),
2348                     StateAsCString(m_private_state.GetValue()));
2349 
2350     Error error (WillResume());
2351     // Tell the process it is about to resume before the thread list
2352     if (error.Success())
2353     {
2354         // Now let the thread list know we are about to resume so it
2355         // can let all of our threads know that they are about to be
2356         // resumed. Threads will each be called with
2357         // Thread::WillResume(StateType) where StateType contains the state
2358         // that they are supposed to have when the process is resumed
2359         // (suspended/running/stepping). Threads should also check
2360         // their resume signal in lldb::Thread::GetResumeSignal()
2361         // to see if they are suppoed to start back up with a signal.
2362         if (m_thread_list.WillResume())
2363         {
2364             error = DoResume();
2365             if (error.Success())
2366             {
2367                 DidResume();
2368                 m_thread_list.DidResume();
2369                 if (log)
2370                     log->Printf ("Process thinks the process has resumed.");
2371             }
2372         }
2373         else
2374         {
2375             error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume");
2376         }
2377     }
2378     else if (log)
2379         log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>"));
2380     return error;
2381 }
2382 
2383 Error
2384 Process::Halt ()
2385 {
2386     // Pause our private state thread so we can ensure no one else eats
2387     // the stop event out from under us.
2388     Listener halt_listener ("lldb.process.halt_listener");
2389     HijackPrivateProcessEvents(&halt_listener);
2390 
2391     EventSP event_sp;
2392     Error error (WillHalt());
2393 
2394     if (error.Success())
2395     {
2396 
2397         bool caused_stop = false;
2398 
2399         // Ask the process subclass to actually halt our process
2400         error = DoHalt(caused_stop);
2401         if (error.Success())
2402         {
2403             if (m_public_state.GetValue() == eStateAttaching)
2404             {
2405                 SetExitStatus(SIGKILL, "Cancelled async attach.");
2406                 Destroy ();
2407             }
2408             else
2409             {
2410                 // If "caused_stop" is true, then DoHalt stopped the process. If
2411                 // "caused_stop" is false, the process was already stopped.
2412                 // If the DoHalt caused the process to stop, then we want to catch
2413                 // this event and set the interrupted bool to true before we pass
2414                 // this along so clients know that the process was interrupted by
2415                 // a halt command.
2416                 if (caused_stop)
2417                 {
2418                     // Wait for 1 second for the process to stop.
2419                     TimeValue timeout_time;
2420                     timeout_time = TimeValue::Now();
2421                     timeout_time.OffsetWithSeconds(1);
2422                     bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp);
2423                     StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
2424 
2425                     if (!got_event || state == eStateInvalid)
2426                     {
2427                         // We timeout out and didn't get a stop event...
2428                         error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState()));
2429                     }
2430                     else
2431                     {
2432                         if (StateIsStoppedState (state))
2433                         {
2434                             // We caused the process to interrupt itself, so mark this
2435                             // as such in the stop event so clients can tell an interrupted
2436                             // process from a natural stop
2437                             ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
2438                         }
2439                         else
2440                         {
2441                             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2442                             if (log)
2443                                 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
2444                             error.SetErrorString ("Did not get stopped event after halt.");
2445                         }
2446                     }
2447                 }
2448                 DidHalt();
2449             }
2450         }
2451     }
2452     // Resume our private state thread before we post the event (if any)
2453     RestorePrivateProcessEvents();
2454 
2455     // Post any event we might have consumed. If all goes well, we will have
2456     // stopped the process, intercepted the event and set the interrupted
2457     // bool in the event.  Post it to the private event queue and that will end up
2458     // correctly setting the state.
2459     if (event_sp)
2460         m_private_state_broadcaster.BroadcastEvent(event_sp);
2461 
2462     return error;
2463 }
2464 
2465 Error
2466 Process::Detach ()
2467 {
2468     Error error (WillDetach());
2469 
2470     if (error.Success())
2471     {
2472         DisableAllBreakpointSites();
2473         error = DoDetach();
2474         if (error.Success())
2475         {
2476             DidDetach();
2477             StopPrivateStateThread();
2478         }
2479     }
2480     return error;
2481 }
2482 
2483 Error
2484 Process::Destroy ()
2485 {
2486     Error error (WillDestroy());
2487     if (error.Success())
2488     {
2489         DisableAllBreakpointSites();
2490         error = DoDestroy();
2491         if (error.Success())
2492         {
2493             DidDestroy();
2494             StopPrivateStateThread();
2495         }
2496         m_stdio_communication.StopReadThread();
2497         m_stdio_communication.Disconnect();
2498         if (m_process_input_reader && m_process_input_reader->IsActive())
2499             m_target.GetDebugger().PopInputReader (m_process_input_reader);
2500         if (m_process_input_reader)
2501             m_process_input_reader.reset();
2502     }
2503     return error;
2504 }
2505 
2506 Error
2507 Process::Signal (int signal)
2508 {
2509     Error error (WillSignal());
2510     if (error.Success())
2511     {
2512         error = DoSignal(signal);
2513         if (error.Success())
2514             DidSignal();
2515     }
2516     return error;
2517 }
2518 
2519 lldb::ByteOrder
2520 Process::GetByteOrder () const
2521 {
2522     return m_target.GetArchitecture().GetByteOrder();
2523 }
2524 
2525 uint32_t
2526 Process::GetAddressByteSize () const
2527 {
2528     return m_target.GetArchitecture().GetAddressByteSize();
2529 }
2530 
2531 
2532 bool
2533 Process::ShouldBroadcastEvent (Event *event_ptr)
2534 {
2535     const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
2536     bool return_value = true;
2537     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
2538 
2539     switch (state)
2540     {
2541         case eStateConnected:
2542         case eStateAttaching:
2543         case eStateLaunching:
2544         case eStateDetached:
2545         case eStateExited:
2546         case eStateUnloaded:
2547             // These events indicate changes in the state of the debugging session, always report them.
2548             return_value = true;
2549             break;
2550         case eStateInvalid:
2551             // We stopped for no apparent reason, don't report it.
2552             return_value = false;
2553             break;
2554         case eStateRunning:
2555         case eStateStepping:
2556             // If we've started the target running, we handle the cases where we
2557             // are already running and where there is a transition from stopped to
2558             // running differently.
2559             // running -> running: Automatically suppress extra running events
2560             // stopped -> running: Report except when there is one or more no votes
2561             //     and no yes votes.
2562             SynchronouslyNotifyStateChanged (state);
2563             switch (m_public_state.GetValue())
2564             {
2565                 case eStateRunning:
2566                 case eStateStepping:
2567                     // We always suppress multiple runnings with no PUBLIC stop in between.
2568                     return_value = false;
2569                     break;
2570                 default:
2571                     // TODO: make this work correctly. For now always report
2572                     // run if we aren't running so we don't miss any runnning
2573                     // events. If I run the lldb/test/thread/a.out file and
2574                     // break at main.cpp:58, run and hit the breakpoints on
2575                     // multiple threads, then somehow during the stepping over
2576                     // of all breakpoints no run gets reported.
2577                     return_value = true;
2578 
2579                     // This is a transition from stop to run.
2580                     switch (m_thread_list.ShouldReportRun (event_ptr))
2581                     {
2582                         case eVoteYes:
2583                         case eVoteNoOpinion:
2584                             return_value = true;
2585                             break;
2586                         case eVoteNo:
2587                             return_value = false;
2588                             break;
2589                     }
2590                     break;
2591             }
2592             break;
2593         case eStateStopped:
2594         case eStateCrashed:
2595         case eStateSuspended:
2596         {
2597             // We've stopped.  First see if we're going to restart the target.
2598             // If we are going to stop, then we always broadcast the event.
2599             // If we aren't going to stop, let the thread plans decide if we're going to report this event.
2600             // If no thread has an opinion, we don't report it.
2601             if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
2602             {
2603                 if (log)
2604                     log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state));
2605                 return true;
2606             }
2607             else
2608             {
2609                 RefreshStateAfterStop ();
2610 
2611                 if (m_thread_list.ShouldStop (event_ptr) == false)
2612                 {
2613                     switch (m_thread_list.ShouldReportStop (event_ptr))
2614                     {
2615                         case eVoteYes:
2616                             Process::ProcessEventData::SetRestartedInEvent (event_ptr, true);
2617                             // Intentional fall-through here.
2618                         case eVoteNoOpinion:
2619                         case eVoteNo:
2620                             return_value = false;
2621                             break;
2622                     }
2623 
2624                     if (log)
2625                         log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
2626                     Resume ();
2627                 }
2628                 else
2629                 {
2630                     return_value = true;
2631                     SynchronouslyNotifyStateChanged (state);
2632                 }
2633             }
2634         }
2635     }
2636 
2637     if (log)
2638         log->Printf ("Process::ShouldBroadcastEvent (%p) => %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO");
2639     return return_value;
2640 }
2641 
2642 
2643 bool
2644 Process::StartPrivateStateThread ()
2645 {
2646     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
2647 
2648     bool already_running = PrivateStateThreadIsValid ();
2649     if (log)
2650         log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
2651 
2652     if (already_running)
2653         return true;
2654 
2655     // Create a thread that watches our internal state and controls which
2656     // events make it to clients (into the DCProcess event queue).
2657     char thread_name[1024];
2658     snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%i)>", GetID());
2659     m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL);
2660     return IS_VALID_LLDB_HOST_THREAD(m_private_state_thread);
2661 }
2662 
2663 void
2664 Process::PausePrivateStateThread ()
2665 {
2666     ControlPrivateStateThread (eBroadcastInternalStateControlPause);
2667 }
2668 
2669 void
2670 Process::ResumePrivateStateThread ()
2671 {
2672     ControlPrivateStateThread (eBroadcastInternalStateControlResume);
2673 }
2674 
2675 void
2676 Process::StopPrivateStateThread ()
2677 {
2678     if (PrivateStateThreadIsValid ())
2679         ControlPrivateStateThread (eBroadcastInternalStateControlStop);
2680 }
2681 
2682 void
2683 Process::ControlPrivateStateThread (uint32_t signal)
2684 {
2685     LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
2686 
2687     assert (signal == eBroadcastInternalStateControlStop ||
2688             signal == eBroadcastInternalStateControlPause ||
2689             signal == eBroadcastInternalStateControlResume);
2690 
2691     if (log)
2692         log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
2693 
2694     // Signal the private state thread. First we should copy this is case the
2695     // thread starts exiting since the private state thread will NULL this out
2696     // when it exits
2697     const lldb::thread_t private_state_thread = m_private_state_thread;
2698     if (IS_VALID_LLDB_HOST_THREAD(private_state_thread))
2699     {
2700         TimeValue timeout_time;
2701         bool timed_out;
2702 
2703         m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
2704 
2705         timeout_time = TimeValue::Now();
2706         timeout_time.OffsetWithSeconds(2);
2707         m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
2708         m_private_state_control_wait.SetValue (false, eBroadcastNever);
2709 
2710         if (signal == eBroadcastInternalStateControlStop)
2711         {
2712             if (timed_out)
2713                 Host::ThreadCancel (private_state_thread, NULL);
2714 
2715             thread_result_t result = NULL;
2716             Host::ThreadJoin (private_state_thread, &result, NULL);
2717             m_private_state_thread = LLDB_INVALID_HOST_THREAD;
2718         }
2719     }
2720 }
2721 
2722 void
2723 Process::HandlePrivateEvent (EventSP &event_sp)
2724 {
2725     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2726 
2727     const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
2728 
2729     // First check to see if anybody wants a shot at this event:
2730     if (m_next_event_action_ap.get() != NULL)
2731     {
2732         NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
2733         switch (action_result)
2734         {
2735             case NextEventAction::eEventActionSuccess:
2736                 SetNextEventAction(NULL);
2737                 break;
2738             case NextEventAction::eEventActionRetry:
2739                 break;
2740             case NextEventAction::eEventActionExit:
2741                 // Handle Exiting Here.  If we already got an exited event,
2742                 // we should just propagate it.  Otherwise, swallow this event,
2743                 // and set our state to exit so the next event will kill us.
2744                 if (new_state != eStateExited)
2745                 {
2746                     // FIXME: should cons up an exited event, and discard this one.
2747                     SetExitStatus(0, m_next_event_action_ap->GetExitString());
2748                     SetNextEventAction(NULL);
2749                     return;
2750                 }
2751                 SetNextEventAction(NULL);
2752                 break;
2753         }
2754     }
2755 
2756     // See if we should broadcast this state to external clients?
2757     const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
2758 
2759     if (should_broadcast)
2760     {
2761         if (log)
2762         {
2763             log->Printf ("Process::%s (pid = %i) broadcasting new state %s (old state %s) to %s",
2764                          __FUNCTION__,
2765                          GetID(),
2766                          StateAsCString(new_state),
2767                          StateAsCString (GetState ()),
2768                          IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
2769         }
2770         Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
2771         if (StateIsRunningState (new_state))
2772             PushProcessInputReader ();
2773         else
2774             PopProcessInputReader ();
2775 
2776         BroadcastEvent (event_sp);
2777     }
2778     else
2779     {
2780         if (log)
2781         {
2782             log->Printf ("Process::%s (pid = %i) suppressing state %s (old state %s): should_broadcast == false",
2783                          __FUNCTION__,
2784                          GetID(),
2785                          StateAsCString(new_state),
2786                          StateAsCString (GetState ()),
2787                          IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
2788         }
2789     }
2790 }
2791 
2792 void *
2793 Process::PrivateStateThread (void *arg)
2794 {
2795     Process *proc = static_cast<Process*> (arg);
2796     void *result = proc->RunPrivateStateThread ();
2797     return result;
2798 }
2799 
2800 void *
2801 Process::RunPrivateStateThread ()
2802 {
2803     bool control_only = false;
2804     m_private_state_control_wait.SetValue (false, eBroadcastNever);
2805 
2806     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2807     if (log)
2808         log->Printf ("Process::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, this, GetID());
2809 
2810     bool exit_now = false;
2811     while (!exit_now)
2812     {
2813         EventSP event_sp;
2814         WaitForEventsPrivate (NULL, event_sp, control_only);
2815         if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
2816         {
2817             switch (event_sp->GetType())
2818             {
2819             case eBroadcastInternalStateControlStop:
2820                 exit_now = true;
2821                 continue;   // Go to next loop iteration so we exit without
2822                 break;      // doing any internal state managment below
2823 
2824             case eBroadcastInternalStateControlPause:
2825                 control_only = true;
2826                 break;
2827 
2828             case eBroadcastInternalStateControlResume:
2829                 control_only = false;
2830                 break;
2831             }
2832 
2833             if (log)
2834                 log->Printf ("Process::%s (arg = %p, pid = %i) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
2835 
2836             m_private_state_control_wait.SetValue (true, eBroadcastAlways);
2837             continue;
2838         }
2839 
2840 
2841         const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
2842 
2843         if (internal_state != eStateInvalid)
2844         {
2845             HandlePrivateEvent (event_sp);
2846         }
2847 
2848         if (internal_state == eStateInvalid ||
2849             internal_state == eStateExited  ||
2850             internal_state == eStateDetached )
2851         {
2852             if (log)
2853                 log->Printf ("Process::%s (arg = %p, pid = %i) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
2854 
2855             break;
2856         }
2857     }
2858 
2859     // Verify log is still enabled before attempting to write to it...
2860     if (log)
2861         log->Printf ("Process::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, this, GetID());
2862 
2863     m_private_state_control_wait.SetValue (true, eBroadcastAlways);
2864     m_private_state_thread = LLDB_INVALID_HOST_THREAD;
2865     return NULL;
2866 }
2867 
2868 //------------------------------------------------------------------
2869 // Process Event Data
2870 //------------------------------------------------------------------
2871 
2872 Process::ProcessEventData::ProcessEventData () :
2873     EventData (),
2874     m_process_sp (),
2875     m_state (eStateInvalid),
2876     m_restarted (false),
2877     m_update_state (0),
2878     m_interrupted (false)
2879 {
2880 }
2881 
2882 Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
2883     EventData (),
2884     m_process_sp (process_sp),
2885     m_state (state),
2886     m_restarted (false),
2887     m_update_state (0),
2888     m_interrupted (false)
2889 {
2890 }
2891 
2892 Process::ProcessEventData::~ProcessEventData()
2893 {
2894 }
2895 
2896 const ConstString &
2897 Process::ProcessEventData::GetFlavorString ()
2898 {
2899     static ConstString g_flavor ("Process::ProcessEventData");
2900     return g_flavor;
2901 }
2902 
2903 const ConstString &
2904 Process::ProcessEventData::GetFlavor () const
2905 {
2906     return ProcessEventData::GetFlavorString ();
2907 }
2908 
2909 void
2910 Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
2911 {
2912     // This function gets called twice for each event, once when the event gets pulled
2913     // off of the private process event queue, and then any number of times, first when it gets pulled off of
2914     // the public event queue, then other times when we're pretending that this is where we stopped at the
2915     // end of expression evaluation.  m_update_state is used to distinguish these
2916     // three cases; it is 0 when we're just pulling it off for private handling,
2917     // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
2918 
2919     if (m_update_state != 1)
2920         return;
2921 
2922     m_process_sp->SetPublicState (m_state);
2923 
2924     // If we're stopped and haven't restarted, then do the breakpoint commands here:
2925     if (m_state == eStateStopped && ! m_restarted)
2926     {
2927         int num_threads = m_process_sp->GetThreadList().GetSize();
2928         int idx;
2929 
2930         for (idx = 0; idx < num_threads; ++idx)
2931         {
2932             lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx);
2933 
2934             StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
2935             if (stop_info_sp)
2936             {
2937                 stop_info_sp->PerformAction(event_ptr);
2938             }
2939         }
2940 
2941         // The stop action might restart the target.  If it does, then we want to mark that in the
2942         // event so that whoever is receiving it will know to wait for the running event and reflect
2943         // that state appropriately.
2944 
2945         if (m_process_sp->GetPrivateState() == eStateRunning)
2946             SetRestarted(true);
2947         else
2948         {
2949             // Finally, if we didn't restart, run the Stop Hooks here:
2950             // They might also restart the target, so watch for that.
2951             m_process_sp->GetTarget().RunStopHooks();
2952             if (m_process_sp->GetPrivateState() == eStateRunning)
2953                 SetRestarted(true);
2954         }
2955 
2956     }
2957 }
2958 
2959 void
2960 Process::ProcessEventData::Dump (Stream *s) const
2961 {
2962     if (m_process_sp)
2963         s->Printf(" process = %p (pid = %u), ", m_process_sp.get(), m_process_sp->GetID());
2964 
2965     s->Printf("state = %s", StateAsCString(GetState()));
2966 }
2967 
2968 const Process::ProcessEventData *
2969 Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
2970 {
2971     if (event_ptr)
2972     {
2973         const EventData *event_data = event_ptr->GetData();
2974         if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
2975             return static_cast <const ProcessEventData *> (event_ptr->GetData());
2976     }
2977     return NULL;
2978 }
2979 
2980 ProcessSP
2981 Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
2982 {
2983     ProcessSP process_sp;
2984     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
2985     if (data)
2986         process_sp = data->GetProcessSP();
2987     return process_sp;
2988 }
2989 
2990 StateType
2991 Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
2992 {
2993     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
2994     if (data == NULL)
2995         return eStateInvalid;
2996     else
2997         return data->GetState();
2998 }
2999 
3000 bool
3001 Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
3002 {
3003     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3004     if (data == NULL)
3005         return false;
3006     else
3007         return data->GetRestarted();
3008 }
3009 
3010 void
3011 Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
3012 {
3013     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3014     if (data != NULL)
3015         data->SetRestarted(new_value);
3016 }
3017 
3018 bool
3019 Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
3020 {
3021     const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
3022     if (data == NULL)
3023         return false;
3024     else
3025         return data->GetInterrupted ();
3026 }
3027 
3028 void
3029 Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
3030 {
3031     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3032     if (data != NULL)
3033         data->SetInterrupted(new_value);
3034 }
3035 
3036 bool
3037 Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
3038 {
3039     ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
3040     if (data)
3041     {
3042         data->SetUpdateStateOnRemoval();
3043         return true;
3044     }
3045     return false;
3046 }
3047 
3048 void
3049 Process::CalculateExecutionContext (ExecutionContext &exe_ctx)
3050 {
3051     exe_ctx.target = &m_target;
3052     exe_ctx.process = this;
3053     exe_ctx.thread = NULL;
3054     exe_ctx.frame = NULL;
3055 }
3056 
3057 lldb::ProcessSP
3058 Process::GetSP ()
3059 {
3060     return GetTarget().GetProcessSP();
3061 }
3062 
3063 //uint32_t
3064 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
3065 //{
3066 //    return 0;
3067 //}
3068 //
3069 //ArchSpec
3070 //Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
3071 //{
3072 //    return Host::GetArchSpecForExistingProcess (pid);
3073 //}
3074 //
3075 //ArchSpec
3076 //Process::GetArchSpecForExistingProcess (const char *process_name)
3077 //{
3078 //    return Host::GetArchSpecForExistingProcess (process_name);
3079 //}
3080 //
3081 void
3082 Process::AppendSTDOUT (const char * s, size_t len)
3083 {
3084     Mutex::Locker locker (m_stdio_communication_mutex);
3085     m_stdout_data.append (s, len);
3086 
3087     BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
3088 }
3089 
3090 void
3091 Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
3092 {
3093     Process *process = (Process *) baton;
3094     process->AppendSTDOUT (static_cast<const char *>(src), src_len);
3095 }
3096 
3097 size_t
3098 Process::ProcessInputReaderCallback (void *baton,
3099                                      InputReader &reader,
3100                                      lldb::InputReaderAction notification,
3101                                      const char *bytes,
3102                                      size_t bytes_len)
3103 {
3104     Process *process = (Process *) baton;
3105 
3106     switch (notification)
3107     {
3108     case eInputReaderActivate:
3109         break;
3110 
3111     case eInputReaderDeactivate:
3112         break;
3113 
3114     case eInputReaderReactivate:
3115         break;
3116 
3117     case eInputReaderAsynchronousOutputWritten:
3118         break;
3119 
3120     case eInputReaderGotToken:
3121         {
3122             Error error;
3123             process->PutSTDIN (bytes, bytes_len, error);
3124         }
3125         break;
3126 
3127     case eInputReaderInterrupt:
3128         process->Halt ();
3129         break;
3130 
3131     case eInputReaderEndOfFile:
3132         process->AppendSTDOUT ("^D", 2);
3133         break;
3134 
3135     case eInputReaderDone:
3136         break;
3137 
3138     }
3139 
3140     return bytes_len;
3141 }
3142 
3143 void
3144 Process::ResetProcessInputReader ()
3145 {
3146     m_process_input_reader.reset();
3147 }
3148 
3149 void
3150 Process::SetUpProcessInputReader (int file_descriptor)
3151 {
3152     // First set up the Read Thread for reading/handling process I/O
3153 
3154     std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
3155 
3156     if (conn_ap.get())
3157     {
3158         m_stdio_communication.SetConnection (conn_ap.release());
3159         if (m_stdio_communication.IsConnected())
3160         {
3161             m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
3162             m_stdio_communication.StartReadThread();
3163 
3164             // Now read thread is set up, set up input reader.
3165 
3166             if (!m_process_input_reader.get())
3167             {
3168                 m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
3169                 Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
3170                                                                this,
3171                                                                eInputReaderGranularityByte,
3172                                                                NULL,
3173                                                                NULL,
3174                                                                false));
3175 
3176                 if  (err.Fail())
3177                     m_process_input_reader.reset();
3178             }
3179         }
3180     }
3181 }
3182 
3183 void
3184 Process::PushProcessInputReader ()
3185 {
3186     if (m_process_input_reader && !m_process_input_reader->IsActive())
3187         m_target.GetDebugger().PushInputReader (m_process_input_reader);
3188 }
3189 
3190 void
3191 Process::PopProcessInputReader ()
3192 {
3193     if (m_process_input_reader && m_process_input_reader->IsActive())
3194         m_target.GetDebugger().PopInputReader (m_process_input_reader);
3195 }
3196 
3197 // The process needs to know about installed plug-ins
3198 void
3199 Process::SettingsInitialize ()
3200 {
3201     static std::vector<OptionEnumValueElement> g_plugins;
3202 
3203     int i=0;
3204     const char *name;
3205     OptionEnumValueElement option_enum;
3206     while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL)
3207     {
3208         if (name)
3209         {
3210             option_enum.value = i;
3211             option_enum.string_value = name;
3212             option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i);
3213             g_plugins.push_back (option_enum);
3214         }
3215         ++i;
3216     }
3217     option_enum.value = 0;
3218     option_enum.string_value = NULL;
3219     option_enum.usage = NULL;
3220     g_plugins.push_back (option_enum);
3221 
3222     for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i)
3223     {
3224         if (::strcmp (name, "plugin") == 0)
3225         {
3226             SettingsController::instance_settings_table[i].enum_values = &g_plugins[0];
3227             break;
3228         }
3229     }
3230     UserSettingsControllerSP &usc = GetSettingsController();
3231     usc.reset (new SettingsController);
3232     UserSettingsController::InitializeSettingsController (usc,
3233                                                           SettingsController::global_settings_table,
3234                                                           SettingsController::instance_settings_table);
3235 
3236     // Now call SettingsInitialize() for each 'child' of Process settings
3237     Thread::SettingsInitialize ();
3238 }
3239 
3240 void
3241 Process::SettingsTerminate ()
3242 {
3243     // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings.
3244 
3245     Thread::SettingsTerminate ();
3246 
3247     // Now terminate Process Settings.
3248 
3249     UserSettingsControllerSP &usc = GetSettingsController();
3250     UserSettingsController::FinalizeSettingsController (usc);
3251     usc.reset();
3252 }
3253 
3254 UserSettingsControllerSP &
3255 Process::GetSettingsController ()
3256 {
3257     static UserSettingsControllerSP g_settings_controller;
3258     return g_settings_controller;
3259 }
3260 
3261 void
3262 Process::UpdateInstanceName ()
3263 {
3264     ModuleSP module_sp = GetTarget().GetExecutableModule();
3265     if (module_sp)
3266     {
3267         StreamString sstr;
3268         sstr.Printf ("%s", module_sp->GetFileSpec().GetFilename().AsCString());
3269 
3270         GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(),
3271                                                          sstr.GetData());
3272     }
3273 }
3274 
3275 ExecutionResults
3276 Process::RunThreadPlan (ExecutionContext &exe_ctx,
3277                         lldb::ThreadPlanSP &thread_plan_sp,
3278                         bool stop_others,
3279                         bool try_all_threads,
3280                         bool discard_on_error,
3281                         uint32_t single_thread_timeout_usec,
3282                         Stream &errors)
3283 {
3284     ExecutionResults return_value = eExecutionSetupError;
3285 
3286     if (thread_plan_sp.get() == NULL)
3287     {
3288         errors.Printf("RunThreadPlan called with empty thread plan.");
3289         return eExecutionSetupError;
3290     }
3291 
3292     // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
3293     // For that to be true the plan can't be private - since private plans suppress themselves in the
3294     // GetCompletedPlan call.
3295 
3296     bool orig_plan_private = thread_plan_sp->GetPrivate();
3297     thread_plan_sp->SetPrivate(false);
3298 
3299     if (m_private_state.GetValue() != eStateStopped)
3300     {
3301         errors.Printf ("RunThreadPlan called while the private state was not stopped.");
3302         return eExecutionSetupError;
3303     }
3304 
3305     // Save this value for restoration of the execution context after we run
3306     const uint32_t thread_idx_id = exe_ctx.thread->GetIndexID();
3307 
3308     // N.B. Running the target may unset the currently selected thread and frame.  We don't want to do that either,
3309     // so we should arrange to reset them as well.
3310 
3311     lldb::ThreadSP selected_thread_sp = exe_ctx.process->GetThreadList().GetSelectedThread();
3312     lldb::StackFrameSP selected_frame_sp;
3313 
3314     uint32_t selected_tid;
3315     if (selected_thread_sp != NULL)
3316     {
3317         selected_tid = selected_thread_sp->GetIndexID();
3318         selected_frame_sp = selected_thread_sp->GetSelectedFrame();
3319     }
3320     else
3321     {
3322         selected_tid = LLDB_INVALID_THREAD_ID;
3323     }
3324 
3325     exe_ctx.thread->QueueThreadPlan(thread_plan_sp, true);
3326 
3327     Listener listener("lldb.process.listener.run-thread-plan");
3328 
3329     // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
3330     // restored on exit to the function.
3331 
3332     ProcessEventHijacker run_thread_plan_hijacker (*this, &listener);
3333 
3334     lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
3335     if (log)
3336     {
3337         StreamString s;
3338         thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
3339         log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4x to run thread plan \"%s\".",
3340                      exe_ctx.thread->GetIndexID(),
3341                      exe_ctx.thread->GetID(),
3342                      s.GetData());
3343     }
3344 
3345     bool got_event;
3346     lldb::EventSP event_sp;
3347     lldb::StateType stop_state = lldb::eStateInvalid;
3348 
3349     TimeValue* timeout_ptr = NULL;
3350     TimeValue real_timeout;
3351 
3352     bool first_timeout = true;
3353     bool do_resume = true;
3354 
3355     while (1)
3356     {
3357         // We usually want to resume the process if we get to the top of the loop.
3358         // The only exception is if we get two running events with no intervening
3359         // stop, which can happen, we will just wait for then next stop event.
3360 
3361         if (do_resume)
3362         {
3363             // Do the initial resume and wait for the running event before going further.
3364 
3365             Error resume_error = exe_ctx.process->Resume ();
3366             if (!resume_error.Success())
3367             {
3368                 errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString());
3369                 return_value = eExecutionSetupError;
3370                 break;
3371             }
3372 
3373             real_timeout = TimeValue::Now();
3374             real_timeout.OffsetWithMicroSeconds(500000);
3375             timeout_ptr = &real_timeout;
3376 
3377             got_event = listener.WaitForEvent(NULL, event_sp);
3378             if (!got_event)
3379             {
3380                 if (log)
3381                     log->Printf("Didn't get any event after initial resume, exiting.");
3382 
3383                 errors.Printf("Didn't get any event after initial resume, exiting.");
3384                 return_value = eExecutionSetupError;
3385                 break;
3386             }
3387 
3388             stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3389             if (stop_state != eStateRunning)
3390             {
3391                 if (log)
3392                     log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
3393 
3394                 errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state));
3395                 return_value = eExecutionSetupError;
3396                 break;
3397             }
3398 
3399             if (log)
3400                 log->Printf ("Resuming succeeded.");
3401             // We need to call the function synchronously, so spin waiting for it to return.
3402             // If we get interrupted while executing, we're going to lose our context, and
3403             // won't be able to gather the result at this point.
3404             // We set the timeout AFTER the resume, since the resume takes some time and we
3405             // don't want to charge that to the timeout.
3406 
3407             if (single_thread_timeout_usec != 0)
3408             {
3409                 real_timeout = TimeValue::Now();
3410                 if (first_timeout)
3411                     real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec);
3412                 else
3413                     real_timeout.OffsetWithSeconds(10);
3414 
3415                 timeout_ptr = &real_timeout;
3416             }
3417         }
3418         else
3419         {
3420             if (log)
3421                 log->Printf ("Handled an extra running event.");
3422             do_resume = true;
3423         }
3424 
3425         // Now wait for the process to stop again:
3426         stop_state = lldb::eStateInvalid;
3427         event_sp.reset();
3428         got_event = listener.WaitForEvent (timeout_ptr, event_sp);
3429 
3430         if (got_event)
3431         {
3432             if (event_sp.get())
3433             {
3434                 bool keep_going = false;
3435                 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3436                 if (log)
3437                     log->Printf("In while loop, got event: %s.", StateAsCString(stop_state));
3438 
3439                 switch (stop_state)
3440                 {
3441                 case lldb::eStateStopped:
3442                 {
3443                     // Yay, we're done.  Now make sure that our thread plan actually completed.
3444                     ThreadSP thread_sp = exe_ctx.process->GetThreadList().FindThreadByIndexID (thread_idx_id);
3445                     if (!thread_sp)
3446                     {
3447                         // Ooh, our thread has vanished.  Unlikely that this was successful execution...
3448                         if (log)
3449                             log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
3450                         return_value = eExecutionInterrupted;
3451                     }
3452                     else
3453                     {
3454                         StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
3455                         StopReason stop_reason = stop_info_sp->GetStopReason();
3456                         if (stop_reason == eStopReasonPlanComplete)
3457                         {
3458                             if (log)
3459                                 log->Printf ("Execution completed successfully.");
3460                             // Now mark this plan as private so it doesn't get reported as the stop reason
3461                             // after this point.
3462                             if (thread_plan_sp)
3463                                 thread_plan_sp->SetPrivate (orig_plan_private);
3464                             return_value = eExecutionCompleted;
3465                         }
3466                         else
3467                         {
3468                             if (log)
3469                                 log->Printf ("Thread plan didn't successfully complete.");
3470 
3471                             return_value = eExecutionInterrupted;
3472                         }
3473                     }
3474                 }
3475                 break;
3476                 case lldb::eStateCrashed:
3477                     if (log)
3478                         log->Printf ("Execution crashed.");
3479                     return_value = eExecutionInterrupted;
3480                     break;
3481                 case lldb::eStateRunning:
3482                     do_resume = false;
3483                     keep_going = true;
3484                     break;
3485                 default:
3486                     if (log)
3487                         log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state));
3488 
3489                     errors.Printf ("Execution stopped with unexpected state.");
3490                     return_value = eExecutionInterrupted;
3491                     break;
3492                 }
3493                 if (keep_going)
3494                     continue;
3495                 else
3496                     break;
3497             }
3498             else
3499             {
3500                 if (log)
3501                     log->Printf ("got_event was true, but the event pointer was null.  How odd...");
3502                 return_value = eExecutionInterrupted;
3503                 break;
3504             }
3505         }
3506         else
3507         {
3508             // If we didn't get an event that means we've timed out...
3509             // We will interrupt the process here.  Depending on what we were asked to do we will
3510             // either exit, or try with all threads running for the same timeout.
3511             // Not really sure what to do if Halt fails here...
3512 
3513             if (log) {
3514                 if (try_all_threads)
3515                 {
3516                     if (first_timeout)
3517                         log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
3518                                      "trying with all threads enabled.",
3519                                      single_thread_timeout_usec);
3520                     else
3521                         log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
3522                                      "and timeout: %d timed out.",
3523                                      single_thread_timeout_usec);
3524                 }
3525                 else
3526                     log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
3527                                  "halt and abandoning execution.",
3528                                  single_thread_timeout_usec);
3529             }
3530 
3531             Error halt_error = exe_ctx.process->Halt();
3532             if (halt_error.Success())
3533             {
3534                 if (log)
3535                     log->Printf ("Process::RunThreadPlan(): Halt succeeded.");
3536 
3537                 // If halt succeeds, it always produces a stopped event.  Wait for that:
3538 
3539                 real_timeout = TimeValue::Now();
3540                 real_timeout.OffsetWithMicroSeconds(500000);
3541 
3542                 got_event = listener.WaitForEvent(&real_timeout, event_sp);
3543 
3544                 if (got_event)
3545                 {
3546                     stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3547                     if (log)
3548                     {
3549                         log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
3550                         if (stop_state == lldb::eStateStopped
3551                             && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
3552                             log->Printf ("    Event was the Halt interruption event.");
3553                     }
3554 
3555                     if (stop_state == lldb::eStateStopped)
3556                     {
3557                         // Between the time we initiated the Halt and the time we delivered it, the process could have
3558                         // already finished its job.  Check that here:
3559 
3560                         if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get()))
3561                         {
3562                             if (log)
3563                                 log->Printf ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
3564                                              "Exiting wait loop.");
3565                             return_value = eExecutionCompleted;
3566                             break;
3567                         }
3568 
3569                         if (!try_all_threads)
3570                         {
3571                             if (log)
3572                                 log->Printf ("try_all_threads was false, we stopped so now we're quitting.");
3573                             return_value = eExecutionInterrupted;
3574                             break;
3575                         }
3576 
3577                         if (first_timeout)
3578                         {
3579                             // Set all the other threads to run, and return to the top of the loop, which will continue;
3580                             first_timeout = false;
3581                             thread_plan_sp->SetStopOthers (false);
3582                             if (log)
3583                                 log->Printf ("Process::RunThreadPlan(): About to resume.");
3584 
3585                             continue;
3586                         }
3587                         else
3588                         {
3589                             // Running all threads failed, so return Interrupted.
3590                             if (log)
3591                                 log->Printf("Process::RunThreadPlan(): running all threads timed out.");
3592                             return_value = eExecutionInterrupted;
3593                             break;
3594                         }
3595                     }
3596                 }
3597                 else
3598                 {   if (log)
3599                         log->Printf("Process::RunThreadPlan(): halt said it succeeded, but I got no event.  "
3600                                 "I'm getting out of here passing Interrupted.");
3601                     return_value = eExecutionInterrupted;
3602                     break;
3603                 }
3604             }
3605             else
3606             {
3607                 // This branch is to work around some problems with gdb-remote's Halt.  It is a little racy, and can return
3608                 // an error from halt, but if you wait a bit you'll get a stopped event anyway.
3609                 if (log)
3610                     log->Printf ("Process::RunThreadPlan(): halt failed: error = \"%s\", I'm just going to wait a little longer and see if I get a stopped event.",
3611                                  halt_error.AsCString());
3612                 real_timeout = TimeValue::Now();
3613                 real_timeout.OffsetWithMicroSeconds(500000);
3614                 timeout_ptr = &real_timeout;
3615                 got_event = listener.WaitForEvent(&real_timeout, event_sp);
3616                 if (!got_event || event_sp.get() == NULL)
3617                 {
3618                     // This is not going anywhere, bag out.
3619                     if (log)
3620                         log->Printf ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed.");
3621                     return_value = eExecutionInterrupted;
3622                     break;
3623                 }
3624                 else
3625                 {
3626                     stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
3627                     if (log)
3628                         log->Printf ("Process::RunThreadPlan(): halt failed: but then I got a stopped event.  Whatever...");
3629                     if (stop_state == lldb::eStateStopped)
3630                     {
3631                         // Between the time we initiated the Halt and the time we delivered it, the process could have
3632                         // already finished its job.  Check that here:
3633 
3634                         if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get()))
3635                         {
3636                             if (log)
3637                                 log->Printf ("Process::RunThreadPlan(): Even though we timed out, the call plan was done.  "
3638                                              "Exiting wait loop.");
3639                             return_value = eExecutionCompleted;
3640                             break;
3641                         }
3642 
3643                         if (first_timeout)
3644                         {
3645                             // Set all the other threads to run, and return to the top of the loop, which will continue;
3646                             first_timeout = false;
3647                             thread_plan_sp->SetStopOthers (false);
3648                             if (log)
3649                                 log->Printf ("Process::RunThreadPlan(): About to resume.");
3650 
3651                             continue;
3652                         }
3653                         else
3654                         {
3655                             // Running all threads failed, so return Interrupted.
3656                             if (log)
3657                                 log->Printf("Process::RunThreadPlan(): running all threads timed out.");
3658                             return_value = eExecutionInterrupted;
3659                             break;
3660                         }
3661                     }
3662                     else
3663                     {
3664                         log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get"
3665                                      " a stopped event, instead got %s.", StateAsCString(stop_state));
3666                         return_value = eExecutionInterrupted;
3667                         break;
3668                     }
3669                 }
3670             }
3671 
3672         }
3673 
3674     }  // END WAIT LOOP
3675 
3676     // Now do some processing on the results of the run:
3677     if (return_value == eExecutionInterrupted)
3678     {
3679         if (log)
3680         {
3681             StreamString s;
3682             if (event_sp)
3683                 event_sp->Dump (&s);
3684             else
3685             {
3686                 log->Printf ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
3687             }
3688 
3689             StreamString ts;
3690 
3691             const char *event_explanation;
3692 
3693             do
3694             {
3695                 const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
3696 
3697                 if (!event_data)
3698                 {
3699                     event_explanation = "<no event data>";
3700                     break;
3701                 }
3702 
3703                 Process *process = event_data->GetProcessSP().get();
3704 
3705                 if (!process)
3706                 {
3707                     event_explanation = "<no process>";
3708                     break;
3709                 }
3710 
3711                 ThreadList &thread_list = process->GetThreadList();
3712 
3713                 uint32_t num_threads = thread_list.GetSize();
3714                 uint32_t thread_index;
3715 
3716                 ts.Printf("<%u threads> ", num_threads);
3717 
3718                 for (thread_index = 0;
3719                      thread_index < num_threads;
3720                      ++thread_index)
3721                 {
3722                     Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
3723 
3724                     if (!thread)
3725                     {
3726                         ts.Printf("<?> ");
3727                         continue;
3728                     }
3729 
3730                     ts.Printf("<0x%4.4x ", thread->GetID());
3731                     RegisterContext *register_context = thread->GetRegisterContext().get();
3732 
3733                     if (register_context)
3734                         ts.Printf("[ip 0x%llx] ", register_context->GetPC());
3735                     else
3736                         ts.Printf("[ip unknown] ");
3737 
3738                     lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
3739                     if (stop_info_sp)
3740                     {
3741                         const char *stop_desc = stop_info_sp->GetDescription();
3742                         if (stop_desc)
3743                             ts.PutCString (stop_desc);
3744                     }
3745                     ts.Printf(">");
3746                 }
3747 
3748                 event_explanation = ts.GetData();
3749             } while (0);
3750 
3751             if (log)
3752                 log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
3753 
3754             if (discard_on_error && thread_plan_sp)
3755             {
3756                 exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
3757             }
3758         }
3759     }
3760     else if (return_value == eExecutionSetupError)
3761     {
3762         if (log)
3763             log->Printf("Process::RunThreadPlan(): execution set up error.");
3764 
3765         if (discard_on_error && thread_plan_sp)
3766         {
3767             exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
3768         }
3769     }
3770     else
3771     {
3772         if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get()))
3773         {
3774             if (log)
3775                 log->Printf("Process::RunThreadPlan(): thread plan is done");
3776             return_value = eExecutionCompleted;
3777         }
3778         else if (exe_ctx.thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
3779         {
3780             if (log)
3781                 log->Printf("Process::RunThreadPlan(): thread plan was discarded");
3782             return_value = eExecutionDiscarded;
3783         }
3784         else
3785         {
3786             if (log)
3787                 log->Printf("Process::RunThreadPlan(): thread plan stopped in mid course");
3788             if (discard_on_error && thread_plan_sp)
3789             {
3790                 if (log)
3791                     log->Printf("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set.");
3792                 exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
3793             }
3794         }
3795     }
3796 
3797     // Thread we ran the function in may have gone away because we ran the target
3798     // Check that it's still there.
3799     exe_ctx.thread = exe_ctx.process->GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
3800     if (exe_ctx.thread)
3801         exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex(0).get();
3802 
3803     // Also restore the current process'es selected frame & thread, since this function calling may
3804     // be done behind the user's back.
3805 
3806     if (selected_tid != LLDB_INVALID_THREAD_ID)
3807     {
3808         if (exe_ctx.process->GetThreadList().SetSelectedThreadByIndexID (selected_tid))
3809         {
3810             // We were able to restore the selected thread, now restore the frame:
3811             exe_ctx.process->GetThreadList().GetSelectedThread()->SetSelectedFrame(selected_frame_sp.get());
3812         }
3813     }
3814 
3815     return return_value;
3816 }
3817 
3818 const char *
3819 Process::ExecutionResultAsCString (ExecutionResults result)
3820 {
3821     const char *result_name;
3822 
3823     switch (result)
3824     {
3825         case eExecutionCompleted:
3826             result_name = "eExecutionCompleted";
3827             break;
3828         case eExecutionDiscarded:
3829             result_name = "eExecutionDiscarded";
3830             break;
3831         case eExecutionInterrupted:
3832             result_name = "eExecutionInterrupted";
3833             break;
3834         case eExecutionSetupError:
3835             result_name = "eExecutionSetupError";
3836             break;
3837         case eExecutionTimedOut:
3838             result_name = "eExecutionTimedOut";
3839             break;
3840     }
3841     return result_name;
3842 }
3843 
3844 void
3845 Process::GetStatus (Stream &strm)
3846 {
3847     const StateType state = GetState();
3848     if (StateIsStoppedState(state))
3849     {
3850         if (state == eStateExited)
3851         {
3852             int exit_status = GetExitStatus();
3853             const char *exit_description = GetExitDescription();
3854             strm.Printf ("Process %d exited with status = %i (0x%8.8x) %s\n",
3855                           GetID(),
3856                           exit_status,
3857                           exit_status,
3858                           exit_description ? exit_description : "");
3859         }
3860         else
3861         {
3862             if (state == eStateConnected)
3863                 strm.Printf ("Connected to remote target.\n");
3864             else
3865                 strm.Printf ("Process %d %s\n", GetID(), StateAsCString (state));
3866         }
3867     }
3868     else
3869     {
3870         strm.Printf ("Process %d is running.\n", GetID());
3871     }
3872 }
3873 
3874 size_t
3875 Process::GetThreadStatus (Stream &strm,
3876                           bool only_threads_with_stop_reason,
3877                           uint32_t start_frame,
3878                           uint32_t num_frames,
3879                           uint32_t num_frames_with_source)
3880 {
3881     size_t num_thread_infos_dumped = 0;
3882 
3883     const size_t num_threads = GetThreadList().GetSize();
3884     for (uint32_t i = 0; i < num_threads; i++)
3885     {
3886         Thread *thread = GetThreadList().GetThreadAtIndex(i).get();
3887         if (thread)
3888         {
3889             if (only_threads_with_stop_reason)
3890             {
3891                 if (thread->GetStopInfo().get() == NULL)
3892                     continue;
3893             }
3894             thread->GetStatus (strm,
3895                                start_frame,
3896                                num_frames,
3897                                num_frames_with_source);
3898             ++num_thread_infos_dumped;
3899         }
3900     }
3901     return num_thread_infos_dumped;
3902 }
3903 
3904 //--------------------------------------------------------------
3905 // class Process::SettingsController
3906 //--------------------------------------------------------------
3907 
3908 Process::SettingsController::SettingsController () :
3909     UserSettingsController ("process", Target::GetSettingsController())
3910 {
3911     m_default_settings.reset (new ProcessInstanceSettings (*this,
3912                                                            false,
3913                                                            InstanceSettings::GetDefaultName().AsCString()));
3914 }
3915 
3916 Process::SettingsController::~SettingsController ()
3917 {
3918 }
3919 
3920 lldb::InstanceSettingsSP
3921 Process::SettingsController::CreateInstanceSettings (const char *instance_name)
3922 {
3923     ProcessInstanceSettings *new_settings = new ProcessInstanceSettings (*GetSettingsController(),
3924                                                                          false,
3925                                                                          instance_name);
3926     lldb::InstanceSettingsSP new_settings_sp (new_settings);
3927     return new_settings_sp;
3928 }
3929 
3930 //--------------------------------------------------------------
3931 // class ProcessInstanceSettings
3932 //--------------------------------------------------------------
3933 
3934 ProcessInstanceSettings::ProcessInstanceSettings
3935 (
3936     UserSettingsController &owner,
3937     bool live_instance,
3938     const char *name
3939 ) :
3940     InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
3941     m_run_args (),
3942     m_env_vars (),
3943     m_input_path (),
3944     m_output_path (),
3945     m_error_path (),
3946     m_disable_aslr (true),
3947     m_disable_stdio (false),
3948     m_inherit_host_env (true),
3949     m_got_host_env (false)
3950 {
3951     // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
3952     // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers.
3953     // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
3954     // This is true for CreateInstanceName() too.
3955 
3956     if (GetInstanceName () == InstanceSettings::InvalidName())
3957     {
3958         ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
3959         m_owner.RegisterInstanceSettings (this);
3960     }
3961 
3962     if (live_instance)
3963     {
3964         const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
3965         CopyInstanceSettings (pending_settings,false);
3966         //m_owner.RemovePendingSettings (m_instance_name);
3967     }
3968 }
3969 
3970 ProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) :
3971     InstanceSettings (*Process::GetSettingsController(), CreateInstanceName().AsCString()),
3972     m_run_args (rhs.m_run_args),
3973     m_env_vars (rhs.m_env_vars),
3974     m_input_path (rhs.m_input_path),
3975     m_output_path (rhs.m_output_path),
3976     m_error_path (rhs.m_error_path),
3977     m_disable_aslr (rhs.m_disable_aslr),
3978     m_disable_stdio (rhs.m_disable_stdio)
3979 {
3980     if (m_instance_name != InstanceSettings::GetDefaultName())
3981     {
3982         const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
3983         CopyInstanceSettings (pending_settings,false);
3984         m_owner.RemovePendingSettings (m_instance_name);
3985     }
3986 }
3987 
3988 ProcessInstanceSettings::~ProcessInstanceSettings ()
3989 {
3990 }
3991 
3992 ProcessInstanceSettings&
3993 ProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs)
3994 {
3995     if (this != &rhs)
3996     {
3997         m_run_args = rhs.m_run_args;
3998         m_env_vars = rhs.m_env_vars;
3999         m_input_path = rhs.m_input_path;
4000         m_output_path = rhs.m_output_path;
4001         m_error_path = rhs.m_error_path;
4002         m_disable_aslr = rhs.m_disable_aslr;
4003         m_disable_stdio = rhs.m_disable_stdio;
4004         m_inherit_host_env = rhs.m_inherit_host_env;
4005     }
4006 
4007     return *this;
4008 }
4009 
4010 
4011 void
4012 ProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
4013                                                          const char *index_value,
4014                                                          const char *value,
4015                                                          const ConstString &instance_name,
4016                                                          const SettingEntry &entry,
4017                                                          VarSetOperationType op,
4018                                                          Error &err,
4019                                                          bool pending)
4020 {
4021     if (var_name == RunArgsVarName())
4022         UserSettingsController::UpdateStringArrayVariable (op, index_value, m_run_args, value, err);
4023     else if (var_name == EnvVarsVarName())
4024     {
4025         // This is nice for local debugging, but it is isn't correct for
4026         // remote debugging. We need to stop process.env-vars from being
4027         // populated with the host environment and add this as a launch option
4028         // and get the correct environment from the Target's platform.
4029         // GetHostEnvironmentIfNeeded ();
4030         UserSettingsController::UpdateDictionaryVariable (op, index_value, m_env_vars, value, err);
4031     }
4032     else if (var_name == InputPathVarName())
4033         UserSettingsController::UpdateStringVariable (op, m_input_path, value, err);
4034     else if (var_name == OutputPathVarName())
4035         UserSettingsController::UpdateStringVariable (op, m_output_path, value, err);
4036     else if (var_name == ErrorPathVarName())
4037         UserSettingsController::UpdateStringVariable (op, m_error_path, value, err);
4038     else if (var_name == DisableASLRVarName())
4039         UserSettingsController::UpdateBooleanVariable (op, m_disable_aslr, value, true, err);
4040     else if (var_name == DisableSTDIOVarName ())
4041         UserSettingsController::UpdateBooleanVariable (op, m_disable_stdio, value, false, err);
4042 }
4043 
4044 void
4045 ProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
4046                                                bool pending)
4047 {
4048     if (new_settings.get() == NULL)
4049         return;
4050 
4051     ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get();
4052 
4053     m_run_args = new_process_settings->m_run_args;
4054     m_env_vars = new_process_settings->m_env_vars;
4055     m_input_path = new_process_settings->m_input_path;
4056     m_output_path = new_process_settings->m_output_path;
4057     m_error_path = new_process_settings->m_error_path;
4058     m_disable_aslr = new_process_settings->m_disable_aslr;
4059     m_disable_stdio = new_process_settings->m_disable_stdio;
4060 }
4061 
4062 bool
4063 ProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
4064                                                    const ConstString &var_name,
4065                                                    StringList &value,
4066                                                    Error *err)
4067 {
4068     if (var_name == RunArgsVarName())
4069     {
4070         if (m_run_args.GetArgumentCount() > 0)
4071         {
4072             for (int i = 0; i < m_run_args.GetArgumentCount(); ++i)
4073                 value.AppendString (m_run_args.GetArgumentAtIndex (i));
4074         }
4075     }
4076     else if (var_name == EnvVarsVarName())
4077     {
4078         GetHostEnvironmentIfNeeded ();
4079 
4080         if (m_env_vars.size() > 0)
4081         {
4082             std::map<std::string, std::string>::iterator pos;
4083             for (pos = m_env_vars.begin(); pos != m_env_vars.end(); ++pos)
4084             {
4085                 StreamString value_str;
4086                 value_str.Printf ("%s=%s", pos->first.c_str(), pos->second.c_str());
4087                 value.AppendString (value_str.GetData());
4088             }
4089         }
4090     }
4091     else if (var_name == InputPathVarName())
4092     {
4093         value.AppendString (m_input_path.c_str());
4094     }
4095     else if (var_name == OutputPathVarName())
4096     {
4097         value.AppendString (m_output_path.c_str());
4098     }
4099     else if (var_name == ErrorPathVarName())
4100     {
4101         value.AppendString (m_error_path.c_str());
4102     }
4103     else if (var_name == InheritHostEnvVarName())
4104     {
4105         if (m_inherit_host_env)
4106             value.AppendString ("true");
4107         else
4108             value.AppendString ("false");
4109     }
4110     else if (var_name == DisableASLRVarName())
4111     {
4112         if (m_disable_aslr)
4113             value.AppendString ("true");
4114         else
4115             value.AppendString ("false");
4116     }
4117     else if (var_name == DisableSTDIOVarName())
4118     {
4119         if (m_disable_stdio)
4120             value.AppendString ("true");
4121         else
4122             value.AppendString ("false");
4123     }
4124     else
4125     {
4126         if (err)
4127             err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
4128         return false;
4129     }
4130     return true;
4131 }
4132 
4133 const ConstString
4134 ProcessInstanceSettings::CreateInstanceName ()
4135 {
4136     static int instance_count = 1;
4137     StreamString sstr;
4138 
4139     sstr.Printf ("process_%d", instance_count);
4140     ++instance_count;
4141 
4142     const ConstString ret_val (sstr.GetData());
4143     return ret_val;
4144 }
4145 
4146 const ConstString &
4147 ProcessInstanceSettings::RunArgsVarName ()
4148 {
4149     static ConstString run_args_var_name ("run-args");
4150 
4151     return run_args_var_name;
4152 }
4153 
4154 const ConstString &
4155 ProcessInstanceSettings::EnvVarsVarName ()
4156 {
4157     static ConstString env_vars_var_name ("env-vars");
4158 
4159     return env_vars_var_name;
4160 }
4161 
4162 const ConstString &
4163 ProcessInstanceSettings::InheritHostEnvVarName ()
4164 {
4165     static ConstString g_name ("inherit-env");
4166 
4167     return g_name;
4168 }
4169 
4170 const ConstString &
4171 ProcessInstanceSettings::InputPathVarName ()
4172 {
4173   static ConstString input_path_var_name ("input-path");
4174 
4175     return input_path_var_name;
4176 }
4177 
4178 const ConstString &
4179 ProcessInstanceSettings::OutputPathVarName ()
4180 {
4181     static ConstString output_path_var_name ("output-path");
4182 
4183     return output_path_var_name;
4184 }
4185 
4186 const ConstString &
4187 ProcessInstanceSettings::ErrorPathVarName ()
4188 {
4189     static ConstString error_path_var_name ("error-path");
4190 
4191     return error_path_var_name;
4192 }
4193 
4194 const ConstString &
4195 ProcessInstanceSettings::DisableASLRVarName ()
4196 {
4197     static ConstString disable_aslr_var_name ("disable-aslr");
4198 
4199     return disable_aslr_var_name;
4200 }
4201 
4202 const ConstString &
4203 ProcessInstanceSettings::DisableSTDIOVarName ()
4204 {
4205     static ConstString disable_stdio_var_name ("disable-stdio");
4206 
4207     return disable_stdio_var_name;
4208 }
4209 
4210 //--------------------------------------------------
4211 // SettingsController Variable Tables
4212 //--------------------------------------------------
4213 
4214 SettingEntry
4215 Process::SettingsController::global_settings_table[] =
4216 {
4217   //{ "var-name",    var-type  ,        "default", enum-table, init'd, hidden, "help-text"},
4218     {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
4219 };
4220 
4221 
4222 SettingEntry
4223 Process::SettingsController::instance_settings_table[] =
4224 {
4225   //{ "var-name",       var-type,              "default",       enum-table, init'd, hidden, "help-text"},
4226     { "run-args",       eSetVarTypeArray,       NULL,           NULL,       false,  false,  "A list containing all the arguments to be passed to the executable when it is run." },
4227     { "env-vars",       eSetVarTypeDictionary,  NULL,           NULL,       false,  false,  "A list of all the environment variables to be passed to the executable's environment, and their values." },
4228     { "inherit-env",    eSetVarTypeBoolean,     "true",         NULL,       false,  false,  "Inherit the environment from the process that is running LLDB." },
4229     { "input-path",     eSetVarTypeString,      NULL,           NULL,       false,  false,  "The file/path to be used by the executable program for reading its input." },
4230     { "output-path",    eSetVarTypeString,      NULL,           NULL,       false,  false,  "The file/path to be used by the executable program for writing its output." },
4231     { "error-path",     eSetVarTypeString,      NULL,           NULL,       false,  false,  "The file/path to be used by the executable program for writings its error messages." },
4232     { "plugin",         eSetVarTypeEnum,        NULL,           NULL,       false,  false,  "The plugin to be used to run the process." },
4233     { "disable-aslr",   eSetVarTypeBoolean,     "true",         NULL,       false,  false,  "Disable Address Space Layout Randomization (ASLR)" },
4234     { "disable-stdio",  eSetVarTypeBoolean,     "false",        NULL,       false,  false,  "Disable stdin/stdout for process (e.g. for a GUI application)" },
4235     {  NULL,            eSetVarTypeNone,        NULL,           NULL,       false,  false,  NULL }
4236 };
4237 
4238 
4239 
4240