[Lldb-commits] [lldb] r190734 - This changes how the --source driver argument works. I split this into four arguments:

Jim Ingham jingham at apple.com
Fri Sep 13 17:20:24 PDT 2013


Author: jingham
Date: Fri Sep 13 19:20:24 2013
New Revision: 190734

URL: http://llvm.org/viewvc/llvm-project?rev=190734&view=rev
Log:
This changes how the --source driver argument works.  I split this into four arguments:

-S : Specifies a command file which will get sourced after the ~/.lldbinit but before file arguments are processed
-O : Specifies a single (one-line) command that will get ditto

and

-s : Specifies a command file which will get sourced after `pwd`/.lldbinit
-o : Specifies a command file which ditto

I also changed it so that by default these sourced commands will print their command result, but there's a
-q option to change that if you wish.

Modified:
    lldb/trunk/tools/driver/Driver.cpp
    lldb/trunk/tools/driver/Driver.h

Modified: lldb/trunk/tools/driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=190734&r1=190733&r2=190734&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.cpp (original)
+++ lldb/trunk/tools/driver/Driver.cpp Fri Sep 13 19:20:24 2013
@@ -99,13 +99,21 @@ static OptionDefinition g_options[] =
         "extensions have been implemented." },
     { LLDB_3_TO_5,       false, "debug"          , 'd', no_argument      , 0,  eArgTypeNone,
         "Tells the debugger to print out extra information for debugging itself." },
+    { LLDB_3_TO_5,       false, "source-quietly"          , 'b', no_argument      , 0,  eArgTypeNone,
+        "Tells the debugger to print out extra information for debugging itself." },
     { LLDB_3_TO_5,       false, "source"         , 's', required_argument, 0,  eArgTypeFilename,
         "Tells the debugger to read in and execute the file <file>, which should contain lldb commands." },
+    { LLDB_3_TO_5,       false, "one-line"         , 'o', required_argument, 0,  eArgTypeNone,
+        "Tells the debugger to execute this one-line lldb command." },
+    { LLDB_3_TO_5,       false, "source-before-file"         , 'S', required_argument, 0,  eArgTypeFilename,
+        "Tells the debugger to read in and execute the file <file>, which should contain lldb commands." },
+    { LLDB_3_TO_5,       false, "one-line-before-file"         , 'O', required_argument, 0,  eArgTypeNone,
+        "Tells the debugger to execute this one-line lldb command." },
     { LLDB_3_TO_5,       false, "editor"         , 'e', no_argument      , 0,  eArgTypeNone,
         "Tells the debugger to open source files using the host's \"external editor\" mechanism." },
     { LLDB_3_TO_5,       false, "no-lldbinit"    , 'x', no_argument      , 0,  eArgTypeNone,
         "Do not automatically parse any '.lldbinit' files." },
-    { LLDB_3_TO_5,       false, "no-use-colors"  , 'o', no_argument      , 0,  eArgTypeNone,
+    { LLDB_3_TO_5,       false, "no-use-colors"  , 'X', no_argument      , 0,  eArgTypeNone,
         "Do not use colors." },
     { LLDB_OPT_SET_6,    true , "python-path"    , 'P', no_argument      , 0,  eArgTypeNone,
         "Prints out the path to the lldb.py file for this version of lldb." },
@@ -390,8 +398,10 @@ Driver::OptionData::OptionData () :
     m_script_lang (lldb::eScriptLanguageDefault),
     m_core_file (),
     m_crash_log (),
-    m_source_command_files (),
+    m_initial_commands (),
+    m_after_file_commands (),
     m_debug_mode (false),
+    m_source_quietly(false),
     m_print_version (false),
     m_print_python_path (false),
     m_print_help (false),
@@ -412,8 +422,10 @@ Driver::OptionData::Clear ()
 {
     m_args.clear ();
     m_script_lang = lldb::eScriptLanguageDefault;
-    m_source_command_files.clear ();
+    m_initial_commands.clear ();
+    m_after_file_commands.clear ();
     m_debug_mode = false;
+    m_source_quietly = false;
     m_print_help = false;
     m_print_version = false;
     m_print_python_path = false;
@@ -424,6 +436,34 @@ Driver::OptionData::Clear ()
 }
 
 void
+Driver::OptionData::AddInitialCommand (const char *command, bool before_file, bool is_file, SBError &error)
+{
+    std::vector<std::pair<bool, std::string> > *command_set;
+    if (before_file)
+        command_set = &(m_initial_commands);
+    else
+        command_set = &(m_after_file_commands);
+
+    if (is_file)
+    {
+        SBFileSpec file(command);
+        if (file.Exists())
+            command_set->push_back (std::pair<bool, std::string> (true, optarg));
+        else if (file.ResolveExecutableLocation())
+        {
+            char final_path[PATH_MAX];
+            file.GetPath (final_path, sizeof(final_path));
+            std::string path_str (final_path);
+            command_set->push_back (std::pair<bool, std::string> (true, path_str));
+        }
+        else
+            error.SetErrorStringWithFormat("file specified in --source (-s) option doesn't exist: '%s'", optarg);
+    }
+    else
+        command_set->push_back (std::pair<bool, std::string> (false, optarg));
+}
+
+void
 Driver::ResetOptionValues ()
 {
     m_option_data.Clear ();
@@ -451,18 +491,60 @@ Driver::GetScriptLanguage() const
     return m_option_data.m_script_lang;
 }
 
-size_t
-Driver::GetNumSourceCommandFiles () const
-{
-    return m_option_data.m_source_command_files.size();
-}
-
-const char *
-Driver::GetSourceCommandFileAtIndex (uint32_t idx) const
+void
+Driver::ExecuteInitialCommands (bool before_file)
 {
-    if (idx < m_option_data.m_source_command_files.size())
-        return m_option_data.m_source_command_files[idx].c_str();
-    return NULL;
+    size_t num_commands;
+    std::vector<std::pair<bool, std::string> > *command_set;
+    if (before_file)
+        command_set = &(m_option_data.m_initial_commands);
+    else
+        command_set = &(m_option_data.m_after_file_commands);
+    
+    num_commands = command_set->size();
+    SBCommandReturnObject result;
+    bool old_async = GetDebugger().GetAsync();
+    GetDebugger().SetAsync(false);
+    for (size_t idx = 0; idx < num_commands; idx++)
+    {
+        bool is_file = (*command_set)[idx].first;
+        const char *command = (*command_set)[idx].second.c_str();
+        char command_string[PATH_MAX * 2];
+        const bool dump_stream_only_if_no_immediate = true;
+        const char *executed_command = command;
+        if (is_file)
+        {
+            ::snprintf (command_string, sizeof(command_string), "command source '%s'", command);
+            executed_command = command_string;
+        }
+        
+        m_debugger.GetCommandInterpreter().HandleCommand (executed_command, result, false);
+        if (!m_option_data.m_source_quietly || result.Succeeded() == false)
+        {
+            const size_t output_size = result.GetOutputSize();
+            if (output_size > 0)
+                m_io_channel_ap->OutWrite (result.GetOutput(dump_stream_only_if_no_immediate), output_size, NO_ASYNC);
+            const size_t error_size = result.GetErrorSize();
+            if (error_size > 0)
+                m_io_channel_ap->OutWrite (result.GetError(dump_stream_only_if_no_immediate), error_size, NO_ASYNC);
+        }
+        
+        if (result.Succeeded() == false)
+        {
+            char error_buffer[1024];
+            size_t error_size;
+            const char *type = before_file ? "before file" : "after_file";
+            if (is_file)
+                error_size = ::snprintf(error_buffer, sizeof(error_buffer), "Aborting %s command execution, command file: '%s' failed.\n", type, command);
+            else
+                error_size = ::snprintf(error_buffer, sizeof(error_buffer), "Aborting %s command execution, command: '%s' failed.\n", type, command);
+            
+            m_io_channel_ap->OutWrite(error_buffer, error_size, NO_ASYNC);
+            break;
+        }
+        result.Clear();
+    }
+    GetDebugger().SetAsync(old_async);
 }
 
 bool
@@ -623,7 +705,7 @@ Driver::ParseArgs (int argc, const char
                         m_debugger.SkipAppInitFiles (true);
                         break;
 
-                    case 'o':
+                    case 'X':
                         m_debugger.SetUseColor (false);
                         break;
 
@@ -658,6 +740,10 @@ Driver::ParseArgs (int argc, const char
                         m_option_data.m_debug_mode = true;
                         break;
 
+                    case 'q':
+                        m_option_data.m_source_quietly = true;
+                        break;
+
                     case 'n':
                         m_option_data.m_process_name = optarg;
                         break;
@@ -676,22 +762,17 @@ Driver::ParseArgs (int argc, const char
                         }
                         break;
                     case 's':
-                        {
-                            SBFileSpec file(optarg);
-                            if (file.Exists())
-                                m_option_data.m_source_command_files.push_back (optarg);
-                            else if (file.ResolveExecutableLocation())
-                            {
-                                char final_path[PATH_MAX];
-                                file.GetPath (final_path, sizeof(final_path));
-                                std::string path_str (final_path);
-                                m_option_data.m_source_command_files.push_back (path_str);
-                            }
-                            else
-                                error.SetErrorStringWithFormat("file specified in --source (-s) option doesn't exist: '%s'", optarg);
-                        }
+                        m_option_data.AddInitialCommand(optarg, false, true, error);
+                        break;
+                    case 'o':
+                        m_option_data.AddInitialCommand(optarg, false, false, error);
+                        break;
+                    case 'S':
+                        m_option_data.AddInitialCommand(optarg, true, true, error);
+                        break;
+                    case 'O':
+                        m_option_data.AddInitialCommand(optarg, true, false, error);
                         break;
-
                     default:
                         m_option_data.m_print_help = true;
                         error.SetErrorStringWithFormat ("unrecognized option %c", short_option);
@@ -1400,42 +1481,15 @@ Driver::MainLoop ()
             }
 
             // Now we handle options we got from the command line
-            char command_string[PATH_MAX * 2];
-            const size_t num_source_command_files = GetNumSourceCommandFiles();
-            const bool dump_stream_only_if_no_immediate = true;
-            if (num_source_command_files > 0)
-            {
-                for (size_t i=0; i < num_source_command_files; ++i)
-                {
-                    const char *command_file = GetSourceCommandFileAtIndex(i);
-                    ::snprintf (command_string, sizeof(command_string), "command source '%s'", command_file);
-                    m_debugger.GetCommandInterpreter().HandleCommand (command_string, result, false);
-                    if (GetDebugMode())
-                    {
-                        result.PutError (m_debugger.GetErrorFileHandle());
-                        result.PutOutput (m_debugger.GetOutputFileHandle());
-                    }
-                    
-                    // if the command sourcing generated an error - dump the result object
-                    if (result.Succeeded() == false)
-                    {
-                        const size_t output_size = result.GetOutputSize();
-                        if (output_size > 0)
-                            m_io_channel_ap->OutWrite (result.GetOutput(dump_stream_only_if_no_immediate), output_size, NO_ASYNC);
-                        const size_t error_size = result.GetErrorSize();
-                        if (error_size > 0)
-                            m_io_channel_ap->OutWrite (result.GetError(dump_stream_only_if_no_immediate), error_size, NO_ASYNC);
-                    }
-                    
-                    result.Clear();
-                }
-            }
-
+            // First source in the commands specified to be run before the file arguments are processed.
+            ExecuteInitialCommands(true);
+            
             // Was there a core file specified?
             std::string core_file_spec("");
             if (!m_option_data.m_core_file.empty())
                 core_file_spec.append("--core ").append(m_option_data.m_core_file);
 
+            char command_string[PATH_MAX * 2];
             const size_t num_args = m_option_data.m_args.size();
             if (num_args > 0)
             {
@@ -1487,6 +1541,9 @@ Driver::MainLoop ()
                 result.PutError(m_debugger.GetErrorFileHandle());
                 result.PutOutput(m_debugger.GetOutputFileHandle());
             }
+            
+            // Now execute the commands specified for after the file arguments are processed.
+            ExecuteInitialCommands(false);
 
             SBEvent event;
 

Modified: lldb/trunk/tools/driver/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.h?rev=190734&r1=190733&r2=190734&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.h (original)
+++ lldb/trunk/tools/driver/Driver.h Fri Sep 13 19:20:24 2013
@@ -83,12 +83,9 @@ public:
     lldb::ScriptLanguage
     GetScriptLanguage() const;
 
-    size_t
-    GetNumSourceCommandFiles () const;
-
-    const char *
-    GetSourceCommandFileAtIndex (uint32_t idx) const;
-
+    void
+    ExecuteInitialCommands (bool before_file);
+    
     bool
     GetDebugMode() const;
 
@@ -102,14 +99,19 @@ public:
         void
         Clear();
 
+        void
+        AddInitialCommand (const char *command, bool before_file, bool is_file, lldb::SBError &error);
+    
         //static OptionDefinition m_cmd_option_table[];
 
         std::vector<std::string> m_args;
         lldb::ScriptLanguage m_script_lang;
         std::string m_core_file;
         std::string m_crash_log;
-        std::vector<std::string> m_source_command_files;
+        std::vector<std::pair<bool,std::string> > m_initial_commands;
+        std::vector<std::pair<bool,std::string> > m_after_file_commands;
         bool m_debug_mode;
+        bool m_source_quietly;
         bool m_print_version;
         bool m_print_python_path;
         bool m_print_help;





More information about the lldb-commits mailing list