]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/tools/driver/Driver.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / tools / driver / Driver.cpp
1 //===-- Driver.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 "Driver.h"
11
12 #include <getopt.h>
13 #include <libgen.h>
14 #include <sys/ioctl.h>
15 #include <termios.h>
16 #include <unistd.h>
17 #include <string.h>
18 #include <stdlib.h>
19 #include <limits.h>
20 #include <fcntl.h>
21 #include <inttypes.h>
22
23 #include <string>
24
25 #include "IOChannel.h"
26 #include "lldb/API/SBBreakpoint.h"
27 #include "lldb/API/SBCommandInterpreter.h"
28 #include "lldb/API/SBCommandReturnObject.h"
29 #include "lldb/API/SBCommunication.h"
30 #include "lldb/API/SBDebugger.h"
31 #include "lldb/API/SBEvent.h"
32 #include "lldb/API/SBHostOS.h"
33 #include "lldb/API/SBListener.h"
34 #include "lldb/API/SBStream.h"
35 #include "lldb/API/SBTarget.h"
36 #include "lldb/API/SBThread.h"
37 #include "lldb/API/SBProcess.h"
38
39 using namespace lldb;
40
41 static void reset_stdin_termios ();
42 static bool g_old_stdin_termios_is_valid = false;
43 static struct termios g_old_stdin_termios;
44
45 static char *g_debugger_name =  (char *) "";
46 static Driver *g_driver = NULL;
47
48 // In the Driver::MainLoop, we change the terminal settings.  This function is
49 // added as an atexit handler to make sure we clean them up.
50 static void
51 reset_stdin_termios ()
52 {
53     if (g_old_stdin_termios_is_valid)
54     {
55         g_old_stdin_termios_is_valid = false;
56         ::tcsetattr (STDIN_FILENO, TCSANOW, &g_old_stdin_termios);
57     }
58 }
59
60 typedef struct
61 {
62     uint32_t usage_mask;                     // Used to mark options that can be used together.  If (1 << n & usage_mask) != 0
63                                              // then this option belongs to option set n.
64     bool required;                           // This option is required (in the current usage level)
65     const char * long_option;                // Full name for this option.
66     int short_option;                        // Single character for this option.
67     int option_has_arg;                      // no_argument, required_argument or optional_argument
68     uint32_t completion_type;                // Cookie the option class can use to do define the argument completion.
69     lldb::CommandArgumentType argument_type; // Type of argument this option takes
70     const char *  usage_text;                // Full text explaining what this options does and what (if any) argument to
71                                              // pass it.
72 } OptionDefinition;
73
74 #define LLDB_3_TO_5 LLDB_OPT_SET_3|LLDB_OPT_SET_4|LLDB_OPT_SET_5
75 #define LLDB_4_TO_5 LLDB_OPT_SET_4|LLDB_OPT_SET_5
76
77 static OptionDefinition g_options[] =
78 {
79     { LLDB_OPT_SET_1,    true , "help"           , 'h', no_argument      , 0,  eArgTypeNone,
80         "Prints out the usage information for the LLDB debugger." },
81     { LLDB_OPT_SET_2,    true , "version"        , 'v', no_argument      , 0,  eArgTypeNone,
82         "Prints out the current version number of the LLDB debugger." },
83     { LLDB_OPT_SET_3,    true , "arch"           , 'a', required_argument, 0,  eArgTypeArchitecture,
84         "Tells the debugger to use the specified architecture when starting and running the program.  <architecture> must "
85         "be one of the architectures for which the program was compiled." },
86     { LLDB_OPT_SET_3,    true , "file"           , 'f', required_argument, 0,  eArgTypeFilename,
87         "Tells the debugger to use the file <filename> as the program to be debugged." },
88     { LLDB_OPT_SET_3,    false, "core"           , 'c', required_argument, 0,  eArgTypeFilename,
89         "Tells the debugger to use the fullpath to <path> as the core file." },
90     { LLDB_OPT_SET_4,    true , "attach-name"    , 'n', required_argument, 0,  eArgTypeProcessName,
91         "Tells the debugger to attach to a process with the given name." },
92     { LLDB_OPT_SET_4,    true , "wait-for"       , 'w', no_argument      , 0,  eArgTypeNone,
93         "Tells the debugger to wait for a process with the given pid or name to launch before attaching." },
94     { LLDB_OPT_SET_5,    true , "attach-pid"     , 'p', required_argument, 0,  eArgTypePid,
95         "Tells the debugger to attach to a process with the given pid." },
96     { LLDB_3_TO_5,       false, "script-language", 'l', required_argument, 0,  eArgTypeScriptLang,
97         "Tells the debugger to use the specified scripting language for user-defined scripts, rather than the default.  "
98         "Valid scripting languages that can be specified include Python, Perl, Ruby and Tcl.  Currently only the Python "
99         "extensions have been implemented." },
100     { LLDB_3_TO_5,       false, "debug"          , 'd', no_argument      , 0,  eArgTypeNone,
101         "Tells the debugger to print out extra information for debugging itself." },
102     { LLDB_3_TO_5,       false, "source"         , 's', required_argument, 0,  eArgTypeFilename,
103         "Tells the debugger to read in and execute the file <file>, which should contain lldb commands." },
104     { LLDB_3_TO_5,       false, "editor"         , 'e', no_argument      , 0,  eArgTypeNone,
105         "Tells the debugger to open source files using the host's \"external editor\" mechanism." },
106     { LLDB_3_TO_5,       false, "no-lldbinit"    , 'x', no_argument      , 0,  eArgTypeNone,
107         "Do not automatically parse any '.lldbinit' files." },
108     { LLDB_3_TO_5,       false, "no-use-colors"  , 'o', no_argument      , 0,  eArgTypeNone,
109         "Do not use colors." },
110     { LLDB_OPT_SET_6,    true , "python-path"    , 'P', no_argument      , 0,  eArgTypeNone,
111         "Prints out the path to the lldb.py file for this version of lldb." },
112     { 0,                 false, NULL             , 0  , 0                , 0,  eArgTypeNone,         NULL }
113 };
114
115 static const uint32_t last_option_set_with_args = 2;
116
117 Driver::Driver () :
118     SBBroadcaster ("Driver"),
119     m_debugger (SBDebugger::Create(false)),
120     m_editline_pty (),
121     m_editline_slave_fh (NULL),
122     m_editline_reader (),
123     m_io_channel_ap (),
124     m_option_data (),
125     m_executing_user_command (false),
126     m_waiting_for_command (false),
127     m_done(false)
128 {
129     // We want to be able to handle CTRL+D in the terminal to have it terminate
130     // certain input
131     m_debugger.SetCloseInputOnEOF (false);
132     g_debugger_name = (char *) m_debugger.GetInstanceName();
133     if (g_debugger_name == NULL)
134         g_debugger_name = (char *) "";
135     g_driver = this;
136 }
137
138 Driver::~Driver ()
139 {
140     g_driver = NULL;
141     g_debugger_name = NULL;
142 }
143
144 void
145 Driver::CloseIOChannelFile ()
146 {
147     // Write an End of File sequence to the file descriptor to ensure any
148     // read functions can exit.
149     char eof_str[] = "\x04";
150     ::write (m_editline_pty.GetMasterFileDescriptor(), eof_str, strlen(eof_str));
151
152     m_editline_pty.CloseMasterFileDescriptor();
153
154     if (m_editline_slave_fh)
155     {
156         ::fclose (m_editline_slave_fh);
157         m_editline_slave_fh = NULL;
158     }
159 }
160
161 // This function takes INDENT, which tells how many spaces to output at the front
162 // of each line; TEXT, which is the text that is to be output. It outputs the 
163 // text, on multiple lines if necessary, to RESULT, with INDENT spaces at the 
164 // front of each line.  It breaks lines on spaces, tabs or newlines, shortening 
165 // the line if necessary to not break in the middle of a word. It assumes that 
166 // each output line should contain a maximum of OUTPUT_MAX_COLUMNS characters.
167
168 void
169 OutputFormattedUsageText (FILE *out, int indent, const char *text, int output_max_columns)
170 {
171     int len = strlen (text);
172     std::string text_string (text);
173
174     // Force indentation to be reasonable.
175     if (indent >= output_max_columns)
176         indent = 0;
177
178     // Will it all fit on one line?
179
180     if (len + indent < output_max_columns)
181         // Output as a single line
182         fprintf (out, "%*s%s\n", indent, "", text);
183     else
184     {
185         // We need to break it up into multiple lines.
186         int text_width = output_max_columns - indent - 1;
187         int start = 0;
188         int end = start;
189         int final_end = len;
190         int sub_len;
191
192         while (end < final_end)
193         {
194               // Dont start the 'text' on a space, since we're already outputting the indentation.
195               while ((start < final_end) && (text[start] == ' '))
196                   start++;
197
198               end = start + text_width;
199               if (end > final_end)
200                   end = final_end;
201               else
202               {
203                   // If we're not at the end of the text, make sure we break the line on white space.
204                   while (end > start
205                          && text[end] != ' ' && text[end] != '\t' && text[end] != '\n')
206                       end--;
207               }
208               sub_len = end - start;
209               std::string substring = text_string.substr (start, sub_len);
210               fprintf (out, "%*s%s\n", indent, "", substring.c_str());
211               start = end + 1;
212         }
213     }
214 }
215
216 void
217 ShowUsage (FILE *out, OptionDefinition *option_table, Driver::OptionData data)
218 {
219     uint32_t screen_width = 80;
220     uint32_t indent_level = 0;
221     const char *name = "lldb";
222     
223     fprintf (out, "\nUsage:\n\n");
224
225     indent_level += 2;
226
227
228     // First, show each usage level set of options, e.g. <cmd> [options-for-level-0]
229     //                                                   <cmd> [options-for-level-1]
230     //                                                   etc.
231
232     uint32_t num_options;
233     uint32_t num_option_sets = 0;
234     
235     for (num_options = 0; option_table[num_options].long_option != NULL; ++num_options)
236     {
237         uint32_t this_usage_mask = option_table[num_options].usage_mask;
238         if (this_usage_mask == LLDB_OPT_SET_ALL)
239         {
240             if (num_option_sets == 0)
241                 num_option_sets = 1;
242         }
243         else
244         {
245             for (uint32_t j = 0; j < LLDB_MAX_NUM_OPTION_SETS; j++)
246             {
247                 if (this_usage_mask & 1 << j)
248                 {
249                     if (num_option_sets <= j)
250                         num_option_sets = j + 1;
251                 }
252             }
253         }
254     }
255
256     for (uint32_t opt_set = 0; opt_set < num_option_sets; opt_set++)
257     {
258         uint32_t opt_set_mask;
259         
260         opt_set_mask = 1 << opt_set;
261         
262         if (opt_set > 0)
263             fprintf (out, "\n");
264         fprintf (out, "%*s%s", indent_level, "", name);
265         bool is_help_line = false;
266         
267         for (uint32_t i = 0; i < num_options; ++i)
268         {
269             if (option_table[i].usage_mask & opt_set_mask)
270             {
271                 CommandArgumentType arg_type = option_table[i].argument_type;
272                 const char *arg_name = SBCommandInterpreter::GetArgumentTypeAsCString (arg_type);
273                 // This is a bit of a hack, but there's no way to say certain options don't have arguments yet...
274                 // so we do it by hand here.
275                 if (option_table[i].short_option == 'h')
276                     is_help_line = true;
277                     
278                 if (option_table[i].required)
279                 {
280                     if (option_table[i].option_has_arg == required_argument)
281                         fprintf (out, " -%c <%s>", option_table[i].short_option, arg_name);
282                     else if (option_table[i].option_has_arg == optional_argument)
283                         fprintf (out, " -%c [<%s>]", option_table[i].short_option, arg_name);
284                     else
285                         fprintf (out, " -%c", option_table[i].short_option);
286                 }
287                 else
288                 {
289                     if (option_table[i].option_has_arg == required_argument)
290                         fprintf (out, " [-%c <%s>]", option_table[i].short_option, arg_name);
291                     else if (option_table[i].option_has_arg == optional_argument)
292                         fprintf (out, " [-%c [<%s>]]", option_table[i].short_option, arg_name);
293                     else
294                         fprintf (out, " [-%c]", option_table[i].short_option);
295                 }
296             }
297         }
298         if (!is_help_line && (opt_set <= last_option_set_with_args))
299             fprintf (out, " [[--] <PROGRAM-ARG-1> [<PROGRAM_ARG-2> ...]]");
300     }
301
302     fprintf (out, "\n\n");
303
304     // Now print out all the detailed information about the various options:  long form, short form and help text:
305     //   -- long_name <argument>
306     //   - short <argument>
307     //   help text
308
309     // This variable is used to keep track of which options' info we've printed out, because some options can be in
310     // more than one usage level, but we only want to print the long form of its information once.
311
312     Driver::OptionData::OptionSet options_seen;
313     Driver::OptionData::OptionSet::iterator pos;
314
315     indent_level += 5;
316
317     for (uint32_t i = 0; i < num_options; ++i)
318     {
319         // Only print this option if we haven't already seen it.
320         pos = options_seen.find (option_table[i].short_option);
321         if (pos == options_seen.end())
322         {
323             CommandArgumentType arg_type = option_table[i].argument_type;
324             const char *arg_name = SBCommandInterpreter::GetArgumentTypeAsCString (arg_type);
325
326             options_seen.insert (option_table[i].short_option);
327             fprintf (out, "%*s-%c ", indent_level, "", option_table[i].short_option);
328             if (arg_type != eArgTypeNone)
329                 fprintf (out, "<%s>", arg_name);
330             fprintf (out, "\n");
331             fprintf (out, "%*s--%s ", indent_level, "", option_table[i].long_option);
332             if (arg_type != eArgTypeNone)
333                 fprintf (out, "<%s>", arg_name);
334             fprintf (out, "\n");
335             indent_level += 5;
336             OutputFormattedUsageText (out, indent_level, option_table[i].usage_text, screen_width);
337             indent_level -= 5;
338             fprintf (out, "\n");
339         }
340     }
341
342     indent_level -= 5;
343
344     fprintf (out, "\n%*s(If you don't provide -f then the first argument will be the file to be debugged"
345                   "\n%*s so '%s -- <filename> [<ARG1> [<ARG2>]]' also works."
346                   "\n%*s Remember to end the options with \"--\" if any of your arguments have a \"-\" in them.)\n\n",
347              indent_level, "", 
348              indent_level, "",
349              name, 
350              indent_level, "");
351 }
352
353 void
354 BuildGetOptTable (OptionDefinition *expanded_option_table, std::vector<struct option> &getopt_table, 
355                   uint32_t num_options)
356 {
357     if (num_options == 0)
358         return;
359
360     uint32_t i;
361     uint32_t j;
362     std::bitset<256> option_seen;
363
364     getopt_table.resize (num_options + 1);
365
366     for (i = 0, j = 0; i < num_options; ++i)
367     {
368         char short_opt = expanded_option_table[i].short_option;
369         
370         if (option_seen.test(short_opt) == false)
371         {
372             getopt_table[j].name    = expanded_option_table[i].long_option;
373             getopt_table[j].has_arg = expanded_option_table[i].option_has_arg;
374             getopt_table[j].flag    = NULL;
375             getopt_table[j].val     = expanded_option_table[i].short_option;
376             option_seen.set(short_opt);
377             ++j;
378         }
379     }
380
381     getopt_table[j].name    = NULL;
382     getopt_table[j].has_arg = 0;
383     getopt_table[j].flag    = NULL;
384     getopt_table[j].val     = 0;
385
386 }
387
388 Driver::OptionData::OptionData () :
389     m_args(),
390     m_script_lang (lldb::eScriptLanguageDefault),
391     m_core_file (),
392     m_crash_log (),
393     m_source_command_files (),
394     m_debug_mode (false),
395     m_print_version (false),
396     m_print_python_path (false),
397     m_print_help (false),
398     m_wait_for(false),
399     m_process_name(),
400     m_process_pid(LLDB_INVALID_PROCESS_ID),
401     m_use_external_editor(false),
402     m_seen_options()
403 {
404 }
405
406 Driver::OptionData::~OptionData ()
407 {
408 }
409
410 void
411 Driver::OptionData::Clear ()
412 {
413     m_args.clear ();
414     m_script_lang = lldb::eScriptLanguageDefault;
415     m_source_command_files.clear ();
416     m_debug_mode = false;
417     m_print_help = false;
418     m_print_version = false;
419     m_print_python_path = false;
420     m_use_external_editor = false;
421     m_wait_for = false;
422     m_process_name.erase();
423     m_process_pid = LLDB_INVALID_PROCESS_ID;
424 }
425
426 void
427 Driver::ResetOptionValues ()
428 {
429     m_option_data.Clear ();
430 }
431
432 const char *
433 Driver::GetFilename() const
434 {
435     if (m_option_data.m_args.empty())
436         return NULL;
437     return m_option_data.m_args.front().c_str();
438 }
439
440 const char *
441 Driver::GetCrashLogFilename() const
442 {
443     if (m_option_data.m_crash_log.empty())
444         return NULL;
445     return m_option_data.m_crash_log.c_str();
446 }
447
448 lldb::ScriptLanguage
449 Driver::GetScriptLanguage() const
450 {
451     return m_option_data.m_script_lang;
452 }
453
454 size_t
455 Driver::GetNumSourceCommandFiles () const
456 {
457     return m_option_data.m_source_command_files.size();
458 }
459
460 const char *
461 Driver::GetSourceCommandFileAtIndex (uint32_t idx) const
462 {
463     if (idx < m_option_data.m_source_command_files.size())
464         return m_option_data.m_source_command_files[idx].c_str();
465     return NULL;
466 }
467
468 bool
469 Driver::GetDebugMode() const
470 {
471     return m_option_data.m_debug_mode;
472 }
473
474
475 // Check the arguments that were passed to this program to make sure they are valid and to get their
476 // argument values (if any).  Return a boolean value indicating whether or not to start up the full
477 // debugger (i.e. the Command Interpreter) or not.  Return FALSE if the arguments were invalid OR
478 // if the user only wanted help or version information.
479
480 SBError
481 Driver::ParseArgs (int argc, const char *argv[], FILE *out_fh, bool &exit)
482 {
483     ResetOptionValues ();
484
485     SBCommandReturnObject result;
486
487     SBError error;
488     std::string option_string;
489     struct option *long_options = NULL;
490     std::vector<struct option> long_options_vector;
491     uint32_t num_options;
492
493     for (num_options = 0; g_options[num_options].long_option != NULL; ++num_options)
494         /* Do Nothing. */;
495
496     if (num_options == 0)
497     {
498         if (argc > 1)
499             error.SetErrorStringWithFormat ("invalid number of options");
500         return error;
501     }
502
503     BuildGetOptTable (g_options, long_options_vector, num_options);
504
505     if (long_options_vector.empty())
506         long_options = NULL;
507     else
508         long_options = &long_options_vector.front();
509
510     if (long_options == NULL)
511     {
512         error.SetErrorStringWithFormat ("invalid long options");
513         return error;
514     }
515
516     // Build the option_string argument for call to getopt_long_only.
517
518     for (int i = 0; long_options[i].name != NULL; ++i)
519     {
520         if (long_options[i].flag == NULL)
521         {
522             option_string.push_back ((char) long_options[i].val);
523             switch (long_options[i].has_arg)
524             {
525                 default:
526                 case no_argument:
527                     break;
528                 case required_argument:
529                     option_string.push_back (':');
530                     break;
531                 case optional_argument:
532                     option_string.append ("::");
533                     break;
534             }
535         }
536     }
537
538     // This is kind of a pain, but since we make the debugger in the Driver's constructor, we can't
539     // know at that point whether we should read in init files yet.  So we don't read them in in the
540     // Driver constructor, then set the flags back to "read them in" here, and then if we see the
541     // "-n" flag, we'll turn it off again.  Finally we have to read them in by hand later in the
542     // main loop.
543     
544     m_debugger.SkipLLDBInitFiles (false);
545     m_debugger.SkipAppInitFiles (false);
546
547     // Prepare for & make calls to getopt_long_only.
548 #if __GLIBC__
549     optind = 0;
550 #else
551     optreset = 1;
552     optind = 1;
553 #endif
554     int val;
555     while (1)
556     {
557         int long_options_index = -1;
558         val = ::getopt_long_only (argc, const_cast<char **>(argv), option_string.c_str(), long_options, &long_options_index);
559
560         if (val == -1)
561             break;
562         else if (val == '?')
563         {
564             m_option_data.m_print_help = true;
565             error.SetErrorStringWithFormat ("unknown or ambiguous option");
566             break;
567         }
568         else if (val == 0)
569             continue;
570         else
571         {
572             m_option_data.m_seen_options.insert ((char) val);
573             if (long_options_index == -1)
574             {
575                 for (int i = 0;
576                      long_options[i].name || long_options[i].has_arg || long_options[i].flag || long_options[i].val;
577                      ++i)
578                 {
579                     if (long_options[i].val == val)
580                     {
581                         long_options_index = i;
582                         break;
583                     }
584                 }
585             }
586
587             if (long_options_index >= 0)
588             {
589                 const int short_option = g_options[long_options_index].short_option;
590
591                 switch (short_option)
592                 {
593                     case 'h':
594                         m_option_data.m_print_help = true;
595                         break;
596
597                     case 'v':
598                         m_option_data.m_print_version = true;
599                         break;
600
601                     case 'P':
602                         m_option_data.m_print_python_path = true;
603                         break;
604
605                     case 'c':
606                         {
607                             SBFileSpec file(optarg);
608                             if (file.Exists())
609                             {
610                                 m_option_data.m_core_file = optarg;
611                             }
612                             else
613                                 error.SetErrorStringWithFormat("file specified in --core (-c) option doesn't exist: '%s'", optarg);
614                         }
615                         break;
616                     
617                     case 'e':
618                         m_option_data.m_use_external_editor = true;
619                         break;
620
621                     case 'x':
622                         m_debugger.SkipLLDBInitFiles (true);
623                         m_debugger.SkipAppInitFiles (true);
624                         break;
625
626                     case 'o':
627                         m_debugger.SetUseColor (false);
628                         break;
629
630                     case 'f':
631                         {
632                             SBFileSpec file(optarg);
633                             if (file.Exists())
634                             {
635                                 m_option_data.m_args.push_back (optarg);
636                             }
637                             else if (file.ResolveExecutableLocation())
638                             {
639                                 char path[PATH_MAX];
640                                 file.GetPath (path, sizeof(path));
641                                 m_option_data.m_args.push_back (path);
642                             }
643                             else
644                                 error.SetErrorStringWithFormat("file specified in --file (-f) option doesn't exist: '%s'", optarg);
645                         }
646                         break;
647
648                     case 'a':
649                         if (!m_debugger.SetDefaultArchitecture (optarg))
650                             error.SetErrorStringWithFormat("invalid architecture in the -a or --arch option: '%s'", optarg);
651                         break;
652
653                     case 'l':
654                         m_option_data.m_script_lang = m_debugger.GetScriptingLanguage (optarg);
655                         break;
656
657                     case 'd':
658                         m_option_data.m_debug_mode = true;
659                         break;
660
661                     case 'n':
662                         m_option_data.m_process_name = optarg;
663                         break;
664                     
665                     case 'w':
666                         m_option_data.m_wait_for = true;
667                         break;
668                         
669                     case 'p':
670                         {
671                             char *remainder;
672                             m_option_data.m_process_pid = strtol (optarg, &remainder, 0);
673                             if (remainder == optarg || *remainder != '\0')
674                                 error.SetErrorStringWithFormat ("Could not convert process PID: \"%s\" into a pid.",
675                                                                 optarg);
676                         }
677                         break;
678                     case 's':
679                         {
680                             SBFileSpec file(optarg);
681                             if (file.Exists())
682                                 m_option_data.m_source_command_files.push_back (optarg);
683                             else if (file.ResolveExecutableLocation())
684                             {
685                                 char final_path[PATH_MAX];
686                                 file.GetPath (final_path, sizeof(final_path));
687                                 std::string path_str (final_path);
688                                 m_option_data.m_source_command_files.push_back (path_str);
689                             }
690                             else
691                                 error.SetErrorStringWithFormat("file specified in --source (-s) option doesn't exist: '%s'", optarg);
692                         }
693                         break;
694
695                     default:
696                         m_option_data.m_print_help = true;
697                         error.SetErrorStringWithFormat ("unrecognized option %c", short_option);
698                         break;
699                 }
700             }
701             else
702             {
703                 error.SetErrorStringWithFormat ("invalid option with value %i", val);
704             }
705             if (error.Fail())
706             {
707                 return error;
708             }
709         }
710     }
711     
712     if (error.Fail() || m_option_data.m_print_help)
713     {
714         ShowUsage (out_fh, g_options, m_option_data);
715         exit = true;
716     }
717     else if (m_option_data.m_print_version)
718     {
719         ::fprintf (out_fh, "%s\n", m_debugger.GetVersionString());
720         exit = true;
721     }
722     else if (m_option_data.m_print_python_path)
723     {
724         SBFileSpec python_file_spec = SBHostOS::GetLLDBPythonPath();
725         if (python_file_spec.IsValid())
726         {
727             char python_path[PATH_MAX];
728             size_t num_chars = python_file_spec.GetPath(python_path, PATH_MAX);
729             if (num_chars < PATH_MAX)
730             {
731                 ::fprintf (out_fh, "%s\n", python_path);
732             }
733             else
734                 ::fprintf (out_fh, "<PATH TOO LONG>\n");
735         }
736         else
737             ::fprintf (out_fh, "<COULD NOT FIND PATH>\n");
738         exit = true;
739     }
740     else if (m_option_data.m_process_name.empty() && m_option_data.m_process_pid == LLDB_INVALID_PROCESS_ID)
741     {
742         // Any arguments that are left over after option parsing are for
743         // the program. If a file was specified with -f then the filename
744         // is already in the m_option_data.m_args array, and any remaining args
745         // are arguments for the inferior program. If no file was specified with
746         // -f, then what is left is the program name followed by any arguments.
747
748         // Skip any options we consumed with getopt_long_only
749         argc -= optind;
750         argv += optind;
751
752         if (argc > 0)
753         {
754             for (int arg_idx=0; arg_idx<argc; ++arg_idx)
755             {
756                 const char *arg = argv[arg_idx];
757                 if (arg)
758                     m_option_data.m_args.push_back (arg);
759             }
760         }
761         
762     }
763     else
764     {
765         // Skip any options we consumed with getopt_long_only
766         argc -= optind;
767         //argv += optind; // Commented out to keep static analyzer happy
768
769         if (argc > 0)
770             ::fprintf (out_fh, "Warning: program arguments are ignored when attaching.\n");
771     }
772
773     return error;
774 }
775
776 size_t
777 Driver::GetProcessSTDOUT ()
778 {
779     //  The process has stuff waiting for stdout; get it and write it out to the appropriate place.
780     char stdio_buffer[1024];
781     size_t len;
782     size_t total_bytes = 0;
783     while ((len = m_debugger.GetSelectedTarget().GetProcess().GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
784     {
785         m_io_channel_ap->OutWrite (stdio_buffer, len, NO_ASYNC);
786         total_bytes += len;
787     }
788     return total_bytes;
789 }
790
791 size_t
792 Driver::GetProcessSTDERR ()
793 {
794     //  The process has stuff waiting for stderr; get it and write it out to the appropriate place.
795     char stdio_buffer[1024];
796     size_t len;
797     size_t total_bytes = 0;
798     while ((len = m_debugger.GetSelectedTarget().GetProcess().GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
799     {
800         m_io_channel_ap->ErrWrite (stdio_buffer, len, NO_ASYNC);
801         total_bytes += len;
802     }
803     return total_bytes;
804 }
805
806 void
807 Driver::UpdateSelectedThread ()
808 {
809     using namespace lldb;
810     SBProcess process(m_debugger.GetSelectedTarget().GetProcess());
811     if (process.IsValid())
812     {
813         SBThread curr_thread (process.GetSelectedThread());
814         SBThread thread;
815         StopReason curr_thread_stop_reason = eStopReasonInvalid;
816         curr_thread_stop_reason = curr_thread.GetStopReason();
817
818         if (!curr_thread.IsValid() ||
819             curr_thread_stop_reason == eStopReasonInvalid ||
820             curr_thread_stop_reason == eStopReasonNone)
821         {
822             // Prefer a thread that has just completed its plan over another thread as current thread.
823             SBThread plan_thread;
824             SBThread other_thread;
825             const size_t num_threads = process.GetNumThreads();
826             size_t i;
827             for (i = 0; i < num_threads; ++i)
828             {
829                 thread = process.GetThreadAtIndex(i);
830                 StopReason thread_stop_reason = thread.GetStopReason();
831                 switch (thread_stop_reason)
832                 {
833                 case eStopReasonInvalid:
834                 case eStopReasonNone:
835                     break;
836
837                 case eStopReasonTrace:
838                 case eStopReasonBreakpoint:
839                 case eStopReasonWatchpoint:
840                 case eStopReasonSignal:
841                 case eStopReasonException:
842                 case eStopReasonExec:
843                 case eStopReasonThreadExiting:
844                     if (!other_thread.IsValid())
845                         other_thread = thread;
846                     break;
847                 case eStopReasonPlanComplete:
848                     if (!plan_thread.IsValid())
849                         plan_thread = thread;
850                     break;
851                 }
852             }
853             if (plan_thread.IsValid())
854                 process.SetSelectedThread (plan_thread);
855             else if (other_thread.IsValid())
856                 process.SetSelectedThread (other_thread);
857             else
858             {
859                 if (curr_thread.IsValid())
860                     thread = curr_thread;
861                 else
862                     thread = process.GetThreadAtIndex(0);
863
864                 if (thread.IsValid())
865                     process.SetSelectedThread (thread);
866             }
867         }
868     }
869 }
870
871 // This function handles events that were broadcast by the process.
872 void
873 Driver::HandleBreakpointEvent (const SBEvent &event)
874 {
875     using namespace lldb;
876     const uint32_t event_type = SBBreakpoint::GetBreakpointEventTypeFromEvent (event);
877     
878     if (event_type & eBreakpointEventTypeAdded
879         || event_type & eBreakpointEventTypeRemoved
880         || event_type & eBreakpointEventTypeEnabled
881         || event_type & eBreakpointEventTypeDisabled
882         || event_type & eBreakpointEventTypeCommandChanged
883         || event_type & eBreakpointEventTypeConditionChanged
884         || event_type & eBreakpointEventTypeIgnoreChanged
885         || event_type & eBreakpointEventTypeLocationsResolved)
886     {
887         // Don't do anything about these events, since the breakpoint commands already echo these actions.
888     }              
889     else if (event_type & eBreakpointEventTypeLocationsAdded)
890     {
891         char message[256];
892         uint32_t num_new_locations = SBBreakpoint::GetNumBreakpointLocationsFromEvent(event);
893         if (num_new_locations > 0)
894         {
895             SBBreakpoint breakpoint = SBBreakpoint::GetBreakpointFromEvent(event);
896             int message_len = ::snprintf (message, sizeof(message), "%d location%s added to breakpoint %d\n", 
897                                           num_new_locations,
898                                           num_new_locations == 1 ? "" : "s",
899                                           breakpoint.GetID());
900             m_io_channel_ap->OutWrite(message, message_len, ASYNC);
901         }
902     }
903     else if (event_type & eBreakpointEventTypeLocationsRemoved)
904     {
905        // These locations just get disabled, not sure it is worth spamming folks about this on the command line.
906     }
907     else if (event_type & eBreakpointEventTypeLocationsResolved)
908     {
909        // This might be an interesting thing to note, but I'm going to leave it quiet for now, it just looked noisy.
910     }
911 }
912
913 // This function handles events that were broadcast by the process.
914 void
915 Driver::HandleProcessEvent (const SBEvent &event)
916 {
917     using namespace lldb;
918     const uint32_t event_type = event.GetType();
919
920     if (event_type & SBProcess::eBroadcastBitSTDOUT)
921     {
922         // The process has stdout available, get it and write it out to the
923         // appropriate place.
924         GetProcessSTDOUT ();
925     }
926     else if (event_type & SBProcess::eBroadcastBitSTDERR)
927     {
928         // The process has stderr available, get it and write it out to the
929         // appropriate place.
930         GetProcessSTDERR ();
931     }
932     else if (event_type & SBProcess::eBroadcastBitStateChanged)
933     {
934         // Drain all stout and stderr so we don't see any output come after
935         // we print our prompts
936         GetProcessSTDOUT ();
937         GetProcessSTDERR ();
938         // Something changed in the process;  get the event and report the process's current status and location to
939         // the user.
940         StateType event_state = SBProcess::GetStateFromEvent (event);
941         if (event_state == eStateInvalid)
942             return;
943
944         SBProcess process (SBProcess::GetProcessFromEvent (event));
945         assert (process.IsValid());
946
947         switch (event_state)
948         {
949         case eStateInvalid:
950         case eStateUnloaded:
951         case eStateConnected:
952         case eStateAttaching:
953         case eStateLaunching:
954         case eStateStepping:
955         case eStateDetached:
956             {
957                 char message[1024];
958                 int message_len = ::snprintf (message, sizeof(message), "Process %" PRIu64 " %s\n", process.GetProcessID(),
959                                               m_debugger.StateAsCString (event_state));
960                 m_io_channel_ap->OutWrite(message, message_len, ASYNC);
961             }
962             break;
963
964         case eStateRunning:
965             // Don't be chatty when we run...
966             break;
967
968         case eStateExited:
969             {
970                 SBCommandReturnObject result;
971                 m_debugger.GetCommandInterpreter().HandleCommand("process status", result, false);
972                 m_io_channel_ap->ErrWrite (result.GetError(), result.GetErrorSize(), ASYNC);
973                 m_io_channel_ap->OutWrite (result.GetOutput(), result.GetOutputSize(), ASYNC);
974             }
975             break;
976
977         case eStateStopped:
978         case eStateCrashed:
979         case eStateSuspended:
980             // Make sure the program hasn't been auto-restarted:
981             if (SBProcess::GetRestartedFromEvent (event))
982             {
983                 size_t num_reasons = SBProcess::GetNumRestartedReasonsFromEvent(event);
984                 if (num_reasons > 0)
985                 {
986                 // FIXME: Do we want to report this, or would that just be annoyingly chatty?
987                     if (num_reasons == 1)
988                     {
989                         char message[1024];
990                         const char *reason = SBProcess::GetRestartedReasonAtIndexFromEvent (event, 0);
991                         int message_len = ::snprintf (message, sizeof(message), "Process %" PRIu64 " stopped and restarted: %s\n",
992                                               process.GetProcessID(), reason ? reason : "<UNKNOWN REASON>");
993                         m_io_channel_ap->OutWrite(message, message_len, ASYNC);
994                     }
995                     else
996                     {
997                         char message[1024];
998                         int message_len = ::snprintf (message, sizeof(message), "Process %" PRIu64 " stopped and restarted, reasons:\n",
999                                               process.GetProcessID());
1000                         m_io_channel_ap->OutWrite(message, message_len, ASYNC);
1001                         for (size_t i = 0; i < num_reasons; i++)
1002                         {
1003                             const char *reason = SBProcess::GetRestartedReasonAtIndexFromEvent (event, i);
1004                             int message_len = ::snprintf(message, sizeof(message), "\t%s\n", reason ? reason : "<UNKNOWN REASON>");
1005                             m_io_channel_ap->OutWrite(message, message_len, ASYNC);
1006                         }
1007                     }
1008                 }
1009             }
1010             else
1011             {
1012                 if (GetDebugger().GetSelectedTarget() == process.GetTarget())
1013                 {
1014                     SBCommandReturnObject result;
1015                     UpdateSelectedThread ();
1016                     m_debugger.GetCommandInterpreter().HandleCommand("process status", result, false);
1017                     m_io_channel_ap->ErrWrite (result.GetError(), result.GetErrorSize(), ASYNC);
1018                     m_io_channel_ap->OutWrite (result.GetOutput(), result.GetOutputSize(), ASYNC);
1019                 }
1020                 else
1021                 {
1022                     SBStream out_stream;
1023                     uint32_t target_idx = GetDebugger().GetIndexOfTarget(process.GetTarget());
1024                     if (target_idx != UINT32_MAX)
1025                         out_stream.Printf ("Target %d: (", target_idx);
1026                     else
1027                         out_stream.Printf ("Target <unknown index>: (");
1028                     process.GetTarget().GetDescription (out_stream, eDescriptionLevelBrief);
1029                     out_stream.Printf (") stopped.\n");
1030                     m_io_channel_ap->OutWrite (out_stream.GetData(), out_stream.GetSize(), ASYNC);
1031                 }
1032             }
1033             break;
1034         }
1035     }
1036 }
1037
1038 void
1039 Driver::HandleThreadEvent (const SBEvent &event)
1040 {
1041     // At present the only thread event we handle is the Frame Changed event, and all we do for that is just
1042     // reprint the thread status for that thread.
1043     using namespace lldb;
1044     const uint32_t event_type = event.GetType();
1045     if (event_type == SBThread::eBroadcastBitStackChanged
1046         || event_type == SBThread::eBroadcastBitThreadSelected)
1047     {
1048         SBThread thread = SBThread::GetThreadFromEvent (event);
1049         if (thread.IsValid())
1050         {
1051             SBStream out_stream;
1052             thread.GetStatus(out_stream);
1053             m_io_channel_ap->OutWrite (out_stream.GetData (), out_stream.GetSize (), ASYNC);
1054         }
1055     }
1056 }
1057
1058 //  This function handles events broadcast by the IOChannel (HasInput, UserInterrupt, or ThreadShouldExit).
1059
1060 bool
1061 Driver::HandleIOEvent (const SBEvent &event)
1062 {
1063     bool quit = false;
1064
1065     const uint32_t event_type = event.GetType();
1066
1067     if (event_type & IOChannel::eBroadcastBitHasUserInput)
1068     {
1069         // We got some input (i.e. a command string) from the user; pass it off to the command interpreter for
1070         // handling.
1071
1072         const char *command_string = SBEvent::GetCStringFromEvent(event);
1073         if (command_string == NULL)
1074             command_string = "";
1075         SBCommandReturnObject result;
1076         
1077         // We don't want the result to bypass the OutWrite function in IOChannel, as this can result in odd
1078         // output orderings and problems with the prompt.
1079         
1080         // Note that we are in the process of executing a command
1081         m_executing_user_command = true;
1082
1083         m_debugger.GetCommandInterpreter().HandleCommand (command_string, result, true);
1084
1085         // Note that we are back from executing a user command
1086         m_executing_user_command = false;
1087
1088         // Display any STDOUT/STDERR _prior_ to emitting the command result text
1089         GetProcessSTDOUT ();
1090         GetProcessSTDERR ();
1091
1092         const bool only_if_no_immediate = true;
1093
1094         // Now emit the command output text from the command we just executed
1095         const size_t output_size = result.GetOutputSize();
1096         if (output_size > 0)
1097             m_io_channel_ap->OutWrite (result.GetOutput(only_if_no_immediate), output_size, NO_ASYNC);
1098
1099         // Now emit the command error text from the command we just executed
1100         const size_t error_size = result.GetErrorSize();
1101         if (error_size > 0)
1102             m_io_channel_ap->OutWrite (result.GetError(only_if_no_immediate), error_size, NO_ASYNC);
1103
1104         // We are done getting and running our command, we can now clear the
1105         // m_waiting_for_command so we can get another one.
1106         m_waiting_for_command = false;
1107
1108         // If our editline input reader is active, it means another input reader
1109         // got pushed onto the input reader and caused us to become deactivated.
1110         // When the input reader above us gets popped, we will get re-activated
1111         // and our prompt will refresh in our callback
1112         if (m_editline_reader.IsActive())
1113         {
1114             ReadyForCommand ();
1115         }
1116     }
1117     else if (event_type & IOChannel::eBroadcastBitUserInterrupt)
1118     {
1119         // This is here to handle control-c interrupts from the user.  It has not yet really been implemented.
1120         // TO BE DONE:  PROPERLY HANDLE CONTROL-C FROM USER
1121         //m_io_channel_ap->CancelInput();
1122         // Anything else?  Send Interrupt to process?
1123     }
1124     else if ((event_type & IOChannel::eBroadcastBitThreadShouldExit) ||
1125              (event_type & IOChannel::eBroadcastBitThreadDidExit))
1126     {
1127         // If the IOChannel thread is trying to go away, then it is definitely
1128         // time to end the debugging session.
1129         quit = true;
1130     }
1131
1132     return quit;
1133 }
1134
1135 void
1136 Driver::MasterThreadBytesReceived (void *baton, const void *src, size_t src_len)
1137 {
1138     Driver *driver = (Driver*)baton;
1139     driver->GetFromMaster ((const char *)src, src_len);
1140 }
1141
1142 void
1143 Driver::GetFromMaster (const char *src, size_t src_len)
1144 {
1145     // Echo the characters back to the Debugger's stdout, that way if you
1146     // type characters while a command is running, you'll see what you've typed.
1147     FILE *out_fh = m_debugger.GetOutputFileHandle();
1148     if (out_fh)
1149         ::fwrite (src, 1, src_len, out_fh);
1150 }
1151
1152 size_t
1153 Driver::EditLineInputReaderCallback 
1154 (
1155     void *baton, 
1156     SBInputReader *reader, 
1157     InputReaderAction notification,
1158     const char *bytes, 
1159     size_t bytes_len
1160 )
1161 {
1162     Driver *driver = (Driver *)baton;
1163
1164     switch (notification)
1165     {
1166     case eInputReaderActivate:
1167         break;
1168
1169     case eInputReaderReactivate:
1170         if (driver->m_executing_user_command == false)
1171             driver->ReadyForCommand();
1172         break;
1173
1174     case eInputReaderDeactivate:
1175         break;
1176         
1177     case eInputReaderAsynchronousOutputWritten:
1178         if (driver->m_io_channel_ap.get() != NULL)
1179             driver->m_io_channel_ap->RefreshPrompt();
1180         break;
1181
1182     case eInputReaderInterrupt:
1183         if (driver->m_io_channel_ap.get() != NULL)
1184         {
1185             SBProcess process(driver->GetDebugger().GetSelectedTarget().GetProcess());
1186             if (!driver->m_io_channel_ap->EditLineHasCharacters()
1187                 &&  process.IsValid()
1188                 && (process.GetState() == lldb::eStateRunning || process.GetState() == lldb::eStateAttaching))
1189             {
1190                 process.SendAsyncInterrupt ();
1191             }
1192             else
1193             {
1194                 driver->m_io_channel_ap->OutWrite ("^C\n", 3, NO_ASYNC);
1195                 // I wish I could erase the entire input line, but there's no public API for that.
1196                 driver->m_io_channel_ap->EraseCharsBeforeCursor();
1197                 driver->m_io_channel_ap->RefreshPrompt();
1198             }
1199         }
1200         break;
1201         
1202     case eInputReaderEndOfFile:
1203         if (driver->m_io_channel_ap.get() != NULL)
1204         {
1205             driver->m_io_channel_ap->OutWrite ("^D\n", 3, NO_ASYNC);
1206             driver->m_io_channel_ap->RefreshPrompt ();
1207         }
1208         write (driver->m_editline_pty.GetMasterFileDescriptor(), "quit\n", 5);
1209         break;
1210
1211     case eInputReaderGotToken:
1212         write (driver->m_editline_pty.GetMasterFileDescriptor(), bytes, bytes_len);
1213         break;
1214         
1215     case eInputReaderDone:
1216         break;
1217     }
1218     return bytes_len;
1219 }
1220
1221 void
1222 Driver::MainLoop ()
1223 {
1224     char error_str[1024];
1225     if (m_editline_pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, error_str, sizeof(error_str)) == false)
1226     {
1227         ::fprintf (stderr, "error: failed to open driver pseudo terminal : %s", error_str);
1228         exit(1);
1229     }
1230     else
1231     {
1232         const char *driver_slave_name = m_editline_pty.GetSlaveName (error_str, sizeof(error_str));
1233         if (driver_slave_name == NULL)
1234         {
1235             ::fprintf (stderr, "error: failed to get slave name for driver pseudo terminal : %s", error_str);
1236             exit(2);
1237         }
1238         else
1239         {
1240             m_editline_slave_fh = ::fopen (driver_slave_name, "r+");
1241             if (m_editline_slave_fh == NULL)
1242             {
1243                 SBError error;
1244                 error.SetErrorToErrno();
1245                 ::fprintf (stderr, "error: failed to get open slave for driver pseudo terminal : %s",
1246                            error.GetCString());
1247                 exit(3);
1248             }
1249
1250             ::setbuf (m_editline_slave_fh, NULL);
1251         }
1252     }
1253
1254     lldb_utility::PseudoTerminal editline_output_pty;
1255     FILE *editline_output_slave_fh = NULL;
1256     
1257     if (editline_output_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, error_str, sizeof (error_str)) == false)
1258     {
1259         ::fprintf (stderr, "error: failed to open output pseudo terminal : %s", error_str);
1260         exit(1);
1261     }
1262     else
1263     {
1264         const char *output_slave_name = editline_output_pty.GetSlaveName (error_str, sizeof(error_str));
1265         if (output_slave_name == NULL)
1266         {
1267             ::fprintf (stderr, "error: failed to get slave name for output pseudo terminal : %s", error_str);
1268             exit(2);
1269         }
1270         else
1271         {
1272             editline_output_slave_fh = ::fopen (output_slave_name, "r+");
1273             if (editline_output_slave_fh == NULL)
1274             {
1275                 SBError error;
1276                 error.SetErrorToErrno();
1277                 ::fprintf (stderr, "error: failed to get open slave for output pseudo terminal : %s",
1278                            error.GetCString());
1279                 exit(3);
1280             }
1281             ::setbuf (editline_output_slave_fh, NULL);
1282         }
1283     }
1284
1285    // struct termios stdin_termios;
1286
1287     if (::tcgetattr(STDIN_FILENO, &g_old_stdin_termios) == 0)
1288     {
1289         g_old_stdin_termios_is_valid = true;
1290         atexit (reset_stdin_termios);
1291     }
1292
1293     ::setbuf (stdin, NULL);
1294     ::setbuf (stdout, NULL);
1295
1296     m_debugger.SetErrorFileHandle (stderr, false);
1297     m_debugger.SetOutputFileHandle (stdout, false);
1298     m_debugger.SetInputFileHandle (stdin, true);
1299     
1300     m_debugger.SetUseExternalEditor(m_option_data.m_use_external_editor);
1301
1302     // You have to drain anything that comes to the master side of the PTY.  master_out_comm is
1303     // for that purpose.  The reason you need to do this is a curious reason...  editline will echo
1304     // characters to the PTY when it gets characters while el_gets is not running, and then when
1305     // you call el_gets (or el_getc) it will try to reset the terminal back to raw mode which blocks
1306     // if there are unconsumed characters in the out buffer.
1307     // However, you don't need to do anything with the characters, since editline will dump these
1308     // unconsumed characters after printing the prompt again in el_gets.
1309
1310     SBCommunication master_out_comm("driver.editline");
1311     master_out_comm.SetCloseOnEOF (false);
1312     master_out_comm.AdoptFileDesriptor(m_editline_pty.GetMasterFileDescriptor(), false);
1313     master_out_comm.SetReadThreadBytesReceivedCallback(Driver::MasterThreadBytesReceived, this);
1314
1315     if (master_out_comm.ReadThreadStart () == false)
1316     {
1317         ::fprintf (stderr, "error: failed to start master out read thread");
1318         exit(5);
1319     }
1320
1321     SBCommandInterpreter sb_interpreter = m_debugger.GetCommandInterpreter();
1322
1323     m_io_channel_ap.reset (new IOChannel(m_editline_slave_fh, editline_output_slave_fh, stdout, stderr, this));
1324
1325     SBCommunication out_comm_2("driver.editline_output");
1326     out_comm_2.SetCloseOnEOF (false);
1327     out_comm_2.AdoptFileDesriptor (editline_output_pty.GetMasterFileDescriptor(), false);
1328     out_comm_2.SetReadThreadBytesReceivedCallback (IOChannel::LibeditOutputBytesReceived, m_io_channel_ap.get());
1329
1330     if (out_comm_2.ReadThreadStart () == false)
1331     {
1332         ::fprintf (stderr, "error: failed to start libedit output read thread");
1333         exit (5);
1334     }
1335
1336
1337     struct winsize window_size;
1338     if (isatty (STDIN_FILENO)
1339         && ::ioctl (STDIN_FILENO, TIOCGWINSZ, &window_size) == 0)
1340     {
1341         if (window_size.ws_col > 0)
1342             m_debugger.SetTerminalWidth (window_size.ws_col);
1343     }
1344
1345     // Since input can be redirected by the debugger, we must insert our editline
1346     // input reader in the queue so we know when our reader should be active
1347     // and so we can receive bytes only when we are supposed to.
1348     SBError err (m_editline_reader.Initialize (m_debugger, 
1349                                                Driver::EditLineInputReaderCallback, // callback
1350                                                this,                              // baton
1351                                                eInputReaderGranularityByte,       // token_size
1352                                                NULL,                              // end token - NULL means never done
1353                                                NULL,                              // prompt - taken care of elsewhere
1354                                                false));                           // echo input - don't need Debugger 
1355                                                                                   // to do this, we handle it elsewhere
1356     
1357     if (err.Fail())
1358     {
1359         ::fprintf (stderr, "error: %s", err.GetCString());
1360         exit (6);
1361     }
1362     
1363     m_debugger.PushInputReader (m_editline_reader);
1364
1365     SBListener listener(m_debugger.GetListener());
1366     if (listener.IsValid())
1367     {
1368
1369         listener.StartListeningForEventClass(m_debugger, 
1370                                          SBTarget::GetBroadcasterClassName(), 
1371                                          SBTarget::eBroadcastBitBreakpointChanged);
1372         listener.StartListeningForEventClass(m_debugger, 
1373                                          SBThread::GetBroadcasterClassName(),
1374                                          SBThread::eBroadcastBitStackChanged |
1375                                          SBThread::eBroadcastBitThreadSelected);
1376         listener.StartListeningForEvents (*m_io_channel_ap,
1377                                           IOChannel::eBroadcastBitHasUserInput |
1378                                           IOChannel::eBroadcastBitUserInterrupt |
1379                                           IOChannel::eBroadcastBitThreadShouldExit |
1380                                           IOChannel::eBroadcastBitThreadDidStart |
1381                                           IOChannel::eBroadcastBitThreadDidExit);
1382
1383         if (m_io_channel_ap->Start ())
1384         {
1385             bool iochannel_thread_exited = false;
1386
1387             listener.StartListeningForEvents (sb_interpreter.GetBroadcaster(),
1388                                               SBCommandInterpreter::eBroadcastBitQuitCommandReceived |
1389                                               SBCommandInterpreter::eBroadcastBitAsynchronousOutputData |
1390                                               SBCommandInterpreter::eBroadcastBitAsynchronousErrorData);
1391
1392             // Before we handle any options from the command line, we parse the
1393             // .lldbinit file in the user's home directory.
1394             SBCommandReturnObject result;
1395             sb_interpreter.SourceInitFileInHomeDirectory(result);
1396             if (GetDebugMode())
1397             {
1398                 result.PutError (m_debugger.GetErrorFileHandle());
1399                 result.PutOutput (m_debugger.GetOutputFileHandle());
1400             }
1401
1402             // Now we handle options we got from the command line
1403             char command_string[PATH_MAX * 2];
1404             const size_t num_source_command_files = GetNumSourceCommandFiles();
1405             const bool dump_stream_only_if_no_immediate = true;
1406             if (num_source_command_files > 0)
1407             {
1408                 for (size_t i=0; i < num_source_command_files; ++i)
1409                 {
1410                     const char *command_file = GetSourceCommandFileAtIndex(i);
1411                     ::snprintf (command_string, sizeof(command_string), "command source '%s'", command_file);
1412                     m_debugger.GetCommandInterpreter().HandleCommand (command_string, result, false);
1413                     if (GetDebugMode())
1414                     {
1415                         result.PutError (m_debugger.GetErrorFileHandle());
1416                         result.PutOutput (m_debugger.GetOutputFileHandle());
1417                     }
1418                     
1419                     // if the command sourcing generated an error - dump the result object
1420                     if (result.Succeeded() == false)
1421                     {
1422                         const size_t output_size = result.GetOutputSize();
1423                         if (output_size > 0)
1424                             m_io_channel_ap->OutWrite (result.GetOutput(dump_stream_only_if_no_immediate), output_size, NO_ASYNC);
1425                         const size_t error_size = result.GetErrorSize();
1426                         if (error_size > 0)
1427                             m_io_channel_ap->OutWrite (result.GetError(dump_stream_only_if_no_immediate), error_size, NO_ASYNC);
1428                     }
1429                     
1430                     result.Clear();
1431                 }
1432             }
1433
1434             // Was there a core file specified?
1435             std::string core_file_spec("");
1436             if (!m_option_data.m_core_file.empty())
1437                 core_file_spec.append("--core ").append(m_option_data.m_core_file);
1438
1439             const size_t num_args = m_option_data.m_args.size();
1440             if (num_args > 0)
1441             {
1442                 char arch_name[64];
1443                 if (m_debugger.GetDefaultArchitecture (arch_name, sizeof (arch_name)))
1444                     ::snprintf (command_string, 
1445                                 sizeof (command_string), 
1446                                 "target create --arch=%s %s \"%s\"", 
1447                                 arch_name,
1448                                 core_file_spec.c_str(),
1449                                 m_option_data.m_args[0].c_str());
1450                 else
1451                     ::snprintf (command_string, 
1452                                 sizeof(command_string), 
1453                                 "target create %s \"%s\"", 
1454                                 core_file_spec.c_str(),
1455                                 m_option_data.m_args[0].c_str());
1456
1457                 m_debugger.HandleCommand (command_string);
1458                 
1459                 if (num_args > 1)
1460                 {
1461                     m_debugger.HandleCommand ("settings clear target.run-args");
1462                     char arg_cstr[1024];
1463                     for (size_t arg_idx = 1; arg_idx < num_args; ++arg_idx)
1464                     {
1465                         ::snprintf (arg_cstr, 
1466                                     sizeof(arg_cstr), 
1467                                     "settings append target.run-args \"%s\"", 
1468                                     m_option_data.m_args[arg_idx].c_str());
1469                         m_debugger.HandleCommand (arg_cstr);
1470                     }
1471                 }
1472             }
1473             else if (!core_file_spec.empty())
1474             {
1475                 ::snprintf (command_string, 
1476                             sizeof(command_string), 
1477                             "target create %s", 
1478                             core_file_spec.c_str());
1479                 m_debugger.HandleCommand (command_string);;
1480             }
1481
1482             // Now that all option parsing is done, we try and parse the .lldbinit
1483             // file in the current working directory
1484             sb_interpreter.SourceInitFileInCurrentWorkingDirectory (result);
1485             if (GetDebugMode())
1486             {
1487                 result.PutError(m_debugger.GetErrorFileHandle());
1488                 result.PutOutput(m_debugger.GetOutputFileHandle());
1489             }
1490
1491             SBEvent event;
1492
1493             // Make sure the IO channel is started up before we try to tell it we
1494             // are ready for input
1495             listener.WaitForEventForBroadcasterWithType (UINT32_MAX, 
1496                                                          *m_io_channel_ap,
1497                                                          IOChannel::eBroadcastBitThreadDidStart, 
1498                                                          event);
1499             // If we were asked to attach, then do that here:
1500             // I'm going to use the command string rather than directly
1501             // calling the API's because then I don't have to recode the
1502             // event handling here.
1503             if (!m_option_data.m_process_name.empty()
1504                 || m_option_data.m_process_pid != LLDB_INVALID_PROCESS_ID)
1505             {
1506                 std::string command_str("process attach ");
1507                 if (m_option_data.m_process_pid != LLDB_INVALID_PROCESS_ID)
1508                 {
1509                     command_str.append("-p ");
1510                     char pid_buffer[32];
1511                     ::snprintf (pid_buffer, sizeof(pid_buffer), "%" PRIu64, m_option_data.m_process_pid);
1512                     command_str.append(pid_buffer);
1513                 }
1514                 else 
1515                 {
1516                     command_str.append("-n \"");
1517                     command_str.append(m_option_data.m_process_name);
1518                     command_str.push_back('\"');
1519                     if (m_option_data.m_wait_for)
1520                         command_str.append(" -w");
1521                 }
1522                 
1523                 if (m_debugger.GetOutputFileHandle())
1524                     ::fprintf (m_debugger.GetOutputFileHandle(), 
1525                                "Attaching to process with:\n    %s\n", 
1526                                command_str.c_str());
1527                                                
1528                 // Force the attach to be synchronous:
1529                 bool orig_async = m_debugger.GetAsync();
1530                 m_debugger.SetAsync(true);
1531                 m_debugger.HandleCommand(command_str.c_str());
1532                 m_debugger.SetAsync(orig_async);                
1533             }
1534                         
1535             ReadyForCommand ();
1536
1537             while (!GetIsDone())
1538             {
1539                 listener.WaitForEvent (UINT32_MAX, event);
1540                 if (event.IsValid())
1541                 {
1542                     if (event.GetBroadcaster().IsValid())
1543                     {
1544                         uint32_t event_type = event.GetType();
1545                         if (event.BroadcasterMatchesRef (*m_io_channel_ap))
1546                         {
1547                             if ((event_type & IOChannel::eBroadcastBitThreadShouldExit) ||
1548                                 (event_type & IOChannel::eBroadcastBitThreadDidExit))
1549                             {
1550                                 SetIsDone();
1551                                 if (event_type & IOChannel::eBroadcastBitThreadDidExit)
1552                                     iochannel_thread_exited = true;
1553                             }
1554                             else
1555                             {
1556                                 if (HandleIOEvent (event))
1557                                     SetIsDone();
1558                             }
1559                         }
1560                         else if (SBProcess::EventIsProcessEvent (event))
1561                         {
1562                             HandleProcessEvent (event);
1563                         }
1564                         else if (SBBreakpoint::EventIsBreakpointEvent (event))
1565                         {
1566                             HandleBreakpointEvent (event);
1567                         }
1568                         else if (SBThread::EventIsThreadEvent (event))
1569                         {
1570                             HandleThreadEvent (event);
1571                         }
1572                         else if (event.BroadcasterMatchesRef (sb_interpreter.GetBroadcaster()))
1573                         {
1574                             // TODO: deprecate the eBroadcastBitQuitCommandReceived event
1575                             // now that we have SBCommandInterpreter::SetCommandOverrideCallback()
1576                             // that can take over a command
1577                             if (event_type & SBCommandInterpreter::eBroadcastBitQuitCommandReceived)
1578                             {
1579                                 SetIsDone();
1580                             }
1581                             else if (event_type & SBCommandInterpreter::eBroadcastBitAsynchronousErrorData)
1582                             {
1583                                 const char *data = SBEvent::GetCStringFromEvent (event);
1584                                 m_io_channel_ap->ErrWrite (data, strlen(data), ASYNC);
1585                             }
1586                             else if (event_type & SBCommandInterpreter::eBroadcastBitAsynchronousOutputData)
1587                             {
1588                                 const char *data = SBEvent::GetCStringFromEvent (event);
1589                                 m_io_channel_ap->OutWrite (data, strlen(data), ASYNC);
1590                             }
1591                         }
1592                     }
1593                 }
1594             }
1595
1596             master_out_comm.SetReadThreadBytesReceivedCallback(NULL, NULL);
1597             master_out_comm.Disconnect();
1598             master_out_comm.ReadThreadStop();
1599
1600             out_comm_2.SetReadThreadBytesReceivedCallback(NULL, NULL);
1601             out_comm_2.Disconnect();
1602             out_comm_2.ReadThreadStop();
1603
1604             editline_output_pty.CloseMasterFileDescriptor();
1605             reset_stdin_termios();
1606             fclose (stdin);
1607
1608             CloseIOChannelFile ();
1609
1610             if (!iochannel_thread_exited)
1611             {
1612                 event.Clear();
1613                 listener.GetNextEventForBroadcasterWithType (*m_io_channel_ap,
1614                                                              IOChannel::eBroadcastBitThreadDidExit,
1615                                                              event);
1616                 if (!event.IsValid())
1617                 {
1618                     // Send end EOF to the driver file descriptor
1619                     m_io_channel_ap->Stop();
1620                 }
1621             }
1622
1623             SBDebugger::Destroy (m_debugger);
1624         }
1625     }
1626 }
1627
1628
1629 void
1630 Driver::ReadyForCommand ()
1631 {
1632     if (m_waiting_for_command == false)
1633     {
1634         m_waiting_for_command = true;
1635         BroadcastEventByType (Driver::eBroadcastBitReadyForInput, true);
1636     }
1637 }
1638
1639 void
1640 Driver::ResizeWindow (unsigned short col)
1641 {
1642     GetDebugger().SetTerminalWidth (col);
1643     if (m_io_channel_ap.get() != NULL)
1644     {
1645         m_io_channel_ap->ElResize();
1646     }
1647 }
1648
1649 void
1650 sigwinch_handler (int signo)
1651 {
1652     struct winsize window_size;
1653     if (isatty (STDIN_FILENO)
1654         && ::ioctl (STDIN_FILENO, TIOCGWINSZ, &window_size) == 0)
1655     {
1656         if ((window_size.ws_col > 0) && g_driver != NULL)
1657         {
1658             g_driver->ResizeWindow (window_size.ws_col);
1659         }
1660     }
1661 }
1662
1663 void
1664 sigint_handler (int signo)
1665 {
1666         static bool g_interrupt_sent = false;
1667     if (g_driver)
1668         {
1669                 if (!g_interrupt_sent)
1670                 {
1671                         g_interrupt_sent = true;
1672                 g_driver->GetDebugger().DispatchInputInterrupt();
1673                         g_interrupt_sent = false;
1674                         return;
1675                 }
1676         }
1677     
1678         exit (signo);
1679 }
1680
1681 void
1682 sigtstp_handler (int signo)
1683 {
1684     g_driver->GetDebugger().SaveInputTerminalState();
1685     signal (signo, SIG_DFL);
1686     kill (getpid(), signo);
1687     signal (signo, sigtstp_handler);
1688 }
1689
1690 void
1691 sigcont_handler (int signo)
1692 {
1693     g_driver->GetDebugger().RestoreInputTerminalState();
1694     signal (signo, SIG_DFL);
1695     kill (getpid(), signo);
1696     signal (signo, sigcont_handler);
1697 }
1698
1699 int
1700 main (int argc, char const *argv[], const char *envp[])
1701 {
1702     SBDebugger::Initialize();
1703     
1704     SBHostOS::ThreadCreated ("<lldb.driver.main-thread>");
1705
1706     signal (SIGPIPE, SIG_IGN);
1707     signal (SIGWINCH, sigwinch_handler);
1708     signal (SIGINT, sigint_handler);
1709     signal (SIGTSTP, sigtstp_handler);
1710     signal (SIGCONT, sigcont_handler);
1711
1712     // Create a scope for driver so that the driver object will destroy itself
1713     // before SBDebugger::Terminate() is called.
1714     {
1715         Driver driver;
1716
1717         bool exit = false;
1718         SBError error (driver.ParseArgs (argc, argv, stdout, exit));
1719         if (error.Fail())
1720         {
1721             const char *error_cstr = error.GetCString ();
1722             if (error_cstr)
1723                 ::fprintf (stderr, "error: %s\n", error_cstr);
1724         }
1725         else if (!exit)
1726         {
1727             driver.MainLoop ();
1728         }
1729     }
1730
1731     SBDebugger::Terminate();
1732     return 0;
1733 }