Added support for attaching to a remote debug server with the new command:
(lldb) process connect <remote-url>

Currently when you specify a file with the file command it helps us to find
a process plug-in that is suitable for debugging. If you specify a file you
can rely upon this to find the correct debugger plug-in:

% lldb a.out
Current executable set to 'a.out' (x86_64).
(lldb) process connect connect://localhost:2345
...

If you don't specify a file, you will need to specify the plug-in name that
you wish to use:

% lldb
(lldb) process connect --plugin process.gdb-remote connect://localhost:2345

Other connection URL examples:

(lldb) process connect connect://localhost:2345
(lldb) process connect tcp://127.0.0.1
(lldb) process connect file:///dev/ttyS1

We are currently treating the "connect://host:port" as a way to do raw socket
connections. If there is a URL for this already, please let me know and we
will adopt it.

So now you can connect to a remote debug server with the ProcessGDBRemote
plug-in. After connection, it will ask for the pid info using the "qC" packet
and if it responds with a valid process ID, it will be equivalent to attaching.
If it response with an error or invalid process ID, the LLDB process will be
in a new state: eStateConnected. This allows us to then download a program or
specify the program to run (using the 'A' packet), or specify a process to
attach to (using the "vAttach" packets), or query info about the processes
that might be available.




git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@124846 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Interpreter/CommandObject.cpp b/source/Interpreter/CommandObject.cpp
index df35ba9..e53b111 100644
--- a/source/Interpreter/CommandObject.cpp
+++ b/source/Interpreter/CommandObject.cpp
@@ -217,48 +217,49 @@
             args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
     }
 
-    Process *process = m_interpreter.GetDebugger().GetExecutionContext().process;
-    if (process == NULL)
+    if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
     {
-        if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
+        Process *process = m_interpreter.GetDebugger().GetExecutionContext().process;
+        if (process == NULL)
         {
             result.AppendError ("Process must exist.");
             result.SetStatus (eReturnStatusFailed);
             return false;
         }
-    }
-    else
-    {
-        StateType state = process->GetState();
-        
-        switch (state)
+        else
         {
-        
-        case eStateAttaching:
-        case eStateLaunching:
-        case eStateSuspended:
-        case eStateCrashed:
-        case eStateStopped:
-            break;
-        
-        case eStateDetached:
-        case eStateExited:
-        case eStateUnloaded:
-            if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
+            StateType state = process->GetState();
+            
+            switch (state)
             {
-                result.AppendError ("Process must be launched.");
-                result.SetStatus (eReturnStatusFailed);
-                return false;
-            }
-            break;
+            
+            case eStateSuspended:
+            case eStateCrashed:
+            case eStateStopped:
+                break;
+            
+            case eStateConnected:
+            case eStateAttaching:
+            case eStateLaunching:
+            case eStateDetached:
+            case eStateExited:
+            case eStateUnloaded:
+                if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
+                {
+                    result.AppendError ("Process must be launched.");
+                    result.SetStatus (eReturnStatusFailed);
+                    return false;
+                }
+                break;
 
-        case eStateRunning:
-        case eStateStepping:
-            if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused))
-            {
-                result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
-                result.SetStatus (eReturnStatusFailed);
-                return false;
+            case eStateRunning:
+            case eStateStepping:
+                if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused))
+                {
+                    result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
+                    result.SetStatus (eReturnStatusFailed);
+                    return false;
+                }
             }
         }
     }