[Lldb-commits] [lldb] r154233 - in /lldb/branches/lldb-platform-work: include/lldb/Core/ include/lldb/Host/ include/lldb/Target/ lldb.xcodeproj/ source/Commands/ source/Core/ source/Host/common/ source/Host/macosx/ source/Plugins/Platform/MacOSX/ sour

Enrico Granata egranata at apple.com
Mon Apr 9 14:53:45 PDT 2012


> Author: enrico
> Date: Mon Apr  9 16:43:43 2012
> New Revision: 154345
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=154345&view=rev
> Log:
> Patch by Viktor Kutuzov <vkutuzov at accesssoftek.com> to replace an #import directive with a FreeBSD-friendly #include one

Here it goes. Thanks :-)

Enrico Granata
✉ egranata@.com
✆ (four oh eight) 862-7683

On Apr 9, 2012, at 2:34 PM, Viktor Kutuzov wrote:

> Hello Enrico,
> 
> would you replace an import statement with #include in GDBRemoteCommunicationServer.cpp like in the attached patch? The current #import statement causes a heap of the errors on the FreeBSD systems.
> 
> Thanks.
> Viktor.
> 
> -----Original Message-----
> From: lldb-commits-bounces at cs.uiuc.edu [mailto:lldb-commits-bounces at cs.uiuc.edu] On Behalf Of Enrico Granata
> Sent: Friday, April 06, 2012 5:04 PM
> To: lldb-commits at cs.uiuc.edu
> Subject: [Lldb-commits] [lldb] r154233 - in /lldb/branches/lldb-platform-work: include/lldb/Core/ include/lldb/Host/ include/lldb/Target/ lldb.xcodeproj/ source/Commands/ source/Core/ source/Host/common/ source/Host/macosx/ source/Plugins/Platform/MacOSX/ sourc...
> 
> Author: enrico
> Date: Fri Apr  6 19:03:47 2012
> New Revision: 154233
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=154233&view=rev
> Log:
> Initial checkin of new platform functionality
> The local and remote mac platforms now have capabilities to:
> - spawn a process, wait for it to exit, and return its exit code
> - create a new directory given its path
> - open, read, write and close a file given its path
> This allow some basic remote process running and I/O through lldb-platform
> This is an initial checkin, the design and implementation of the features are not final and expected to evolve over time
> Where possible and reasonable, I have used the standard commands from the GDB remote protocol. In some cases, there are new commands defined that extend the protocol.
> If any of these really do exist in GDB remote itself, feel free to point me at them.
> 
> Added:
>    lldb/branches/lldb-platform-work/include/lldb/Core/StreamGDBRemote.h
>    lldb/branches/lldb-platform-work/source/Core/StreamGDBRemote.cpp
> Modified:
>    lldb/branches/lldb-platform-work/include/lldb/Core/Stream.h
>    lldb/branches/lldb-platform-work/include/lldb/Host/Host.h
>    lldb/branches/lldb-platform-work/include/lldb/Target/Platform.h
>    lldb/branches/lldb-platform-work/lldb.xcodeproj/project.pbxproj
>    lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp
>    lldb/branches/lldb-platform-work/source/Host/common/Host.cpp
>    lldb/branches/lldb-platform-work/source/Host/macosx/Host.mm
>    lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
>    lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
>    lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
>    lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
>    lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
>    lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
>    lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp
>    lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
>    lldb/branches/lldb-platform-work/source/Target/Platform.cpp
>    lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.cpp
>    lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.h
>    lldb/branches/lldb-platform-work/tools/lldb-platform/lldb-platform.cpp
> 
> Modified: lldb/branches/lldb-platform-work/include/lldb/Core/Stream.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Core/Stream.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/include/lldb/Core/Stream.h (original)
> +++ lldb/branches/lldb-platform-work/include/lldb/Core/Stream.h Fri Apr  6 19:03:47 2012
> @@ -590,7 +590,7 @@
>     static void
>     UnitTest(Stream *s);
> 
> -private:
> +protected:
>     //------------------------------------------------------------------
>     // Member variables
>     //------------------------------------------------------------------
> 
> Added: lldb/branches/lldb-platform-work/include/lldb/Core/StreamGDBRemote.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Core/StreamGDBRemote.h?rev=154233&view=auto
> ==============================================================================
> --- lldb/branches/lldb-platform-work/include/lldb/Core/StreamGDBRemote.h (added)
> +++ lldb/branches/lldb-platform-work/include/lldb/Core/StreamGDBRemote.h Fri Apr  6 19:03:47 2012
> @@ -0,0 +1,54 @@
> +//===-- StreamGDBRemote.h ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef liblldb_StreamGDBRemote_h_
> +#define liblldb_StreamGDBRemote_h_
> +
> +// C Includes
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +// Project includes
> +
> +#include "lldb/Core/StreamString.h"
> +
> +namespace lldb_private {
> +
> +    class StreamGDBRemote : public StreamString
> +    {
> +        public:
> +        StreamGDBRemote ();
> +
> +        StreamGDBRemote (uint32_t flags,
> +                         uint32_t addr_size,
> +                         lldb::ByteOrder byte_order);
> +
> +        virtual
> +        ~StreamGDBRemote ();
> +
> +        //------------------------------------------------------------------
> +        /// Output a block of data to the stream performing GDB-remote escaping.
> +        ///
> +        /// @param[in] s
> +        ///     A block of data.
> +        ///
> +        /// @param[in] src_len
> +        ///     The amount of data to write.
> +        ///
> +        /// @return
> +        ///     Number of bytes written.
> +        //------------------------------------------------------------------
> +        int
> +        PutEscapedBytes (const void* s,
> +                         size_t src_len);
> +    };
> +
> +} // namespace lldb_private
> +
> +#endif  // liblldb_StreamGDBRemote_h_
> 
> Modified: lldb/branches/lldb-platform-work/include/lldb/Host/Host.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Host/Host.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/include/lldb/Host/Host.h (original)
> +++ lldb/branches/lldb-platform-work/include/lldb/Host/Host.h Fri Apr  6 19:03:47 2012
> @@ -438,6 +438,26 @@
>     DynamicLibraryGetSymbol (void *dynamic_library_handle,
>                              const char *symbol_name,
>                              Error &error);
> +
> +    static uint32_t
> +    RunProgramAndGetExitCode (const FileSpec& file_spec);
> +
> +    static uint32_t
> +    MakeDirectory (const char* path, mode_t mode);
> +
> +    static uint32_t
> +    OpenFile (const FileSpec& file_spec,
> +              uint32_t flags,
> +              mode_t mode);
> +
> +    static bool
> +    CloseFile (uint32_t fd);
> +
> +    static uint32_t
> +    WriteFile (uint32_t fd, uint64_t offset, void* data, size_t data_len);
> +
> +    static uint32_t
> +    ReadFile (uint32_t fd, uint64_t offset, void* data_ptr, size_t len_wanted);
> };
> 
> } // namespace lldb_private
> 
> Modified: lldb/branches/lldb-platform-work/include/lldb/Target/Platform.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/include/lldb/Target/Platform.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/include/lldb/Target/Platform.h (original)
> +++ lldb/branches/lldb-platform-work/include/lldb/Target/Platform.h Fri Apr  6 19:03:47 2012
> @@ -449,6 +449,53 @@
>         {
>             return false;
>         }
> +
> +        virtual uint32_t
> +        RunShellCommand (const std::string &command_line)
> +        {
> +            return UINT32_MAX;
> +        }
> +
> +        virtual uint32_t
> +        MakeDirectory (const std::string &path,
> +                       mode_t mode)
> +        {
> +            return UINT32_MAX;
> +        }
> +
> +        virtual uint32_t
> +        OpenFile (const FileSpec& file_spec,
> +                  uint32_t flags,
> +                  mode_t mode)
> +        {
> +            return UINT32_MAX;
> +        }
> +
> +        virtual bool
> +        CloseFile (uint32_t fd)
> +        {
> +            return false;
> +        }
> +
> +        virtual uint32_t
> +        ReadFile (uint32_t fd, uint64_t offset,
> +                  void *data_ptr, size_t len)
> +        {
> +            return UINT32_MAX;
> +        }
> +
> +        virtual uint32_t
> +        WriteFile (uint32_t fd, uint64_t offset,
> +                   void* data, size_t len)
> +        {
> +            return UINT32_MAX;
> +        }
> +
> +        virtual Error
> +        PutFile (const FileSpec& source,
> +                 const FileSpec& destination,
> +                 uint32_t uid = UINT32_MAX,
> +                 uint32_t gid = UINT32_MAX);
> 
>     protected:
>         bool m_is_host;
> 
> Modified: lldb/branches/lldb-platform-work/lldb.xcodeproj/project.pbxproj
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/lldb.xcodeproj/project.pbxproj?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/lldb.xcodeproj/project.pbxproj (original)
> +++ lldb/branches/lldb-platform-work/lldb.xcodeproj/project.pbxproj Fri Apr  6 19:03:47 2012
> @@ -469,6 +469,8 @@
>                941BCC8214E48C4000BB969C /* SBTypeSynthetic.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568914E355F2003A195C /* SBTypeSynthetic.h */; settings = {ATTRIBUTES = (Public, ); }; };
>                9443B122140C18C40013457C /* SBData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9443B121140C18C10013457C /* SBData.cpp */; };
>                9443B123140C26AB0013457C /* SBData.h in Headers */ = {isa = PBXBuildFile; fileRef = 9443B120140C18A90013457C /* SBData.h */; settings = {ATTRIBUTES = (Public, ); }; };
> +               945E8D7E152F6AA80019BCCD /* StreamGDBRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 945E8D7D152F6AA80019BCCD /* StreamGDBRemote.h */; };
> +               945E8D80152F6AB40019BCCD /* StreamGDBRemote.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 945E8D7F152F6AB40019BCCD /* StreamGDBRemote.cpp */; };
>                94611EB213CCA4A4003A22AF /* RefCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94611EB113CCA4A4003A22AF /* RefCounter.cpp */; };
>                9461569A14E358A6003A195C /* SBTypeFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9461568A14E35621003A195C /* SBTypeFilter.cpp */; };
>                9461569B14E358A6003A195C /* SBTypeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9461568B14E35621003A195C /* SBTypeFormat.cpp */; };
> @@ -483,6 +485,7 @@
>                9475C18F14E5F858001BFC6D /* SBTypeNameSpecifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 9475C18C14E5F826001BFC6D /* SBTypeNameSpecifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
>                949ADF031406F648004833E1 /* ValueObjectConstResultImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 949ADF021406F648004833E1 /* ValueObjectConstResultImpl.cpp */; };
>                94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */; };
> +               94E829CA152D33C1006F96A3 /* lldb-platform in Resources */ = {isa = PBXBuildFile; fileRef = 26DC6A101337FE6900FF7998 /* lldb-platform */; };
>                94FA3DE01405D50400833217 /* ValueObjectConstResultChild.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FA3DDF1405D50300833217 /* ValueObjectConstResultChild.cpp */; };
>                9A19A6AF1163BBB200E0D453 /* SBValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A19A6A51163BB7E00E0D453 /* SBValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
>                9A19A6B01163BBB300E0D453 /* SBValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A19A6AD1163BB9800E0D453 /* SBValue.cpp */; };
> @@ -630,6 +633,13 @@
>                        remoteGlobalIDString = 26DC6A0F1337FE6900FF7998;
>                        remoteInfo = "lldb-platform";
>                };
> +               94E829C8152D33B4006F96A3 /* PBXContainerItemProxy */ = {
> +                       isa = PBXContainerItemProxy;
> +                       containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
> +                       proxyType = 1;
> +                       remoteGlobalIDString = 26DC6A0F1337FE6900FF7998;
> +                       remoteInfo = "lldb-platform";
> +               };
> /* End PBXContainerItemProxy section */
> 
> /* Begin PBXCopyFilesBuildPhase section */
> @@ -1409,6 +1419,8 @@
>                9415F61713B2C0EF00A52B36 /* FormatManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = FormatManager.cpp; path = source/Core/FormatManager.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
>                9443B120140C18A90013457C /* SBData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBData.h; path = include/lldb/API/SBData.h; sourceTree = "<group>"; };
>                9443B121140C18C10013457C /* SBData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBData.cpp; path = source/API/SBData.cpp; sourceTree = "<group>"; };
> +               945E8D7D152F6AA80019BCCD /* StreamGDBRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StreamGDBRemote.h; path = include/lldb/Core/StreamGDBRemote.h; sourceTree = "<group>"; };
> +               945E8D7F152F6AB40019BCCD /* StreamGDBRemote.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StreamGDBRemote.cpp; path = source/Core/StreamGDBRemote.cpp; sourceTree = "<group>"; };
>                94611EAF13CCA363003A22AF /* RefCounter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RefCounter.h; path = include/lldb/Utility/RefCounter.h; sourceTree = "<group>"; };
>                94611EB113CCA4A4003A22AF /* RefCounter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RefCounter.cpp; path = source/Utility/RefCounter.cpp; sourceTree = "<group>"; };
>                9461568614E355F2003A195C /* SBTypeFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBTypeFilter.h; path = include/lldb/API/SBTypeFilter.h; sourceTree = "<group>"; };
> @@ -2419,6 +2431,8 @@
>                                4C6649A214EEE81000B0316F /* StreamCallback.cpp */,
>                                26BC7D7A10F1B77400F91463 /* StreamFile.h */,
>                                26BC7E9210F1B85900F91463 /* StreamFile.cpp */,
> +                               945E8D7D152F6AA80019BCCD /* StreamGDBRemote.h */,
> +                               945E8D7F152F6AB40019BCCD /* StreamGDBRemote.cpp */,
>                                26BC7D7B10F1B77400F91463 /* StreamString.h */,
>                                26BC7E9310F1B85900F91463 /* StreamString.cpp */,
>                                4C626533130F1B0A00C889F6 /* StreamTee.h */,
> @@ -3257,7 +3271,7 @@
>                        buildRules = (
>                        );
>                        dependencies = (
> -                               B2FA4F83152FBAF2005535AB /* PBXTargetDependency */,
> +                               94E829C9152D33B4006F96A3 /* PBXTargetDependency */,
>                                2689011513353E9B00698AC0 /* PBXTargetDependency */,
>                                262CFC7211A450CB00946C6C /* PBXTargetDependency */,
>                                26368AF6126B95FA00E8659F /* PBXTargetDependency */,
> @@ -3409,7 +3423,7 @@
>                        isa = PBXResourcesBuildPhase;
>                        buildActionMask = 2147483647;
>                        files = (
> -                               B2FA4F84152FBB0F005535AB /* lldb-platform in Resources */,
> +                               94E829CA152D33C1006F96A3 /* lldb-platform in Resources */,
>                                262CFC7711A4510000946C6C /* debugserver in Resources */,
>                                26368AF7126B960500E8659F /* darwin-debug in Resources */,
>                        );
> @@ -3917,6 +3931,7 @@
>                                26FFC19D14FC072100087D58 /* DynamicLoaderPOSIXDYLD.cpp in Sources */,
>                                2694E99D14FC0BB30076DE67 /* PlatformFreeBSD.cpp in Sources */,
>                                2694E9A414FC0BBD0076DE67 /* PlatformLinux.cpp in Sources */,
> +                               945E8D80152F6AB40019BCCD /* StreamGDBRemote.cpp in Sources */,
>                        );
>                        runOnlyForDeploymentPostprocessing = 0;
>                };
> @@ -4029,6 +4044,11 @@
>                        target = 26DC6A0F1337FE6900FF7998 /* lldb-platform */;
>                        targetProxy = B2FA4F82152FBAF2005535AB /* PBXContainerItemProxy */;
>                };
> +               94E829C9152D33B4006F96A3 /* PBXTargetDependency */ = {
> +                       isa = PBXTargetDependency;
> +                       target = 26DC6A0F1337FE6900FF7998 /* lldb-platform */;
> +                       targetProxy = 94E829C8152D33B4006F96A3 /* PBXContainerItemProxy */;
> +               };
> /* End PBXTargetDependency section */
> 
> /* Begin XCBuildConfiguration section */
> 
> Modified: lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Commands/CommandObjectPlatform.cpp Fri Apr  6 19:03:47 2012
> @@ -218,6 +218,416 @@
> };
> 
> //----------------------------------------------------------------------
> +// "platform shell"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformShell : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformShell (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform shell",
> +                   "Run a shell command on the currently selected platform.",
> +                   NULL,
> +                   0)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformShell ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t retcode = platform_sp->RunShellCommand(cmd_line);
> +            result.AppendMessageWithFormat("Status = %d\n",retcode);
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +};
> +
> +//----------------------------------------------------------------------
> +// "platform mkdir"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformMkDir : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformMkDir (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform shell",
> +                   "Make a new directory on the remote end.",
> +                   NULL,
> +                   0)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformMkDir ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t retcode = platform_sp->MakeDirectory(cmd_line,0000700 | 0000070 | 0000007);
> +            result.AppendMessageWithFormat("Status = %d\n",retcode);
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +};
> +
> +//----------------------------------------------------------------------
> +// "platform fopen"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformFOpen : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformFOpen (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform fopen",
> +                   "Open a file on the remote end.",
> +                   NULL,
> +                   0)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformFOpen ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t retcode = platform_sp->OpenFile(FileSpec(cmd_line.c_str(),false),0x0200 | 0x0002, 0000700 | 0000070 | 0000007);
> +            result.AppendMessageWithFormat("Status = %d\n",retcode);
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +};
> +
> +//----------------------------------------------------------------------
> +// "platform fclose"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformFClose : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformFClose (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform fclose",
> +                   "Close a file on the remote end.",
> +                   NULL,
> +                   0)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformFClose ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t fd = ::atoi(cmd_line.c_str());
> +            uint32_t retcode = platform_sp->CloseFile(fd);
> +            result.AppendMessageWithFormat("Status = %d\n",retcode);
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +};
> +
> +//----------------------------------------------------------------------
> +// "platform fread"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformFRead : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformFRead (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform fread",
> +                   "Read data from a file on the remote end.",
> +                   NULL,
> +                   0),
> +    m_options (interpreter)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformFRead ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t fd = ::atoi(cmd_line.c_str());
> +            std::string buffer(m_options.m_count,' ');
> +            uint32_t retcode = platform_sp->ReadFile(fd, m_options.m_offset, &buffer[0], m_options.m_count);
> +            result.AppendMessageWithFormat("Return = %d\n",retcode);
> +            result.AppendMessageWithFormat("Data = %s\n",buffer.c_str());
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +    virtual Options *
> +    GetOptions ()
> +    {
> +        return &m_options;
> +    }
> +
> +protected:
> +    class CommandOptions : public Options
> +    {
> +    public:
> +
> +        CommandOptions (CommandInterpreter &interpreter) :
> +        Options (interpreter)
> +        {
> +        }
> +
> +        virtual
> +        ~CommandOptions ()
> +        {
> +        }
> +
> +        virtual Error
> +        SetOptionValue (uint32_t option_idx, const char *option_arg)
> +        {
> +            Error error;
> +            char short_option = (char) m_getopt_table[option_idx].val;
> +            bool success = false;
> +
> +            switch (short_option)
> +            {
> +                case 'o':
> +                    m_offset = Args::StringToUInt32(option_arg, 0, 0, &success);
> +                    if (!success)
> +                        error.SetErrorStringWithFormat("invalid offset: '%s'", option_arg);
> +                    break;
> +                case 'c':
> +                    m_count = Args::StringToUInt32(option_arg, 0, 0, &success);
> +                    if (!success)
> +                        error.SetErrorStringWithFormat("invalid offset: '%s'", option_arg);
> +                    break;
> +
> +                default:
> +                    error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
> +                    break;
> +            }
> +
> +            return error;
> +        }
> +
> +        void
> +        OptionParsingStarting ()
> +        {
> +            m_offset = 0;
> +            m_count = 1;
> +        }
> +
> +        const OptionDefinition*
> +        GetDefinitions ()
> +        {
> +            return g_option_table;
> +        }
> +
> +        // Options table: Required for subclasses of Options.
> +
> +        static OptionDefinition g_option_table[];
> +
> +        // Instance variables to hold the values for command options.
> +
> +        uint32_t m_offset;
> +        uint32_t m_count;
> +    };
> +    CommandOptions m_options;
> +};
> +OptionDefinition
> +CommandObjectPlatformFRead::CommandOptions::g_option_table[] =
> +{
> +    {   LLDB_OPT_SET_1, false, "offset"           , 'o', required_argument, NULL, 0, eArgTypeIndex        , "Offset into the file at which to start reading." },
> +    {   LLDB_OPT_SET_1, false, "count"            , 'c', required_argument, NULL, 0, eArgTypeCount        , "Number of bytes to read from the file." },
> +    {  0              , false, NULL               ,  0 , 0                , NULL, 0, eArgTypeNone         , NULL }
> +};
> +
> +
> +//----------------------------------------------------------------------
> +// "platform fread"
> +//----------------------------------------------------------------------
> +class CommandObjectPlatformFWrite : public CommandObject
> +{
> +public:
> +    CommandObjectPlatformFWrite (CommandInterpreter &interpreter) :
> +    CommandObject (interpreter,
> +                   "platform fwrite",
> +                   "Write data to a file on the remote end.",
> +                   NULL,
> +                   0),
> +    m_options (interpreter)
> +    {
> +    }
> +
> +    virtual
> +    ~CommandObjectPlatformFWrite ()
> +    {
> +    }
> +
> +    virtual bool
> +    Execute (Args& args, CommandReturnObject &result)
> +    {
> +        PlatformSP platform_sp (m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform());
> +        if (platform_sp)
> +        {
> +            std::string cmd_line;
> +            args.GetCommandString(cmd_line);
> +            uint32_t fd = ::atoi(cmd_line.c_str());
> +            uint32_t retcode = platform_sp->WriteFile(fd, m_options.m_offset, &m_options.m_data[0], m_options.m_data.size());
> +            result.AppendMessageWithFormat("Return = %d\n",retcode);
> +            result.SetStatus (eReturnStatusSuccessFinishResult);
> +        }
> +        else
> +        {
> +            result.AppendError ("no platform currently selected\n");
> +            result.SetStatus (eReturnStatusFailed);
> +        }
> +        return result.Succeeded();
> +    }
> +    virtual Options *
> +    GetOptions ()
> +    {
> +        return &m_options;
> +    }
> +
> +protected:
> +    class CommandOptions : public Options
> +    {
> +    public:
> +
> +        CommandOptions (CommandInterpreter &interpreter) :
> +        Options (interpreter)
> +        {
> +        }
> +
> +        virtual
> +        ~CommandOptions ()
> +        {
> +        }
> +
> +        virtual Error
> +        SetOptionValue (uint32_t option_idx, const char *option_arg)
> +        {
> +            Error error;
> +            char short_option = (char) m_getopt_table[option_idx].val;
> +            bool success = false;
> +
> +            switch (short_option)
> +            {
> +                case 'o':
> +                    m_offset = Args::StringToUInt32(option_arg, 0, 0, &success);
> +                    if (!success)
> +                        error.SetErrorStringWithFormat("invalid offset: '%s'", option_arg);
> +                    break;
> +                case 's':
> +                    m_data.assign(option_arg);
> +                    break;
> +
> +                default:
> +                    error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
> +                    break;
> +            }
> +
> +            return error;
> +        }
> +
> +        void
> +        OptionParsingStarting ()
> +        {
> +            m_offset = 0;
> +            m_data.clear();
> +        }
> +
> +        const OptionDefinition*
> +        GetDefinitions ()
> +        {
> +            return g_option_table;
> +        }
> +
> +        // Options table: Required for subclasses of Options.
> +
> +        static OptionDefinition g_option_table[];
> +
> +        // Instance variables to hold the values for command options.
> +
> +        uint32_t m_offset;
> +        std::string m_data;
> +    };
> +    CommandOptions m_options;
> +};
> +OptionDefinition
> +CommandObjectPlatformFWrite::CommandOptions::g_option_table[] =
> +{
> +    {   LLDB_OPT_SET_1, false, "offset"           , 'o', required_argument, NULL, 0, eArgTypeIndex        , "Offset into the file at which to start reading." },
> +    {   LLDB_OPT_SET_1, false, "data"            , 'd', required_argument, NULL, 0, eArgTypeValue        , "Text to write to the file." },
> +    {  0              , false, NULL               ,  0 , 0                , NULL, 0, eArgTypeNone         , NULL }
> +};
> +
> +//----------------------------------------------------------------------
> // "platform connect <connect-url>"
> //----------------------------------------------------------------------
> class CommandObjectPlatformConnect : public CommandObject
> @@ -885,6 +1295,14 @@
>     LoadSubCommand ("connect", CommandObjectSP (new CommandObjectPlatformConnect  (interpreter)));
>     LoadSubCommand ("disconnect", CommandObjectSP (new CommandObjectPlatformDisconnect  (interpreter)));
>     LoadSubCommand ("process", CommandObjectSP (new CommandObjectPlatformProcess  (interpreter)));
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    LoadSubCommand ("shell", CommandObjectSP (new CommandObjectPlatformShell  (interpreter)));
> +    LoadSubCommand ("mkdir", CommandObjectSP (new CommandObjectPlatformMkDir  (interpreter)));
> +    LoadSubCommand ("fopen", CommandObjectSP (new CommandObjectPlatformFOpen  (interpreter)));
> +    LoadSubCommand ("fclose", CommandObjectSP (new CommandObjectPlatformFClose  (interpreter)));
> +    LoadSubCommand ("fread", CommandObjectSP (new CommandObjectPlatformFRead  (interpreter)));
> +    LoadSubCommand ("fwrite", CommandObjectSP (new CommandObjectPlatformFWrite  (interpreter)));
> +#endif
> }
> 
> 
> 
> Added: lldb/branches/lldb-platform-work/source/Core/StreamGDBRemote.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Core/StreamGDBRemote.cpp?rev=154233&view=auto
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Core/StreamGDBRemote.cpp (added)
> +++ lldb/branches/lldb-platform-work/source/Core/StreamGDBRemote.cpp Fri Apr  6 19:03:47 2012
> @@ -0,0 +1,54 @@
> +//===-- StreamGDBRemote.cpp -------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "lldb/Core/StreamGDBRemote.h"
> +#include <stdio.h>
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +StreamGDBRemote::StreamGDBRemote () :
> +StreamString ()
> +{
> +}
> +
> +StreamGDBRemote::StreamGDBRemote(uint32_t flags, uint32_t addr_size, ByteOrder byte_order) :
> +StreamString (flags, addr_size, byte_order)
> +{
> +}
> +
> +StreamGDBRemote::~StreamGDBRemote()
> +{
> +}
> +
> +
> +int
> +StreamGDBRemote::PutEscapedBytes (const void* s,
> +                                  size_t src_len)
> +{
> +    int bytes_written = 0;
> +    const uint8_t *src = (const uint8_t *)s;
> +    bool binary_is_set = m_flags.Test(eBinary);
> +    m_flags.Clear(eBinary);
> +    while (src_len)
> +    {
> +        uint8_t byte = *src;
> +        src++; src_len--;
> +        if (byte == 0x23 || byte == 0x24 || byte == 0x7d || byte == 0x2a)
> +        {
> +            bytes_written += PutChar(0x7d);
> +            byte ^= 0x20;
> +        }
> +        bytes_written += PutChar(byte);
> +    };
> +    if (binary_is_set)
> +        m_flags.Set(eBinary);
> +    return bytes_written;
> +}
> +
> 
> Modified: lldb/branches/lldb-platform-work/source/Host/common/Host.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Host/common/Host.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Host/common/Host.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Host/common/Host.cpp Fri Apr  6 19:03:47 2012
> @@ -1256,4 +1256,42 @@
>     return LLDB_INVALID_PROCESS_ID;
> }
> 
> +uint32_t
> +Host::RunProgramAndGetExitCode (const FileSpec& file_spec)
> +{
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +Host::MakeDirectory (const char* path, mode_t mode)
> +{
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +Host::OpenFile (const FileSpec& file_spec,
> +                uint32_t flags,
> +                mode_t mode)
> +{
> +    return UINT32_MAX;
> +}
> +
> +bool
> +Host::CloseFile (uint32_t fd)
> +{
> +    return false;
> +}
> +
> +uint32_t
> +Host::WriteFile (uint32_t fd, uint64_t offset, void* data, size_t data_len)
> +{
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +Host::ReadFile (uint32_t fd, uint64_t offset, uint8_t* data_ptr, size_t len_wanted)
> +{
> +    return UINT32_MAX;
> +}
> +
> #endif
> 
> Modified: lldb/branches/lldb-platform-work/source/Host/macosx/Host.mm
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Host/macosx/Host.mm?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Host/macosx/Host.mm (original)
> +++ lldb/branches/lldb-platform-work/source/Host/macosx/Host.mm Fri Apr  6 19:03:47 2012
> @@ -1843,3 +1843,55 @@
> {
>     return lldb::DataBufferSP();
> }
> +
> +uint32_t
> +Host::RunProgramAndGetExitCode (const FileSpec& file_spec)
> +{
> +    std::string path(512, ' ');
> +    uint32_t len = file_spec.GetPath(&path[0], 512);
> +    if (len >= 512)
> +    {
> +        path = std::string(len+1,' ');
> +        len = file_spec.GetPath(&path[0], len);
> +    }
> +    return ::system(path.c_str());
> +}
> +
> +uint32_t
> +Host::MakeDirectory (const char* path, mode_t mode)
> +{
> +    return ::mkdir(path,mode);
> +}
> +
> +uint32_t
> +Host::OpenFile (const FileSpec& file_spec,
> +                uint32_t flags,
> +                mode_t mode)
> +{
> +    std::string path(512, ' ');
> +    uint32_t len = file_spec.GetPath(&path[0], 512);
> +    if (len >= 512)
> +    {
> +        path = std::string(len+1,' ');
> +        len = file_spec.GetPath(&path[0], len);
> +    }
> +    return ::open(path.c_str(),flags,mode);
> +}
> +
> +bool
> +Host::CloseFile (uint32_t fd)
> +{
> +    return (::close(fd) == 0);
> +}
> +
> +uint32_t
> +Host::WriteFile (uint32_t fd, uint64_t offset, void* data, size_t data_len)
> +{
> +    return ::pwrite(fd, data, data_len, offset);
> +}
> +
> +uint32_t
> +Host::ReadFile (uint32_t fd, uint64_t offset, void* data_ptr, size_t len_wanted)
> +{
> +    return ::pread(fd, data_ptr, len_wanted, offset);
> +}
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp Fri Apr  6 19:03:47 2012
> @@ -10,6 +10,7 @@
> #include "PlatformMacOSX.h"
> 
> // C Includes
> +#include <sys/stat.h>
> #include <sys/sysctl.h>
> 
> // C++ Includes
> @@ -150,3 +151,88 @@
> #endif
> }
> 
> +uint32_t
> +PlatformMacOSX::RunShellCommand (const std::string &command_line)
> +{
> +    if (IsHost())
> +    {
> +        return Host::RunProgramAndGetExitCode(FileSpec(command_line.c_str(),false));
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->RunShellCommand(command_line);
> +    return Platform::RunShellCommand(command_line);
> +}
> +
> +uint32_t
> +PlatformMacOSX::MakeDirectory (const std::string &path,
> +                               mode_t mode)
> +{
> +    if (IsHost())
> +    {
> +        return Host::MakeDirectory (path.c_str(), mode);
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->MakeDirectory(path, mode);
> +    return Platform::MakeDirectory(path,mode);
> +}
> +
> +uint32_t
> +PlatformMacOSX::OpenFile (const FileSpec& file_spec,
> +          uint32_t flags,
> +          mode_t mode)
> +{
> +    if (IsHost())
> +    {
> +        return Host::OpenFile(file_spec, flags, mode);
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->OpenFile(file_spec, flags, mode);
> +    return Platform::OpenFile(file_spec, flags, mode);
> +}
> +
> +bool
> +PlatformMacOSX::CloseFile (uint32_t fd)
> +{
> +    if (IsHost())
> +    {
> +        return Host::CloseFile(fd);
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->CloseFile(fd);
> +    return Platform::CloseFile(fd);
> +}
> +
> +uint32_t
> +PlatformMacOSX::ReadFile (uint32_t fd, uint64_t offset,
> +                          void *data_ptr, size_t len)
> +{
> +    if (IsHost())
> +    {
> +        return Host::ReadFile(fd, offset, data_ptr, len);
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->ReadFile(fd, offset, data_ptr, len);
> +    return Platform::ReadFile(fd, offset, data_ptr, len);
> +}
> +
> +uint32_t
> +PlatformMacOSX::WriteFile (uint32_t fd, uint64_t offset,
> +                           void* data, size_t len)
> +{
> +    if (IsHost())
> +    {
> +        return Host::WriteFile(fd, offset, data, len);
> +    }
> +    if (IsRemote() && m_remote_platform_sp)
> +        return m_remote_platform_sp->WriteFile(fd, offset, data, len);
> +    return Platform::WriteFile(fd, offset, data, len);
> +}
> +
> +lldb_private::Error
> +PlatformMacOSX::PutFile (const lldb_private::FileSpec& source,
> +                         const lldb_private::FileSpec& destination,
> +                         uint32_t uid,
> +                         uint32_t gid)
> +{
> +    return Platform::PutFile(source,destination,uid,gid);
> +}
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.h (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Platform/MacOSX/PlatformMacOSX.h Fri Apr  6 19:03:47 2012
> @@ -80,6 +80,35 @@
>     GetFile (const lldb_private::FileSpec &platform_file,
>              const lldb_private::UUID *uuid_ptr,
>              lldb_private::FileSpec &local_file);
> +
> +    virtual uint32_t
> +    RunShellCommand (const std::string &command_line);
> +
> +    virtual uint32_t
> +    MakeDirectory (const std::string &path,
> +                   mode_t mode);
> +
> +    virtual lldb_private::Error
> +    PutFile (const lldb_private::FileSpec& source,
> +             const lldb_private::FileSpec& destination,
> +             uint32_t uid = UINT32_MAX,
> +             uint32_t gid = UINT32_MAX);
> +
> +    virtual uint32_t
> +    OpenFile (const lldb_private::FileSpec& file_spec,
> +              uint32_t flags,
> +              mode_t mode);
> +
> +    virtual bool
> +    CloseFile (uint32_t fd);
> +
> +    virtual uint32_t
> +    ReadFile (uint32_t fd, uint64_t offset,
> +              void *data_ptr, size_t len);
> +
> +    virtual uint32_t
> +    WriteFile (uint32_t fd, uint64_t offset,
> +               void* data, size_t len);
> 
>     virtual bool
>     GetSupportedArchitectureAtIndex (uint32_t idx,
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp Fri Apr  6 19:03:47 2012
> @@ -405,4 +405,52 @@
>     return process_sp;
> }
> 
> +uint32_t
> +PlatformRemoteGDBServer::RunShellCommand (const std::string &command_line)
> +{
> +    return m_gdb_client.RunShellCommand(command_line);
> +}
> +
> +uint32_t
> +PlatformRemoteGDBServer::MakeDirectory (const std::string &path,
> +                                        mode_t mode)
> +{
> +    return m_gdb_client.MakeDirectory(path,mode);
> +}
> +
> +uint32_t
> +PlatformRemoteGDBServer::OpenFile (const lldb_private::FileSpec& file_spec,
> +                                   uint32_t flags,
> +                                   mode_t mode)
> +{
> +    return m_gdb_client.OpenFile (file_spec, flags, mode);
> +}
> +
> +bool
> +PlatformRemoteGDBServer::CloseFile (uint32_t fd)
> +{
> +    return m_gdb_client.CloseFile (fd);
> +}
> +
> +uint32_t
> +PlatformRemoteGDBServer::ReadFile (uint32_t fd, uint64_t offset,
> +                                   void *data_ptr, size_t len)
> +{
> +    return m_gdb_client.ReadFile (fd, offset, data_ptr, len);
> +}
> 
> +uint32_t
> +PlatformRemoteGDBServer::WriteFile (uint32_t fd, uint64_t offset,
> +                                    void* data, size_t len)
> +{
> +    return m_gdb_client.WriteFile (fd, offset, data, len);
> +}
> +
> +lldb_private::Error
> +PlatformRemoteGDBServer::PutFile (const lldb_private::FileSpec& source,
> +         const lldb_private::FileSpec& destination,
> +         uint32_t uid,
> +         uint32_t gid)
> +{
> +    return Platform::PutFile(source,destination,uid,gid);
> +}
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h Fri Apr  6 19:03:47 2012
> @@ -140,6 +140,35 @@
> 
>     virtual lldb_private::Error
>     DisconnectRemote ();
> +
> +    virtual uint32_t
> +    RunShellCommand (const std::string &command_line);
> +
> +    virtual uint32_t
> +    MakeDirectory (const std::string &path,
> +                   mode_t mode);
> +
> +    virtual uint32_t
> +    OpenFile (const lldb_private::FileSpec& file_spec,
> +              uint32_t flags,
> +              mode_t mode);
> +
> +    virtual bool
> +    CloseFile (uint32_t fd);
> +
> +    virtual uint32_t
> +    ReadFile (uint32_t fd, uint64_t offset,
> +              void *data_ptr, size_t len);
> +
> +    virtual uint32_t
> +    WriteFile (uint32_t fd, uint64_t offset,
> +               void* data, size_t len);
> +
> +    virtual lldb_private::Error
> +    PutFile (const lldb_private::FileSpec& source,
> +             const lldb_private::FileSpec& destination,
> +             uint32_t uid = UINT32_MAX,
> +             uint32_t gid = UINT32_MAX);
> 
> protected:
>     GDBRemoteCommunicationClient m_gdb_client;
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp Fri Apr  6 19:03:47 2012
> @@ -18,6 +18,7 @@
> #include "lldb/Core/ConnectionFileDescriptor.h"
> #include "lldb/Core/Log.h"
> #include "lldb/Core/State.h"
> +#include "lldb/Core/StreamGDBRemote.h"
> #include "lldb/Core/StreamString.h"
> #include "lldb/Host/Endian.h"
> #include "lldb/Host/Host.h"
> @@ -1875,3 +1876,152 @@
>     }
>     return thread_ids.size();
> }
> +
> +uint32_t
> +GDBRemoteCommunicationClient::RunShellCommand (const std::string &command_line)
> +{
> +    lldb_private::StreamString stream;
> +    stream.PutCString("qPlatform_Syscall_System:");
> +    stream.PutBytesAsRawHex8(command_line.c_str(), command_line.size());
> +    const char *packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        return response.GetHexMaxU32(false, UINT32_MAX);
> +    }
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +GDBRemoteCommunicationClient::MakeDirectory (const std::string &path,
> +                                             mode_t mode)
> +{
> +    lldb_private::StreamString stream;
> +    stream.PutCString("qPlatform_IO_MkDir:");
> +    stream.PutHex32(mode);
> +    stream.PutChar(',');
> +    stream.PutBytesAsRawHex8(path.c_str(), path.size());
> +    const char *packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        return response.GetHexMaxU32(false, UINT32_MAX);
> +    }
> +    return UINT32_MAX;
> +
> +}
> +
> +uint32_t
> +GDBRemoteCommunicationClient::OpenFile (const lldb_private::FileSpec& file_spec,
> +                                        uint32_t flags,
> +                                        mode_t mode)
> +{
> +    lldb_private::StreamString stream;
> +    stream.PutCString("vFile:open:");
> +    std::string path(512, ' ');
> +    uint32_t len = file_spec.GetPath(&path[0], 512);
> +    if (len >= 512)
> +    {
> +        path = std::string(len+1,' ');
> +        len = file_spec.GetPath(&path[0], len);
> +    }
> +    stream.PutCStringAsRawHex8(path.c_str());
> +    stream.PutChar(',');
> +    stream.PutHex32(flags);
> +    stream.PutChar(',');
> +    stream.PutHex32(mode);
> +    const char* packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        if (response.GetChar() != 'F')
> +            return UINT32_MAX;
> +        uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
> +        return retcode;
> +    }
> +    return UINT32_MAX;
> +}
> +
> +bool
> +GDBRemoteCommunicationClient::CloseFile (uint32_t fd)
> +{
> +    lldb_private::StreamString stream;
> +    stream.PutCString("vFile:close:");
> +    stream.PutHex32(fd);
> +    const char* packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        if (response.GetChar() != 'F')
> +            return UINT32_MAX;
> +        uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
> +        return retcode;
> +    }
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +GDBRemoteCommunicationClient::ReadFile (uint32_t fd, uint64_t offset,
> +                                        void *data_ptr, size_t len)
> +{
> +    lldb_private::StreamString stream;
> +    stream.PutCString("vFile:read:");
> +    stream.PutHex32(fd);
> +    stream.PutChar(',');
> +    stream.PutHex32(len);
> +    stream.PutChar(',');
> +    stream.PutHex32(offset);
> +    const char* packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        if (response.GetChar() != 'F')
> +            return UINT32_MAX;
> +        uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
> +        if (retcode == UINT32_MAX)
> +            return retcode;
> +        if (response.GetChar() == ',')
> +            return UINT32_MAX;
> +        if (response.GetChar() == ';')
> +        {
> +            std::string buffer;
> +            response.GetEscapedBinaryData(buffer);
> +            size_t data_to_write = len;
> +            if (buffer.size() < len)
> +                data_to_write = buffer.size();
> +            memcpy(data_ptr, &buffer[0], data_to_write);
> +        }
> +        return retcode;
> +    }
> +    return UINT32_MAX;
> +}
> +
> +uint32_t
> +GDBRemoteCommunicationClient::WriteFile (uint32_t fd, uint64_t offset,
> +                                         void* data, size_t len)
> +{
> +    lldb_private::StreamGDBRemote stream;
> +    stream.PutCString("vFile:write:");
> +    stream.PutHex32(fd);
> +    stream.PutChar(',');
> +    stream.PutHex32(offset);
> +    stream.PutChar(',');
> +    stream.PutEscapedBytes(data, len);
> +    const char* packet = stream.GetData();
> +    int packet_len = stream.GetSize();
> +    StringExtractorGDBRemote response;
> +    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
> +    {
> +        if (response.GetChar() != 'F')
> +            return UINT32_MAX;
> +        uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
> +        return retcode;
> +    }
> +    return UINT32_MAX;
> +}
> +
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h Fri Apr  6 19:03:47 2012
> @@ -326,6 +326,30 @@
>     {
>         return m_interrupt_sent;
>     }
> +
> +    virtual uint32_t
> +    RunShellCommand (const std::string &command_line);
> +
> +    virtual uint32_t
> +    OpenFile (const lldb_private::FileSpec& file_spec,
> +              uint32_t flags,
> +              mode_t mode);
> +
> +    virtual bool
> +    CloseFile (uint32_t fd);
> +
> +    virtual uint32_t
> +    ReadFile (uint32_t fd, uint64_t offset,
> +              void *data_ptr, size_t len);
> +
> +    virtual uint32_t
> +    WriteFile (uint32_t fd, uint64_t offset,
> +               void* data, size_t len);
> +
> +    virtual uint32_t
> +    MakeDirectory (const std::string &path,
> +                   mode_t mode);
> +
> protected:
> 
>     //------------------------------------------------------------------
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp Fri Apr  6 19:03:47 2012
> @@ -9,6 +9,7 @@
> 
> 
> #include "GDBRemoteCommunicationServer.h"
> +#import "StreamGDBRemote.h"
> 
> // C Includes
> // C++ Includes
> @@ -160,6 +161,24 @@
> 
>             case StringExtractorGDBRemote::eServerPacketType_QStartNoAckMode:
>                 return Handle_QStartNoAckMode (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_qPlatform_Syscall_System:
> +                return Handle_qPlatform_Syscall_System (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_qPlatform_IO_MkDir:
> +                return Handle_qPlatform_IO_MkDir (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_vFile_Open:
> +                return Handle_vFile_Open (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_vFile_Close:
> +                return Handle_vFile_Close (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_vFile_pRead:
> +                return Handle_vFile_pRead (packet);
> +
> +            case StringExtractorGDBRemote::eServerPacketType_vFile_pWrite:
> +                return Handle_vFile_pWrite (packet);
>         }
>         return true;
>     }
> @@ -832,3 +851,137 @@
>     m_send_acks = false;
>     return true;
> }
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_qPlatform_Syscall_System (StringExtractorGDBRemote &packet)
> +{
> +    packet.SetFilePos(::strlen("qPlatform_Syscall_System:"));
> +    std::string path;
> +    packet.GetHexByteString(path);
> +    uint32_t retcode = Host::RunProgramAndGetExitCode(FileSpec(path.c_str(),false));
> +    StreamString response;
> +    response.PutHex32(retcode);
> +    SendPacket(response);
> +    return true;
> +}
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_qPlatform_IO_MkDir (StringExtractorGDBRemote &packet)
> +{
> +    packet.SetFilePos(::strlen("qPlatform_IO_MkDir:"));
> +    mode_t mode = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    std::string path;
> +    packet.GetHexByteString(path);
> +    uint32_t retcode = Host::MakeDirectory(path.c_str(),mode);
> +    StreamString response;
> +    response.PutHex32(retcode);
> +    SendPacket(response);
> +    return true;
> +}
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_vFile_Open (StringExtractorGDBRemote &packet)
> +{
> +    packet.SetFilePos(::strlen("vFile:open:"));
> +    std::string path;
> +    packet.GetHexByteString(path);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    uint32_t flags = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    mode_t mode = packet.GetHexMaxU32(false, UINT32_MAX);
> +    uint32_t retcode = Host::OpenFile(FileSpec(path.c_str(), false), flags, mode);
> +    StreamString response;
> +    response.PutChar('F');
> +    response.PutHex32(retcode);
> +    if (retcode == UINT32_MAX)
> +    {
> +        response.PutChar(',');
> +        response.PutHex32(retcode); // TODO: replace with Host::GetSyswideErrorCode()
> +    }
> +    SendPacket(response);
> +    return true;
> +}
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_vFile_Close (StringExtractorGDBRemote &packet)
> +{
> +    packet.SetFilePos(::strlen("vFile:close:"));
> +    uint32_t fd = packet.GetHexMaxU32(false, UINT32_MAX);
> +    uint32_t retcode = Host::CloseFile(fd);
> +    StreamString response;
> +    response.PutChar('F');
> +    response.PutHex32(retcode);
> +    if (retcode == UINT32_MAX)
> +    {
> +        response.PutChar(',');
> +        response.PutHex32(retcode); // TODO: replace with Host::GetSyswideErrorCode()
> +    }
> +    SendPacket(response);
> +    return true;
> +}
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_vFile_pRead (StringExtractorGDBRemote &packet)
> +{
> +    StreamGDBRemote response;
> +    packet.SetFilePos(::strlen("vFile:pread:"));
> +    uint32_t fd = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    uint32_t count = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    uint32_t offset = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (count == UINT32_MAX) // protect yourself against allocating a 4GB buffer
> +    {
> +        response.PutChar('F');
> +        response.PutHex32(UINT32_MAX);
> +        response.PutChar(',');
> +        response.PutHex32(UINT32_MAX); // TODO: replace with Host::GetSyswideErrorCode()
> +        SendPacket(response);
> +        return true;
> +    }
> +    std::string buffer(' ',count);
> +    uint32_t retcode = Host::ReadFile(fd, offset, &buffer[0], count);
> +    response.PutChar('F');
> +    response.PutHex32(retcode);
> +    if (retcode == UINT32_MAX)
> +    {
> +        response.PutChar(',');
> +        response.PutHex32(retcode); // TODO: replace with Host::GetSyswideErrorCode()
> +    }
> +    else
> +    {
> +        response.PutChar(';');
> +        response.PutEscapedBytes(&buffer[0], retcode);
> +    }
> +    SendPacket(response);
> +    return true;
> +}
> +
> +bool
> +GDBRemoteCommunicationServer::Handle_vFile_pWrite (StringExtractorGDBRemote &packet)
> +{
> +    packet.SetFilePos(::strlen("vFile:pwrite:"));
> +    uint32_t fd = packet.GetHexMaxU32(false, UINT32_MAX);
> +    if (packet.GetChar() != ',')
> +        return false;
> +    uint32_t offset = packet.GetHexMaxU32(false, UINT32_MAX);
> +    std::string buffer;
> +    packet.GetEscapedBinaryData(buffer);
> +    uint32_t retcode = Host::WriteFile(fd, offset, &buffer[0], buffer.size());
> +    StreamString response;
> +    response.PutChar('F');
> +    response.PutHex32(retcode);
> +    if (retcode == UINT32_MAX)
> +    {
> +        response.PutChar(',');
> +        response.PutHex32(retcode); // TODO: replace with Host::GetSyswideErrorCode()
> +    }
> +    SendPacket(response);
> +    return true;
> +}
> 
> Modified: lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h (original)
> +++ lldb/branches/lldb-platform-work/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h Fri Apr  6 19:03:47 2012
> @@ -85,7 +85,7 @@
> 
>     bool
>     Handle_A (StringExtractorGDBRemote &packet);
> -
> +
>     bool
>     Handle_qLaunchSuccess (StringExtractorGDBRemote &packet);
> 
> @@ -96,6 +96,12 @@
>     Handle_qLaunchGDBServer (StringExtractorGDBRemote &packet);
> 
>     bool
> +    Handle_qPlatform_IO_MkDir (StringExtractorGDBRemote &packet);
> +
> +    bool
> +    Handle_qPlatform_Syscall_System (StringExtractorGDBRemote &packet);
> +
> +    bool
>     Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
> 
>     bool
> @@ -137,6 +143,17 @@
>     bool
>     Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
> 
> +    bool
> +    Handle_vFile_Open (StringExtractorGDBRemote &packet);
> +
> +    bool
> +    Handle_vFile_Close (StringExtractorGDBRemote &packet);
> +
> +    bool
> +    Handle_vFile_pRead (StringExtractorGDBRemote &packet);
> +
> +    bool
> +    Handle_vFile_pWrite (StringExtractorGDBRemote &packet);
> private:
>     //------------------------------------------------------------------
>     // For GDBRemoteCommunicationServer only
> 
> Modified: lldb/branches/lldb-platform-work/source/Target/Platform.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Target/Platform.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Target/Platform.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Target/Platform.cpp Fri Apr  6 19:03:47 2012
> @@ -658,4 +658,14 @@
> 
> }
> 
> +Error
> +Platform::PutFile (const FileSpec& source,
> +                   const FileSpec& destination,
> +                   uint32_t uid,
> +                   uint32_t gid)
> +{
> +    Error error("unimplemented");
> +    return error;
> +}
> +
> 
> 
> Modified: lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.cpp (original)
> +++ lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.cpp Fri Apr  6 19:03:47 2012
> @@ -126,8 +126,11 @@
>             break;
> 
>         case 'P':
> -            if (PACKET_STARTS_WITH ("qProcessInfoPID:"))        return eServerPacketType_qProcessInfoPID;
> +            if (PACKET_STARTS_WITH ("qProcessInfoPID:"))                 return eServerPacketType_qProcessInfoPID;
> +            if (PACKET_STARTS_WITH ("qPlatform_Syscall_System:"))        return eServerPacketType_qPlatform_Syscall_System;
> +            if (PACKET_STARTS_WITH ("qPlatform_IO_MkDir:"))              return eServerPacketType_qPlatform_IO_MkDir;
>             break;
> +
> 
>         case 'S':
>             if (PACKET_STARTS_WITH ("qSpeedTest:"))             return eServerPacketType_qSpeedTest;
> @@ -138,6 +141,15 @@
>             break;
>         }
>         break;
> +    case 'v':
> +            if (PACKET_STARTS_WITH("vFile:"))
> +            {
> +                if (PACKET_STARTS_WITH("vFile:open:"))               return eServerPacketType_vFile_Open;
> +                else if (PACKET_STARTS_WITH("vFile:close:"))         return eServerPacketType_vFile_Close;
> +                else if (PACKET_STARTS_WITH("vFile:pread"))          return eServerPacketType_vFile_pRead;
> +                else if (PACKET_STARTS_WITH("vFile:pwrite"))         return eServerPacketType_vFile_pWrite;
> +            }
> +            break;
>     }
>     return eServerPacketType_unimplemented;
> }
> @@ -180,3 +192,19 @@
>     }
>     return 0;
> }
> +
> +size_t
> +StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str)
> +{
> +    str.clear();
> +    char ch;
> +    while (GetBytesLeft())
> +    {
> +        ch = GetChar();
> +        if (ch == 0x7d)
> +            ch = (GetChar() ^ 0x20);
> +        str.append(1,ch);
> +    }
> +    return str.size();
> +}
> +
> 
> Modified: lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.h?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.h (original)
> +++ lldb/branches/lldb-platform-work/source/Utility/StringExtractorGDBRemote.h Fri Apr  6 19:03:47 2012
> @@ -63,7 +63,13 @@
>         eServerPacketType_QSetSTDOUT,
>         eServerPacketType_QSetSTDERR,
>         eServerPacketType_QSetWorkingDir,
> -        eServerPacketType_QStartNoAckMode
> +        eServerPacketType_QStartNoAckMode,
> +        eServerPacketType_qPlatform_Syscall_System,
> +        eServerPacketType_qPlatform_IO_MkDir,
> +        eServerPacketType_vFile_Open,
> +        eServerPacketType_vFile_Close,
> +        eServerPacketType_vFile_pRead,
> +        eServerPacketType_vFile_pWrite
>     };
> 
>     ServerPacketType
> @@ -98,6 +104,10 @@
>     // digits. Otherwise the error encoded in XX is returned.
>     uint8_t
>     GetError();
> +
> +    size_t
> +    GetEscapedBinaryData (std::string &str);
> +
> };
> 
> #endif  // utility_StringExtractorGDBRemote_h_
> 
> Modified: lldb/branches/lldb-platform-work/tools/lldb-platform/lldb-platform.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/branches/lldb-platform-work/tools/lldb-platform/lldb-platform.cpp?rev=154233&r1=154232&r2=154233&view=diff
> ==============================================================================
> --- lldb/branches/lldb-platform-work/tools/lldb-platform/lldb-platform.cpp (original)
> +++ lldb/branches/lldb-platform-work/tools/lldb-platform/lldb-platform.cpp Fri Apr  6 19:03:47 2012
> @@ -183,6 +183,12 @@
>     GDBRemoteCommunicationServer gdb_server (true);
>     if (!listen_host_port.empty())
>     {
> +        for (int j = 0; j < listen_host_port.size(); j++)
> +        {
> +            char c = listen_host_port[j];
> +            if (c > '9' || c < '0')
> +                printf("WARNING: passing anything but a number as argument to --listen will most probably make connecting impossible.\n");
> +        }
>         std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
>         if (conn_ap.get())
>         {
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> <lldb-platform-gdbremotecommunicationserver-include-fix.patch>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20120409/1ba7d37c/attachment.html>


More information about the lldb-commits mailing list