]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/tools/driver/Driver.cpp
Update llvm to release_39 branch r276489, and resolve conflicts.
[FreeBSD/FreeBSD.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 <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <limits.h>
16 #include <fcntl.h>
17
18 // Includes for pipe()
19 #if defined(_WIN32)
20 #include <io.h>
21 #include <fcntl.h>
22 #elif defined(__ANDROID_NDK__)
23 #include <errno.h>
24 #else
25 #include <unistd.h>
26 #endif
27
28 #include <string>
29
30 #include <thread>
31 #include "lldb/API/SBBreakpoint.h"
32 #include "lldb/API/SBCommandInterpreter.h"
33 #include "lldb/API/SBCommandReturnObject.h"
34 #include "lldb/API/SBCommunication.h"
35 #include "lldb/API/SBDebugger.h"
36 #include "lldb/API/SBEvent.h"
37 #include "lldb/API/SBHostOS.h"
38 #include "lldb/API/SBLanguageRuntime.h"
39 #include "lldb/API/SBListener.h"
40 #include "lldb/API/SBStream.h"
41 #include "lldb/API/SBTarget.h"
42 #include "lldb/API/SBThread.h"
43 #include "lldb/API/SBProcess.h"
44
45 #if !defined(__APPLE__)
46 #include "llvm/Support/DataTypes.h"
47 #endif
48
49 using namespace lldb;
50
51 static void reset_stdin_termios ();
52 static bool g_old_stdin_termios_is_valid = false;
53 static struct termios g_old_stdin_termios;
54
55 static Driver *g_driver = NULL;
56
57 // In the Driver::MainLoop, we change the terminal settings.  This function is
58 // added as an atexit handler to make sure we clean them up.
59 static void
60 reset_stdin_termios ()
61 {
62     if (g_old_stdin_termios_is_valid)
63     {
64         g_old_stdin_termios_is_valid = false;
65         ::tcsetattr (STDIN_FILENO, TCSANOW, &g_old_stdin_termios);
66     }
67 }
68
69 typedef struct
70 {
71     uint32_t usage_mask;                     // Used to mark options that can be used together.  If (1 << n & usage_mask) != 0
72                                              // then this option belongs to option set n.
73     bool required;                           // This option is required (in the current usage level)
74     const char * long_option;                // Full name for this option.
75     int short_option;                        // Single character for this option.
76     int option_has_arg;                      // no_argument, required_argument or optional_argument
77     uint32_t completion_type;                // Cookie the option class can use to do define the argument completion.
78     lldb::CommandArgumentType argument_type; // Type of argument this option takes
79     const char *  usage_text;                // Full text explaining what this options does and what (if any) argument to
80                                              // pass it.
81 } OptionDefinition;
82
83 #define LLDB_3_TO_5 LLDB_OPT_SET_3|LLDB_OPT_SET_4|LLDB_OPT_SET_5
84 #define LLDB_4_TO_5 LLDB_OPT_SET_4|LLDB_OPT_SET_5
85
86 static OptionDefinition g_options[] =
87 {
88     { LLDB_OPT_SET_1,    true , "help"           , 'h', no_argument      , 0,  eArgTypeNone,
89         "Prints out the usage information for the LLDB debugger." },
90     { LLDB_OPT_SET_2,    true , "version"        , 'v', no_argument      , 0,  eArgTypeNone,
91         "Prints out the current version number of the LLDB debugger." },
92     { LLDB_OPT_SET_3,    true , "arch"           , 'a', required_argument, 0,  eArgTypeArchitecture,
93         "Tells the debugger to use the specified architecture when starting and running the program.  <architecture> must "
94         "be one of the architectures for which the program was compiled." },
95     { LLDB_OPT_SET_3,    true , "file"           , 'f', required_argument, 0,  eArgTypeFilename,
96         "Tells the debugger to use the file <filename> as the program to be debugged." },
97     { LLDB_OPT_SET_3,    false, "core"           , 'c', required_argument, 0,  eArgTypeFilename,
98         "Tells the debugger to use the fullpath to <path> as the core file." },
99     { LLDB_OPT_SET_5,    true , "attach-pid"     , 'p', required_argument, 0,  eArgTypePid,
100         "Tells the debugger to attach to a process with the given pid." },
101     { LLDB_OPT_SET_4,    true , "attach-name"    , 'n', required_argument, 0,  eArgTypeProcessName,
102         "Tells the debugger to attach to a process with the given name." },
103     { LLDB_OPT_SET_4,    true , "wait-for"       , 'w', no_argument      , 0,  eArgTypeNone,
104         "Tells the debugger to wait for a process with the given pid or name to launch before attaching." },
105     { LLDB_3_TO_5,       false, "source"         , 's', required_argument, 0,  eArgTypeFilename,
106         "Tells the debugger to read in and execute the lldb commands in the given file, after any file provided on the command line has been loaded." },
107     { LLDB_3_TO_5,       false, "one-line"         , 'o', required_argument, 0,  eArgTypeNone,
108         "Tells the debugger to execute this one-line lldb command after any file provided on the command line has been loaded." },
109     { LLDB_3_TO_5,       false, "source-before-file"         , 'S', required_argument, 0,  eArgTypeFilename,
110         "Tells the debugger to read in and execute the lldb commands in the given file, before any file provided on the command line has been loaded." },
111     { LLDB_3_TO_5,       false, "one-line-before-file"         , 'O', required_argument, 0,  eArgTypeNone,
112         "Tells the debugger to execute this one-line lldb command before any file provided on the command line has been loaded." },
113     { LLDB_3_TO_5,       false, "one-line-on-crash"         , 'k', required_argument, 0,  eArgTypeNone,
114         "When in batch mode, tells the debugger to execute this one-line lldb command if the target crashes." },
115     { LLDB_3_TO_5,       false, "source-on-crash"         , 'K', required_argument, 0,  eArgTypeFilename,
116         "When in batch mode, tells the debugger to source this file of lldb commands if the target crashes." },
117     { LLDB_3_TO_5,       false, "source-quietly"          , 'Q', no_argument      , 0,  eArgTypeNone,
118         "Tells the debugger to execute this one-line lldb command before any file provided on the command line has been loaded." },
119     { LLDB_3_TO_5,       false, "batch"          , 'b', no_argument      , 0,  eArgTypeNone,
120         "Tells the debugger to running the commands from -s, -S, -o & -O, and then quit.  However if any run command stopped due to a signal or crash, "
121         "the debugger will return to the interactive prompt at the place of the crash." },
122     { LLDB_3_TO_5,       false, "editor"         , 'e', no_argument      , 0,  eArgTypeNone,
123         "Tells the debugger to open source files using the host's \"external editor\" mechanism." },
124     { LLDB_3_TO_5,       false, "no-lldbinit"    , 'x', no_argument      , 0,  eArgTypeNone,
125         "Do not automatically parse any '.lldbinit' files." },
126     { LLDB_3_TO_5,       false, "no-use-colors"  , 'X', no_argument      , 0,  eArgTypeNone,
127         "Do not use colors." },
128     { LLDB_OPT_SET_6,    true , "python-path"    , 'P', no_argument      , 0,  eArgTypeNone,
129         "Prints out the path to the lldb.py file for this version of lldb." },
130     { LLDB_3_TO_5,       false, "script-language", 'l', required_argument, 0,  eArgTypeScriptLang,
131         "Tells the debugger to use the specified scripting language for user-defined scripts, rather than the default.  "
132         "Valid scripting languages that can be specified include Python, Perl, Ruby and Tcl.  Currently only the Python "
133         "extensions have been implemented." },
134     { LLDB_3_TO_5,       false, "debug"          , 'd', no_argument      , 0,  eArgTypeNone,
135         "Tells the debugger to print out extra information for debugging itself." },
136     { LLDB_OPT_SET_7,  true , "repl"               , 'r', optional_argument, 0,  eArgTypeNone,
137         "Runs lldb in REPL mode with a stub process." },
138     { LLDB_OPT_SET_7,  true , "repl-language"      , 'R', required_argument, 0,  eArgTypeNone,
139         "Chooses the language for the REPL." },
140     { 0,                 false, NULL             , 0  , 0                , 0,  eArgTypeNone,         NULL }
141 };
142
143 static const uint32_t last_option_set_with_args = 2;
144
145 Driver::Driver () :
146     SBBroadcaster ("Driver"),
147     m_debugger (SBDebugger::Create(false)),
148     m_option_data ()
149 {
150     // We want to be able to handle CTRL+D in the terminal to have it terminate
151     // certain input
152     m_debugger.SetCloseInputOnEOF (false);
153     g_driver = this;
154 }
155
156 Driver::~Driver ()
157 {
158     g_driver = NULL;
159 }
160
161
162 // This function takes INDENT, which tells how many spaces to output at the front
163 // of each line; TEXT, which is the text that is to be output. It outputs the 
164 // text, on multiple lines if necessary, to RESULT, with INDENT spaces at the 
165 // front of each line.  It breaks lines on spaces, tabs or newlines, shortening 
166 // the line if necessary to not break in the middle of a word. It assumes that 
167 // each output line should contain a maximum of OUTPUT_MAX_COLUMNS characters.
168
169 void
170 OutputFormattedUsageText (FILE *out, int indent, const char *text, int output_max_columns)
171 {
172     int len = strlen (text);
173     std::string text_string (text);
174
175     // Force indentation to be reasonable.
176     if (indent >= output_max_columns)
177         indent = 0;
178
179     // Will it all fit on one line?
180
181     if (len + indent < output_max_columns)
182         // Output as a single line
183         fprintf (out, "%*s%s\n", indent, "", text);
184     else
185     {
186         // We need to break it up into multiple lines.
187         int text_width = output_max_columns - indent - 1;
188         int start = 0;
189         int end = start;
190         int final_end = len;
191         int sub_len;
192
193         while (end < final_end)
194         {
195               // Dont start the 'text' on a space, since we're already outputting the indentation.
196               while ((start < final_end) && (text[start] == ' '))
197                   start++;
198
199               end = start + text_width;
200               if (end > final_end)
201                   end = final_end;
202               else
203               {
204                   // If we're not at the end of the text, make sure we break the line on white space.
205                   while (end > start
206                          && text[end] != ' ' && text[end] != '\t' && text[end] != '\n')
207                       end--;
208               }
209               sub_len = end - start;
210               std::string substring = text_string.substr (start, sub_len);
211               fprintf (out, "%*s%s\n", indent, "", substring.c_str());
212               start = end + 1;
213         }
214     }
215 }
216
217 void
218 ShowUsage (FILE *out, OptionDefinition *option_table, Driver::OptionData data)
219 {
220     uint32_t screen_width = 80;
221     uint32_t indent_level = 0;
222     const char *name = "lldb";
223     
224     fprintf (out, "\nUsage:\n\n");
225
226     indent_level += 2;
227
228
229     // First, show each usage level set of options, e.g. <cmd> [options-for-level-0]
230     //                                                   <cmd> [options-for-level-1]
231     //                                                   etc.
232
233     uint32_t num_options;
234     uint32_t num_option_sets = 0;
235     
236     for (num_options = 0; option_table[num_options].long_option != NULL; ++num_options)
237     {
238         uint32_t this_usage_mask = option_table[num_options].usage_mask;
239         if (this_usage_mask == LLDB_OPT_SET_ALL)
240         {
241             if (num_option_sets == 0)
242                 num_option_sets = 1;
243         }
244         else
245         {
246             for (uint32_t j = 0; j < LLDB_MAX_NUM_OPTION_SETS; j++)
247             {
248                 if (this_usage_mask & 1 << j)
249                 {
250                     if (num_option_sets <= j)
251                         num_option_sets = j + 1;
252                 }
253             }
254         }
255     }
256
257     for (uint32_t opt_set = 0; opt_set < num_option_sets; opt_set++)
258     {
259         uint32_t opt_set_mask;
260         
261         opt_set_mask = 1 << opt_set;
262         
263         if (opt_set > 0)
264             fprintf (out, "\n");
265         fprintf (out, "%*s%s", indent_level, "", name);
266         bool is_help_line = false;
267         
268         for (uint32_t i = 0; i < num_options; ++i)
269         {
270             if (option_table[i].usage_mask & opt_set_mask)
271             {
272                 CommandArgumentType arg_type = option_table[i].argument_type;
273                 const char *arg_name = SBCommandInterpreter::GetArgumentTypeAsCString (arg_type);
274                 // This is a bit of a hack, but there's no way to say certain options don't have arguments yet...
275                 // so we do it by hand here.
276                 if (option_table[i].short_option == 'h')
277                     is_help_line = true;
278                     
279                 if (option_table[i].required)
280                 {
281                     if (option_table[i].option_has_arg == required_argument)
282                         fprintf (out, " -%c <%s>", option_table[i].short_option, arg_name);
283                     else if (option_table[i].option_has_arg == optional_argument)
284                         fprintf (out, " -%c [<%s>]", option_table[i].short_option, arg_name);
285                     else
286                         fprintf (out, " -%c", option_table[i].short_option);
287                 }
288                 else
289                 {
290                     if (option_table[i].option_has_arg == required_argument)
291                         fprintf (out, " [-%c <%s>]", option_table[i].short_option, arg_name);
292                     else if (option_table[i].option_has_arg == optional_argument)
293                         fprintf (out, " [-%c [<%s>]]", option_table[i].short_option, arg_name);
294                     else
295                         fprintf (out, " [-%c]", option_table[i].short_option);
296                 }
297             }
298         }
299         if (!is_help_line && (opt_set <= last_option_set_with_args))
300             fprintf (out, " [[--] <PROGRAM-ARG-1> [<PROGRAM_ARG-2> ...]]");
301     }
302
303     fprintf (out, "\n\n");
304
305     // Now print out all the detailed information about the various options:  long form, short form and help text:
306     //   -- long_name <argument>
307     //   - short <argument>
308     //   help text
309
310     // This variable is used to keep track of which options' info we've printed out, because some options can be in
311     // more than one usage level, but we only want to print the long form of its information once.
312
313     Driver::OptionData::OptionSet options_seen;
314     Driver::OptionData::OptionSet::iterator pos;
315
316     indent_level += 5;
317
318     for (uint32_t i = 0; i < num_options; ++i)
319     {
320         // Only print this option if we haven't already seen it.
321         pos = options_seen.find (option_table[i].short_option);
322         if (pos == options_seen.end())
323         {
324             CommandArgumentType arg_type = option_table[i].argument_type;
325             const char *arg_name = SBCommandInterpreter::GetArgumentTypeAsCString (arg_type);
326
327             options_seen.insert (option_table[i].short_option);
328             fprintf (out, "%*s-%c ", indent_level, "", option_table[i].short_option);
329             if (arg_type != eArgTypeNone)
330                 fprintf (out, "<%s>", arg_name);
331             fprintf (out, "\n");
332             fprintf (out, "%*s--%s ", indent_level, "", option_table[i].long_option);
333             if (arg_type != eArgTypeNone)
334                 fprintf (out, "<%s>", arg_name);
335             fprintf (out, "\n");
336             indent_level += 5;
337             OutputFormattedUsageText (out, indent_level, option_table[i].usage_text, screen_width);
338             indent_level -= 5;
339             fprintf (out, "\n");
340         }
341     }
342
343     indent_level -= 5;
344     
345     fprintf (out, "\n%*sNotes:\n",
346              indent_level, "");
347     indent_level += 5;
348     
349     fprintf (out, "\n%*sMultiple \"-s\" and \"-o\" options can be provided.  They will be processed"
350                   "\n%*sfrom left to right in order, with the source files and commands"
351                   "\n%*sinterleaved.  The same is true of the \"-S\" and \"-O\" options.  The before"
352                   "\n%*sfile and after file sets can intermixed freely, the command parser will"
353                   "\n%*ssort them out.  The order of the file specifiers (\"-c\", \"-f\", etc.) is"
354                   "\n%*snot significant in this regard.\n\n",
355              indent_level, "", 
356              indent_level, "", 
357              indent_level, "",
358              indent_level, "",
359              indent_level, "",
360              indent_level, "");
361     
362     fprintf (out, "\n%*sIf you don't provide -f then the first argument will be the file to be"
363                   "\n%*sdebugged which means that '%s -- <filename> [<ARG1> [<ARG2>]]' also"
364                   "\n%*sworks.  But remember to end the options with \"--\" if any of your"
365                   "\n%*sarguments have a \"-\" in them.\n\n",
366              indent_level, "", 
367              indent_level, "",
368              name, 
369              indent_level, "",
370              indent_level, "");
371 }
372
373 void
374 BuildGetOptTable (OptionDefinition *expanded_option_table, std::vector<struct option> &getopt_table, 
375                   uint32_t num_options)
376 {
377     if (num_options == 0)
378         return;
379
380     uint32_t i;
381     uint32_t j;
382     std::bitset<256> option_seen;
383
384     getopt_table.resize (num_options + 1);
385
386     for (i = 0, j = 0; i < num_options; ++i)
387     {
388         char short_opt = expanded_option_table[i].short_option;
389         
390         if (option_seen.test(short_opt) == false)
391         {
392             getopt_table[j].name    = expanded_option_table[i].long_option;
393             getopt_table[j].has_arg = expanded_option_table[i].option_has_arg;
394             getopt_table[j].flag    = NULL;
395             getopt_table[j].val     = expanded_option_table[i].short_option;
396             option_seen.set(short_opt);
397             ++j;
398         }
399     }
400
401     getopt_table[j].name    = NULL;
402     getopt_table[j].has_arg = 0;
403     getopt_table[j].flag    = NULL;
404     getopt_table[j].val     = 0;
405
406 }
407
408 Driver::OptionData::OptionData () :
409     m_args(),
410     m_script_lang (lldb::eScriptLanguageDefault),
411     m_core_file (),
412     m_crash_log (),
413     m_initial_commands (),
414     m_after_file_commands (),
415     m_after_crash_commands(),
416     m_debug_mode (false),
417     m_source_quietly(false),
418     m_print_version (false),
419     m_print_python_path (false),
420     m_print_help (false),
421     m_wait_for(false),
422     m_repl (false),
423     m_repl_lang (eLanguageTypeUnknown),
424     m_repl_options (),
425     m_process_name(),
426     m_process_pid(LLDB_INVALID_PROCESS_ID),
427     m_use_external_editor(false),
428     m_batch(false),
429     m_seen_options()
430 {
431 }
432
433 Driver::OptionData::~OptionData ()
434 {
435 }
436
437 void
438 Driver::OptionData::Clear ()
439 {
440     m_args.clear ();
441     m_script_lang = lldb::eScriptLanguageDefault;
442     m_initial_commands.clear ();
443     m_after_file_commands.clear ();
444     // If there is a local .lldbinit, source that:
445     SBFileSpec local_lldbinit("./.lldbinit", true);
446     if (local_lldbinit.Exists())
447     {
448         char path[2048];
449         local_lldbinit.GetPath(path, 2047);
450         InitialCmdEntry entry(path, true, true);
451         m_after_file_commands.push_back (entry);
452     }
453     
454     m_debug_mode = false;
455     m_source_quietly = false;
456     m_print_help = false;
457     m_print_version = false;
458     m_print_python_path = false;
459     m_use_external_editor = false;
460     m_wait_for = false;
461     m_process_name.erase();
462     m_batch = false;
463     m_after_crash_commands.clear();
464
465     m_process_pid = LLDB_INVALID_PROCESS_ID;
466 }
467
468 void
469 Driver::OptionData::AddInitialCommand (const char *command, CommandPlacement placement, bool is_file, SBError &error)
470 {
471     std::vector<InitialCmdEntry> *command_set;
472     switch (placement)
473     {
474     case eCommandPlacementBeforeFile:
475         command_set = &(m_initial_commands);
476         break;
477     case eCommandPlacementAfterFile:
478         command_set = &(m_after_file_commands);
479         break;
480     case eCommandPlacementAfterCrash:
481         command_set = &(m_after_crash_commands);
482         break;
483     }
484
485     if (is_file)
486     {
487         SBFileSpec file(command);
488         if (file.Exists())
489             command_set->push_back (InitialCmdEntry(command, is_file));
490         else if (file.ResolveExecutableLocation())
491         {
492             char final_path[PATH_MAX];
493             file.GetPath (final_path, sizeof(final_path));
494             command_set->push_back (InitialCmdEntry(final_path, is_file));
495         }
496         else
497             error.SetErrorStringWithFormat("file specified in --source (-s) option doesn't exist: '%s'", optarg);
498     }
499     else
500         command_set->push_back (InitialCmdEntry(command, is_file));
501 }
502
503 void
504 Driver::ResetOptionValues ()
505 {
506     m_option_data.Clear ();
507 }
508
509 const char *
510 Driver::GetFilename() const
511 {
512     if (m_option_data.m_args.empty())
513         return NULL;
514     return m_option_data.m_args.front().c_str();
515 }
516
517 const char *
518 Driver::GetCrashLogFilename() const
519 {
520     if (m_option_data.m_crash_log.empty())
521         return NULL;
522     return m_option_data.m_crash_log.c_str();
523 }
524
525 lldb::ScriptLanguage
526 Driver::GetScriptLanguage() const
527 {
528     return m_option_data.m_script_lang;
529 }
530
531 void
532 Driver::WriteCommandsForSourcing (CommandPlacement placement, SBStream &strm)
533 {
534     std::vector<OptionData::InitialCmdEntry> *command_set;
535     switch (placement)
536     {
537     case eCommandPlacementBeforeFile:
538         command_set = &m_option_data.m_initial_commands;
539         break;
540     case eCommandPlacementAfterFile:
541         command_set = &m_option_data.m_after_file_commands;
542         break;
543     case eCommandPlacementAfterCrash:
544         command_set = &m_option_data.m_after_crash_commands;
545         break;
546     }
547     
548     for (const auto &command_entry : *command_set)
549     {
550         const char *command = command_entry.contents.c_str();
551         if (command_entry.is_file)
552         {
553             bool source_quietly = m_option_data.m_source_quietly || command_entry.source_quietly;
554             strm.Printf("command source -s %i '%s'\n", source_quietly, command);
555         }
556         else
557             strm.Printf("%s\n", command);
558     }
559 }
560
561 bool
562 Driver::GetDebugMode() const
563 {
564     return m_option_data.m_debug_mode;
565 }
566
567
568 // Check the arguments that were passed to this program to make sure they are valid and to get their
569 // argument values (if any).  Return a boolean value indicating whether or not to start up the full
570 // debugger (i.e. the Command Interpreter) or not.  Return FALSE if the arguments were invalid OR
571 // if the user only wanted help or version information.
572
573 SBError
574 Driver::ParseArgs (int argc, const char *argv[], FILE *out_fh, bool &exiting)
575 {
576     ResetOptionValues ();
577
578     SBCommandReturnObject result;
579
580     SBError error;
581     std::string option_string;
582     struct option *long_options = NULL;
583     std::vector<struct option> long_options_vector;
584     uint32_t num_options;
585
586     for (num_options = 0; g_options[num_options].long_option != NULL; ++num_options)
587         /* Do Nothing. */;
588
589     if (num_options == 0)
590     {
591         if (argc > 1)
592             error.SetErrorStringWithFormat ("invalid number of options");
593         return error;
594     }
595
596     BuildGetOptTable (g_options, long_options_vector, num_options);
597
598     if (long_options_vector.empty())
599         long_options = NULL;
600     else
601         long_options = &long_options_vector.front();
602
603     if (long_options == NULL)
604     {
605         error.SetErrorStringWithFormat ("invalid long options");
606         return error;
607     }
608
609     // Build the option_string argument for call to getopt_long_only.
610
611     for (int i = 0; long_options[i].name != NULL; ++i)
612     {
613         if (long_options[i].flag == NULL)
614         {
615             option_string.push_back ((char) long_options[i].val);
616             switch (long_options[i].has_arg)
617             {
618                 default:
619                 case no_argument:
620                     break;
621                 case required_argument:
622                     option_string.push_back (':');
623                     break;
624                 case optional_argument:
625                     option_string.append ("::");
626                     break;
627             }
628         }
629     }
630
631     // This is kind of a pain, but since we make the debugger in the Driver's constructor, we can't
632     // know at that point whether we should read in init files yet.  So we don't read them in in the
633     // Driver constructor, then set the flags back to "read them in" here, and then if we see the
634     // "-n" flag, we'll turn it off again.  Finally we have to read them in by hand later in the
635     // main loop.
636     
637     m_debugger.SkipLLDBInitFiles (false);
638     m_debugger.SkipAppInitFiles (false);
639
640     // Prepare for & make calls to getopt_long_only.
641 #if __GLIBC__
642     optind = 0;
643 #else
644     optreset = 1;
645     optind = 1;
646 #endif
647     int val;
648     while (1)
649     {
650         int long_options_index = -1;
651         val = ::getopt_long_only (argc, const_cast<char **>(argv), option_string.c_str(), long_options, &long_options_index);
652
653         if (val == -1)
654             break;
655         else if (val == '?')
656         {
657             m_option_data.m_print_help = true;
658             error.SetErrorStringWithFormat ("unknown or ambiguous option");
659             break;
660         }
661         else if (val == 0)
662             continue;
663         else
664         {
665             m_option_data.m_seen_options.insert ((char) val);
666             if (long_options_index == -1)
667             {
668                 for (int i = 0;
669                      long_options[i].name || long_options[i].has_arg || long_options[i].flag || long_options[i].val;
670                      ++i)
671                 {
672                     if (long_options[i].val == val)
673                     {
674                         long_options_index = i;
675                         break;
676                     }
677                 }
678             }
679
680             if (long_options_index >= 0)
681             {
682                 const int short_option = g_options[long_options_index].short_option;
683
684                 switch (short_option)
685                 {
686                     case 'h':
687                         m_option_data.m_print_help = true;
688                         break;
689
690                     case 'v':
691                         m_option_data.m_print_version = true;
692                         break;
693
694                     case 'P':
695                         m_option_data.m_print_python_path = true;
696                         break;
697
698                     case 'b':
699                         m_option_data.m_batch = true;
700                         break;
701
702                     case 'c':
703                         {
704                             SBFileSpec file(optarg);
705                             if (file.Exists())
706                             {
707                                 m_option_data.m_core_file = optarg;
708                             }
709                             else
710                                 error.SetErrorStringWithFormat("file specified in --core (-c) option doesn't exist: '%s'", optarg);
711                         }
712                         break;
713                     
714                     case 'e':
715                         m_option_data.m_use_external_editor = true;
716                         break;
717
718                     case 'x':
719                         m_debugger.SkipLLDBInitFiles (true);
720                         m_debugger.SkipAppInitFiles (true);
721                         break;
722
723                     case 'X':
724                         m_debugger.SetUseColor (false);
725                         break;
726
727                     case 'f':
728                         {
729                             SBFileSpec file(optarg);
730                             if (file.Exists())
731                             {
732                                 m_option_data.m_args.push_back (optarg);
733                             }
734                             else if (file.ResolveExecutableLocation())
735                             {
736                                 char path[PATH_MAX];
737                                 file.GetPath (path, sizeof(path));
738                                 m_option_data.m_args.push_back (path);
739                             }
740                             else
741                                 error.SetErrorStringWithFormat("file specified in --file (-f) option doesn't exist: '%s'", optarg);
742                         }
743                         break;
744
745                     case 'a':
746                         if (!m_debugger.SetDefaultArchitecture (optarg))
747                             error.SetErrorStringWithFormat("invalid architecture in the -a or --arch option: '%s'", optarg);
748                         break;
749
750                     case 'l':
751                         m_option_data.m_script_lang = m_debugger.GetScriptingLanguage (optarg);
752                         break;
753
754                     case 'd':
755                         m_option_data.m_debug_mode = true;
756                         break;
757
758                     case 'Q':
759                         m_option_data.m_source_quietly = true;
760                         break;
761
762                     case 'K':
763                         m_option_data.AddInitialCommand(optarg, eCommandPlacementAfterCrash, true, error);
764                         break;
765                     case 'k':
766                         m_option_data.AddInitialCommand(optarg, eCommandPlacementAfterCrash, false, error);
767                         break;
768
769                     case 'n':
770                         m_option_data.m_process_name = optarg;
771                         break;
772                     
773                     case 'w':
774                         m_option_data.m_wait_for = true;
775                         break;
776                         
777                     case 'p':
778                         {
779                             char *remainder;
780                             m_option_data.m_process_pid = strtol (optarg, &remainder, 0);
781                             if (remainder == optarg || *remainder != '\0')
782                                 error.SetErrorStringWithFormat ("Could not convert process PID: \"%s\" into a pid.",
783                                                                 optarg);
784                         }
785                         break;
786                         
787                     case 'r':
788                         m_option_data.m_repl = true;
789                         if (optarg && optarg[0])
790                             m_option_data.m_repl_options = optarg;
791                         else
792                             m_option_data.m_repl_options.clear();
793                         break;
794                     
795                     case 'R':
796                         m_option_data.m_repl_lang = SBLanguageRuntime::GetLanguageTypeFromString (optarg);
797                         if (m_option_data.m_repl_lang == eLanguageTypeUnknown)
798                         {
799                             error.SetErrorStringWithFormat ("Unrecognized language name: \"%s\"", optarg);
800                         }
801                         break;
802
803                     case 's':
804                         m_option_data.AddInitialCommand(optarg, eCommandPlacementAfterFile, true, error);
805                         break;
806                     case 'o':
807                         m_option_data.AddInitialCommand(optarg, eCommandPlacementAfterFile, false, error);
808                         break;
809                     case 'S':
810                         m_option_data.AddInitialCommand(optarg, eCommandPlacementBeforeFile, true, error);
811                         break;
812                     case 'O':
813                         m_option_data.AddInitialCommand(optarg, eCommandPlacementBeforeFile, false, error);
814                         break;
815                     default:
816                         m_option_data.m_print_help = true;
817                         error.SetErrorStringWithFormat ("unrecognized option %c", short_option);
818                         break;
819                 }
820             }
821             else
822             {
823                 error.SetErrorStringWithFormat ("invalid option with value %i", val);
824             }
825             if (error.Fail())
826             {
827                 return error;
828             }
829         }
830     }
831     
832     if (error.Fail() || m_option_data.m_print_help)
833     {
834         ShowUsage (out_fh, g_options, m_option_data);
835         exiting = true;
836     }
837     else if (m_option_data.m_print_version)
838     {
839         ::fprintf (out_fh, "%s\n", m_debugger.GetVersionString());
840         exiting = true;
841     }
842     else if (m_option_data.m_print_python_path)
843     {
844         SBFileSpec python_file_spec = SBHostOS::GetLLDBPythonPath();
845         if (python_file_spec.IsValid())
846         {
847             char python_path[PATH_MAX];
848             size_t num_chars = python_file_spec.GetPath(python_path, PATH_MAX);
849             if (num_chars < PATH_MAX)
850             {
851                 ::fprintf (out_fh, "%s\n", python_path);
852             }
853             else
854                 ::fprintf (out_fh, "<PATH TOO LONG>\n");
855         }
856         else
857             ::fprintf (out_fh, "<COULD NOT FIND PATH>\n");
858         exiting = true;
859     }
860     else if (m_option_data.m_process_name.empty() && m_option_data.m_process_pid == LLDB_INVALID_PROCESS_ID)
861     {
862         // Any arguments that are left over after option parsing are for
863         // the program. If a file was specified with -f then the filename
864         // is already in the m_option_data.m_args array, and any remaining args
865         // are arguments for the inferior program. If no file was specified with
866         // -f, then what is left is the program name followed by any arguments.
867
868         // Skip any options we consumed with getopt_long_only
869         argc -= optind;
870         argv += optind;
871
872         if (argc > 0)
873         {
874             for (int arg_idx=0; arg_idx<argc; ++arg_idx)
875             {
876                 const char *arg = argv[arg_idx];
877                 if (arg)
878                     m_option_data.m_args.push_back (arg);
879             }
880         }
881         
882     }
883     else
884     {
885         // Skip any options we consumed with getopt_long_only
886         argc -= optind;
887         //argv += optind; // Commented out to keep static analyzer happy
888
889         if (argc > 0)
890             ::fprintf (out_fh, "Warning: program arguments are ignored when attaching.\n");
891     }
892
893     return error;
894 }
895
896 static ::FILE *
897 PrepareCommandsForSourcing (const char *commands_data, size_t commands_size, int fds[2])
898 {
899     enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE
900
901     ::FILE *commands_file = NULL;
902     fds[0] = -1;
903     fds[1] = -1;
904     int err = 0;
905 #ifdef _WIN32
906     err = _pipe(fds, commands_size, O_BINARY);
907 #else
908     err = pipe(fds);
909 #endif
910     if (err == 0)
911     {
912         ssize_t nrwr = write(fds[WRITE], commands_data, commands_size);
913         if (nrwr < 0)
914         {
915             fprintf(stderr, "error: write(%i, %p, %" PRIu64 ") failed (errno = %i) "
916                             "when trying to open LLDB commands pipe\n",
917                     fds[WRITE], commands_data, static_cast<uint64_t>(commands_size), errno);
918         }
919         else if (static_cast<size_t>(nrwr) == commands_size)
920         {
921             // Close the write end of the pipe so when we give the read end to
922             // the debugger/command interpreter it will exit when it consumes all
923             // of the data
924 #ifdef _WIN32
925             _close(fds[WRITE]); fds[WRITE] = -1;
926 #else
927             close(fds[WRITE]); fds[WRITE] = -1;
928 #endif
929             // Now open the read file descriptor in a FILE * that we can give to
930             // the debugger as an input handle
931             commands_file = fdopen(fds[READ], "r");
932             if (commands_file)
933             {
934                 fds[READ] = -1; // The FILE * 'commands_file' now owns the read descriptor
935                 // Hand ownership if the FILE * over to the debugger for "commands_file".
936             }
937             else
938             {
939                 fprintf(stderr,
940                         "error: fdopen(%i, \"r\") failed (errno = %i) when "
941                         "trying to open LLDB commands pipe\n",
942                         fds[READ], errno);
943             }
944         }
945     }
946     else
947     {
948         fprintf(stderr, "error: can't create pipe file descriptors for LLDB commands\n");
949     }
950
951     return commands_file;
952 }
953
954 void
955 CleanupAfterCommandSourcing (int fds[2])
956 {
957      enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE
958
959    // Close any pipes that we still have ownership of
960     if ( fds[WRITE] != -1)
961     {
962 #ifdef _WIN32
963         _close(fds[WRITE]); fds[WRITE] = -1;
964 #else
965         close(fds[WRITE]); fds[WRITE] = -1;
966 #endif
967         
968     }
969
970     if ( fds[READ] != -1)
971     {
972 #ifdef _WIN32
973         _close(fds[READ]); fds[READ] = -1;
974 #else
975         close(fds[READ]); fds[READ] = -1;
976 #endif
977     }
978
979 }
980
981 std::string
982 EscapeString (std::string arg)
983 {
984     std::string::size_type pos = 0;
985     while ((pos = arg.find_first_of("\"\\", pos)) != std::string::npos)
986     {
987         arg.insert (pos, 1, '\\');
988         pos += 2;
989     }
990     return '"' + arg + '"';
991 }
992
993 void
994 Driver::MainLoop ()
995 {
996     if (::tcgetattr(STDIN_FILENO, &g_old_stdin_termios) == 0)
997     {
998         g_old_stdin_termios_is_valid = true;
999         atexit (reset_stdin_termios);
1000     }
1001
1002     ::setbuf (stdin, NULL);
1003     ::setbuf (stdout, NULL);
1004
1005     m_debugger.SetErrorFileHandle (stderr, false);
1006     m_debugger.SetOutputFileHandle (stdout, false);
1007     m_debugger.SetInputFileHandle (stdin, false); // Don't take ownership of STDIN yet...
1008
1009     m_debugger.SetUseExternalEditor(m_option_data.m_use_external_editor);
1010
1011     struct winsize window_size;
1012     if (isatty (STDIN_FILENO)
1013         && ::ioctl (STDIN_FILENO, TIOCGWINSZ, &window_size) == 0)
1014     {
1015         if (window_size.ws_col > 0)
1016             m_debugger.SetTerminalWidth (window_size.ws_col);
1017     }
1018
1019     SBCommandInterpreter sb_interpreter = m_debugger.GetCommandInterpreter();
1020     
1021     // Before we handle any options from the command line, we parse the
1022     // .lldbinit file in the user's home directory.
1023     SBCommandReturnObject result;
1024     sb_interpreter.SourceInitFileInHomeDirectory(result);
1025     if (GetDebugMode())
1026     {
1027         result.PutError (m_debugger.GetErrorFileHandle());
1028         result.PutOutput (m_debugger.GetOutputFileHandle());
1029     }
1030
1031     // Now we handle options we got from the command line
1032     SBStream commands_stream;
1033     
1034     // First source in the commands specified to be run before the file arguments are processed.
1035     WriteCommandsForSourcing(eCommandPlacementBeforeFile, commands_stream);
1036         
1037     const size_t num_args = m_option_data.m_args.size();
1038     if (num_args > 0)
1039     {
1040         char arch_name[64];
1041         if (m_debugger.GetDefaultArchitecture (arch_name, sizeof (arch_name)))
1042             commands_stream.Printf("target create --arch=%s %s", arch_name, EscapeString(m_option_data.m_args[0]).c_str());
1043         else
1044             commands_stream.Printf("target create %s", EscapeString(m_option_data.m_args[0]).c_str());
1045
1046         if (!m_option_data.m_core_file.empty())
1047         {
1048             commands_stream.Printf(" --core %s", EscapeString(m_option_data.m_core_file).c_str());
1049         }
1050         commands_stream.Printf("\n");
1051         
1052         if (num_args > 1)
1053         {
1054             commands_stream.Printf ("settings set -- target.run-args ");
1055             for (size_t arg_idx = 1; arg_idx < num_args; ++arg_idx)
1056                 commands_stream.Printf(" %s", EscapeString(m_option_data.m_args[arg_idx]).c_str());
1057             commands_stream.Printf("\n");
1058         }
1059     }
1060     else if (!m_option_data.m_core_file.empty())
1061     {
1062         commands_stream.Printf("target create --core %s\n", EscapeString(m_option_data.m_core_file).c_str());
1063     }
1064     else if (!m_option_data.m_process_name.empty())
1065     {
1066         commands_stream.Printf ("process attach --name %s", EscapeString(m_option_data.m_process_name).c_str());
1067         
1068         if (m_option_data.m_wait_for)
1069             commands_stream.Printf(" --waitfor");
1070
1071         commands_stream.Printf("\n");
1072
1073     }
1074     else if (LLDB_INVALID_PROCESS_ID != m_option_data.m_process_pid)
1075     {
1076         commands_stream.Printf ("process attach --pid %" PRIu64 "\n", m_option_data.m_process_pid);
1077     }
1078
1079     WriteCommandsForSourcing(eCommandPlacementAfterFile, commands_stream);
1080     
1081     if (GetDebugMode())
1082     {
1083         result.PutError(m_debugger.GetErrorFileHandle());
1084         result.PutOutput(m_debugger.GetOutputFileHandle());
1085     }
1086     
1087     bool handle_events = true;
1088     bool spawn_thread = false;
1089
1090     if (m_option_data.m_repl)
1091     {
1092         const char *repl_options = NULL;
1093         if (!m_option_data.m_repl_options.empty())
1094             repl_options = m_option_data.m_repl_options.c_str();
1095         SBError error (m_debugger.RunREPL(m_option_data.m_repl_lang, repl_options));
1096         if (error.Fail())
1097         {
1098             const char *error_cstr = error.GetCString();
1099             if (error_cstr && error_cstr[0])
1100                 fprintf (stderr, "error: %s\n", error_cstr);
1101             else
1102                 fprintf (stderr, "error: %u\n", error.GetError());
1103         }
1104     }
1105     else
1106     {
1107         // Check if we have any data in the commands stream, and if so, save it to a temp file
1108         // so we can then run the command interpreter using the file contents.
1109         const char *commands_data = commands_stream.GetData();
1110         const size_t commands_size = commands_stream.GetSize();
1111
1112         // The command file might have requested that we quit, this variable will track that.
1113         bool quit_requested = false;
1114         bool stopped_for_crash = false;
1115         if (commands_data && commands_size)
1116         {
1117             int initial_commands_fds[2];
1118             bool success = true;
1119             FILE *commands_file = PrepareCommandsForSourcing (commands_data, commands_size, initial_commands_fds);
1120             if (commands_file)
1121             {
1122                 m_debugger.SetInputFileHandle (commands_file, true);
1123
1124                 // Set the debugger into Sync mode when running the command file.  Otherwise command files
1125                 // that run the target won't run in a sensible way.
1126                 bool old_async = m_debugger.GetAsync();
1127                 m_debugger.SetAsync(false);
1128                 int num_errors;
1129                 
1130                 SBCommandInterpreterRunOptions options;
1131                 options.SetStopOnError (true);
1132                 if (m_option_data.m_batch)
1133                     options.SetStopOnCrash (true);
1134
1135                 m_debugger.RunCommandInterpreter(handle_events,
1136                                                  spawn_thread,
1137                                                  options,
1138                                                  num_errors,
1139                                                  quit_requested,
1140                                                  stopped_for_crash);
1141
1142                 if (m_option_data.m_batch && stopped_for_crash && !m_option_data.m_after_crash_commands.empty())
1143                 {
1144                     int crash_command_fds[2];
1145                     SBStream crash_commands_stream;
1146                     WriteCommandsForSourcing (eCommandPlacementAfterCrash, crash_commands_stream);
1147                     const char *crash_commands_data = crash_commands_stream.GetData();
1148                     const size_t crash_commands_size = crash_commands_stream.GetSize();
1149                     commands_file  = PrepareCommandsForSourcing (crash_commands_data, crash_commands_size, crash_command_fds);
1150                     if (commands_file)
1151                     {
1152                         bool local_quit_requested;
1153                         bool local_stopped_for_crash;
1154                         m_debugger.SetInputFileHandle (commands_file, true);
1155
1156                         m_debugger.RunCommandInterpreter(handle_events,
1157                                                          spawn_thread,
1158                                                          options,
1159                                                          num_errors,
1160                                                          local_quit_requested,
1161                                                          local_stopped_for_crash);
1162                         if (local_quit_requested)
1163                             quit_requested = true;
1164
1165                     }
1166                 }
1167                 m_debugger.SetAsync(old_async);
1168             }
1169             else
1170                 success = false;
1171
1172             // Close any pipes that we still have ownership of
1173             CleanupAfterCommandSourcing(initial_commands_fds);
1174
1175             // Something went wrong with command pipe
1176             if (!success)
1177             {
1178                 exit(1);
1179             }
1180
1181         }
1182
1183         // Now set the input file handle to STDIN and run the command
1184         // interpreter again in interactive mode and let the debugger
1185         // take ownership of stdin
1186
1187         bool go_interactive = true;
1188         if (quit_requested)
1189             go_interactive = false;
1190         else if (m_option_data.m_batch && !stopped_for_crash)
1191             go_interactive = false;
1192
1193         if (go_interactive)
1194         {
1195             m_debugger.SetInputFileHandle (stdin, true);
1196             m_debugger.RunCommandInterpreter(handle_events, spawn_thread);
1197         }
1198     }
1199     
1200     reset_stdin_termios();
1201     fclose (stdin);
1202     
1203     SBDebugger::Destroy (m_debugger);
1204 }
1205
1206
1207 void
1208 Driver::ResizeWindow (unsigned short col)
1209 {
1210     GetDebugger().SetTerminalWidth (col);
1211 }
1212
1213 void
1214 sigwinch_handler (int signo)
1215 {
1216     struct winsize window_size;
1217     if (isatty (STDIN_FILENO)
1218         && ::ioctl (STDIN_FILENO, TIOCGWINSZ, &window_size) == 0)
1219     {
1220         if ((window_size.ws_col > 0) && g_driver != NULL)
1221         {
1222             g_driver->ResizeWindow (window_size.ws_col);
1223         }
1224     }
1225 }
1226
1227 void
1228 sigint_handler (int signo)
1229 {
1230         static bool g_interrupt_sent = false;
1231     if (g_driver)
1232         {
1233                 if (!g_interrupt_sent)
1234                 {
1235                         g_interrupt_sent = true;
1236                 g_driver->GetDebugger().DispatchInputInterrupt();
1237                         g_interrupt_sent = false;
1238                         return;
1239                 }
1240         }
1241     
1242         exit (signo);
1243 }
1244
1245 void
1246 sigtstp_handler (int signo)
1247 {
1248     g_driver->GetDebugger().SaveInputTerminalState();
1249     signal (signo, SIG_DFL);
1250     kill (getpid(), signo);
1251     signal (signo, sigtstp_handler);
1252 }
1253
1254 void
1255 sigcont_handler (int signo)
1256 {
1257     g_driver->GetDebugger().RestoreInputTerminalState();
1258     signal (signo, SIG_DFL);
1259     kill (getpid(), signo);
1260     signal (signo, sigcont_handler);
1261 }
1262
1263 int
1264 main (int argc, char const *argv[], const char *envp[])
1265 {
1266 #ifdef _MSC_VER
1267         // disable buffering on windows
1268         setvbuf(stdout, NULL, _IONBF, 0);
1269         setvbuf(stdin , NULL, _IONBF, 0);
1270 #endif
1271
1272     SBDebugger::Initialize();
1273     
1274     SBHostOS::ThreadCreated ("<lldb.driver.main-thread>");
1275
1276     signal (SIGPIPE, SIG_IGN);
1277     signal (SIGWINCH, sigwinch_handler);
1278     signal (SIGINT, sigint_handler);
1279     signal (SIGTSTP, sigtstp_handler);
1280     signal (SIGCONT, sigcont_handler);
1281
1282     // Create a scope for driver so that the driver object will destroy itself
1283     // before SBDebugger::Terminate() is called.
1284     {
1285         Driver driver;
1286
1287         bool exiting = false;
1288         SBError error (driver.ParseArgs (argc, argv, stdout, exiting));
1289         if (error.Fail())
1290         {
1291             const char *error_cstr = error.GetCString ();
1292             if (error_cstr)
1293                 ::fprintf (stderr, "error: %s\n", error_cstr);
1294         }
1295         else if (!exiting)
1296         {
1297             driver.MainLoop ();
1298         }
1299     }
1300
1301     SBDebugger::Terminate();
1302     return 0;
1303 }