[Lldb-commits] [lldb] r230065 - Start the refactoring of globbing

Zachary Turner zturner at google.com
Fri Feb 20 14:41:27 PST 2015


You probably already saw the bot failure email, but you can take a look at
this:

http://lab.llvm.org:8011/builders/lldb-x86-windows-msvc/builds/2222/steps/build/logs/stdio

It looks like probably a missing #include, let me know if it's more
difficult though.

On Fri Feb 20 2015 at 2:26:38 PM Zachary Turner <zturner at google.com> wrote:

> Might it ever be possible to expand a string for purposes other than
> forwarding those arguments on to another executable?  For example, maybe we
> want shell expansion to specify the name of the executable in the first
> place.  Like imagine you're trying to debug "foo", and the path of foo is
> $FOODIR/foo.  In this case the expansion doesn't happen on the argument to
> the command but the command itself.
>
> And...  I just saw your other email come through.  ShellExpandArguments()
> sounds fine.
>
> On Fri Feb 20 2015 at 2:00:36 PM Enrico Granata <egranata at apple.com>
> wrote:
>
>> Fair enough - ShellExpand is not bad, but I feel like Arguments should be
>> in there somewhere
>>
>> Collective hivemind, something less verbose than
>> ShellStyleExpandArguments maybe?
>>
>> On Feb 20, 2015, at 1:57 PM, Zachary Turner <zturner at google.com> wrote:
>>
>> In a followup patch, would you mind changing the terminology from
>> GlobArguments to something more descriptive, like ShellExpand?  When I
>> think glob I only think of wildcards, not full shell exnapsion.  So I think
>> it would be better if it were more explicit.
>>
>> On Fri Feb 20 2015 at 1:51:26 PM Enrico Granata <egranata at apple.com>
>> wrote:
>>
>>> Author: enrico
>>> Date: Fri Feb 20 15:48:38 2015
>>> New Revision: 230065
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=230065&view=rev
>>> Log:
>>> Start the refactoring of globbing
>>>
>>> - Add Host::GlobArguments() to perform local-globbing
>>> I implemented this on OSX and Windows in terms of argdumper (Windows
>>> implementation is essentially the same as the OSX version + a change in
>>> binary name and some string magic)
>>> Other platforms did not specifically chime in, so I left it
>>> unimplemented for them for the time being. Please feel free to fill in the
>>> blanks
>>>
>>> - Add Platform::GlobArguments() to support remote-globbing
>>> For now, no feature change here - but now we have infrastructure to help
>>> GDBRemote targets to support globbing - and patches to that effect will
>>> follow
>>>
>>> No visible feature change
>>>
>>>
>>> Modified:
>>>     lldb/trunk/include/lldb/Host/Host.h
>>>     lldb/trunk/include/lldb/Target/Platform.h
>>>     lldb/trunk/source/Host/freebsd/Host.cpp
>>>     lldb/trunk/source/Host/linux/Host.cpp
>>>     lldb/trunk/source/Host/macosx/Host.mm
>>>     lldb/trunk/source/Host/windows/Host.cpp
>>>     lldb/trunk/source/Target/Platform.cpp
>>>
>>> Modified: lldb/trunk/include/lldb/Host/Host.h
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Host/Host.h?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/include/lldb/Host/Host.h (original)
>>> +++ lldb/trunk/include/lldb/Host/Host.h Fri Feb 20 15:48:38 2015
>>> @@ -253,6 +253,16 @@ public:
>>>      static Error
>>>      LaunchProcess (ProcessLaunchInfo &launch_info);
>>>
>>> +    //----------------------------------------------------------
>>> --------
>>> +    /// Perform globbing of the command-line for this launch info
>>> +    /// This can potentially involve wildcard expansion
>>> +    //  environment variable replacement, and whatever other
>>> +    //  argument magic the platform defines as part of its typical
>>> +    //  user experience
>>> +    //----------------------------------------------------------
>>> --------
>>> +    static Error
>>> +    GlobArguments (ProcessLaunchInfo &launch_info);
>>> +
>>>      static Error
>>>      RunShellCommand (const char *command,           // Shouldn't be NULL
>>>                       const char *working_dir,       // Pass NULL to use
>>> the current working directory
>>>
>>> Modified: lldb/trunk/include/lldb/Target/Platform.h
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Target/Platform.h?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/include/lldb/Target/Platform.h (original)
>>> +++ lldb/trunk/include/lldb/Target/Platform.h Fri Feb 20 15:48:38 2015
>>> @@ -386,6 +386,16 @@ namespace lldb_private {
>>>          LaunchProcess (ProcessLaunchInfo &launch_info);
>>>
>>>          //----------------------------------------------------------
>>> --------
>>> +        /// Perform globbing of the command-line for this launch info
>>> +        /// This can potentially involve wildcard expansion
>>> +        //  environment variable replacement, and whatever other
>>> +        //  argument magic the platform defines as part of its typical
>>> +        //  user experience
>>> +        //----------------------------------------------------------
>>> --------
>>> +        virtual Error
>>> +        GlobArguments (ProcessLaunchInfo &launch_info);
>>> +
>>> +        //----------------------------------------------------------
>>> --------
>>>          /// Kill process on a platform.
>>>          //----------------------------------------------------------
>>> --------
>>>          virtual Error
>>>
>>> Modified: lldb/trunk/source/Host/freebsd/Host.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/
>>> freebsd/Host.cpp?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/source/Host/freebsd/Host.cpp (original)
>>> +++ lldb/trunk/source/Host/freebsd/Host.cpp Fri Feb 20 15:48:38 2015
>>> @@ -312,3 +312,9 @@ Host::GetUnixSignals ()
>>>      return s_unix_signals_sp;
>>>  }
>>>
>>> +Error
>>> +Host::GlobArguments (ProcessLaunchInfo &launch_info)
>>> +{
>>> +    return Error("unimplemented");
>>> +}
>>> +
>>>
>>> Modified: lldb/trunk/source/Host/linux/Host.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/
>>> linux/Host.cpp?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/source/Host/linux/Host.cpp (original)
>>> +++ lldb/trunk/source/Host/linux/Host.cpp Fri Feb 20 15:48:38 2015
>>> @@ -417,3 +417,8 @@ Host::GetUnixSignals ()
>>>      return s_unix_signals_sp;
>>>  }
>>>
>>> +Error
>>> +Host::GlobArguments (ProcessLaunchInfo &launch_info)
>>> +{
>>> +    return Error("unimplemented");
>>> +}
>>>
>>> Modified: lldb/trunk/source/Host/macosx/Host.mm
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/
>>> macosx/Host.mm?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/source/Host/macosx/Host.mm (original)
>>> +++ lldb/trunk/source/Host/macosx/Host.mm Fri Feb 20 15:48:38 2015
>>> @@ -45,6 +45,7 @@
>>>  #include "lldb/Core/ModuleSpec.h"
>>>  #include "lldb/Core/StreamFile.h"
>>>  #include "lldb/Core/StreamString.h"
>>> +#include "lldb/Core/StructuredData.h"
>>>  #include "lldb/Host/ConnectionFileDescriptor.h"
>>>  #include "lldb/Host/Endian.h"
>>>  #include "lldb/Host/FileSpec.h"
>>> @@ -1351,6 +1352,91 @@ Host::LaunchProcess (ProcessLaunchInfo &
>>>      return error;
>>>  }
>>>
>>> +Error
>>> +Host::GlobArguments (ProcessLaunchInfo &launch_info)
>>> +{
>>> +    Error error;
>>> +    if (launch_info.GetFlags().Test(eLaunchFlagGlobArguments))
>>> +    {
>>> +        FileSpec glob_tool_spec;
>>> +        if (!HostInfo::GetLLDBPath(lldb::ePathTypeSupportExecutableDir,
>>> glob_tool_spec))
>>> +        {
>>> +            error.SetErrorString("could not find argdumper tool");
>>> +            return error;
>>> +        }
>>> +        glob_tool_spec.AppendPathComponent("argdumper");
>>> +        if (!glob_tool_spec.Exists())
>>> +        {
>>> +            error.SetErrorString("could not find argdumper tool");
>>> +            return error;
>>> +        }
>>> +
>>> +        std::string quoted_cmd_string;
>>> +        launch_info.GetArguments().GetQuotedCommandString(quoted_cmd
>>> _string);
>>> +        StreamString glob_command;
>>> +
>>> +        glob_command.Printf("%s %s",
>>> +                            glob_tool_spec.GetPath().c_str(),
>>> +                            quoted_cmd_string.c_str());
>>> +
>>> +        int status;
>>> +        std::string output;
>>> +        RunShellCommand(glob_command.GetData(), launch_info.
>>> GetWorkingDirectory(), &status, nullptr, &output, 10);
>>> +
>>> +        if (status != 0)
>>> +        {
>>> +            error.SetErrorStringWithFormat("argdumper exited with
>>> error %d", status);
>>> +            return error;
>>> +        }
>>> +
>>> +        auto data_sp = StructuredData::ParseJSON(output);
>>> +        if (!data_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto dict_sp = data_sp->GetAsDictionary();
>>> +        if (!data_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto args_sp = dict_sp->GetObjectForDotSeparatedPath("
>>> arguments");
>>> +        if (!args_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto args_array_sp = args_sp->GetAsArray();
>>> +        if (!args_array_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        launch_info.GetArguments().Clear();
>>> +
>>> +        for (size_t i = 0;
>>> +             i < args_array_sp->GetSize();
>>> +             i++)
>>> +        {
>>> +            auto item_sp = args_array_sp->GetItemAtIndex(i);
>>> +            if (!item_sp)
>>> +                continue;
>>> +            auto str_sp = item_sp->GetAsString();
>>> +            if (!str_sp)
>>> +                continue;
>>> +
>>> +            launch_info.GetArguments().AppendArgument(str_sp->
>>> GetValue().c_str());
>>> +        }
>>> +    }
>>> +
>>> +    return error;
>>> +}
>>> +
>>>  HostThread
>>>  Host::StartMonitoringChildProcess(Host::MonitorChildProcessCallback
>>> callback, void *callback_baton, lldb::pid_t pid, bool monitor_signals)
>>>  {
>>>
>>> Modified: lldb/trunk/source/Host/windows/Host.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/
>>> windows/Host.cpp?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/source/Host/windows/Host.cpp (original)
>>> +++ lldb/trunk/source/Host/windows/Host.cpp Fri Feb 20 15:48:38 2015
>>> @@ -217,4 +217,90 @@ HostThread
>>>  Host::StartMonitoringChildProcess(Host::MonitorChildProcessCallback
>>> callback, void *callback_baton, lldb::pid_t pid, bool monitor_signals)
>>>  {
>>>      return HostThread();
>>> -}
>>> \ No newline at end of file
>>> +}
>>> +
>>> +Error
>>> +Host::GlobArguments (ProcessLaunchInfo &launch_info)
>>> +{
>>> +    Error error;
>>> +    if (launch_info.GetFlags().Test(eLaunchFlagGlobArguments))
>>> +    {
>>> +        FileSpec glob_tool_spec;
>>> +        if (!HostInfo::GetLLDBPath(lldb::ePathTypeSupportExecutableDir,
>>> glob_tool_spec))
>>> +        {
>>> +            error.SetErrorString("could not find argdumper tool");
>>> +            return error;
>>> +        }
>>> +        glob_tool_spec.AppendPathComponent("argdumper.exe");
>>> +        if (!glob_tool_spec.Exists())
>>> +        {
>>> +            error.SetErrorString("could not find argdumper tool");
>>> +            return error;
>>> +        }
>>> +
>>> +        std::string quoted_cmd_string;
>>> +        launch_info.GetArguments().GetQuotedCommandString(quoted_cmd
>>> _string);
>>> +        std::replace(quoted_cmd_string.begin(),
>>> quoted_cmd_string.end(), '\\', '/');
>>> +        StreamString glob_command;
>>> +
>>> +        glob_command.Printf("%s %s",
>>> +                            glob_tool_spec.GetPath().c_str(),
>>> +                            quoted_cmd_string.c_str());
>>> +
>>> +        int status;
>>> +        std::string output;
>>> +        RunShellCommand(glob_command.GetData(), launch_info.
>>> GetWorkingDirectory(), &status, nullptr, &output, 10);
>>> +
>>> +        if (status != 0)
>>> +        {
>>> +            error.SetErrorStringWithFormat("argdumper exited with
>>> error %d", status);
>>> +            return error;
>>> +        }
>>> +
>>> +        auto data_sp = StructuredData::ParseJSON(output);
>>> +        if (!data_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto dict_sp = data_sp->GetAsDictionary();
>>> +        if (!data_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto args_sp = dict_sp->GetObjectForDotSeparatedPath("
>>> arguments");
>>> +        if (!args_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        auto args_array_sp = args_sp->GetAsArray();
>>> +        if (!args_array_sp)
>>> +        {
>>> +            error.SetErrorString("invalid JSON");
>>> +            return error;
>>> +        }
>>> +
>>> +        launch_info.GetArguments().Clear();
>>> +
>>> +        for (size_t i = 0;
>>> +             i < args_array_sp->GetSize();
>>> +             i++)
>>> +        {
>>> +            auto item_sp = args_array_sp->GetItemAtIndex(i);
>>> +            if (!item_sp)
>>> +                continue;
>>> +            auto str_sp = item_sp->GetAsString();
>>> +            if (!str_sp)
>>> +                continue;
>>> +
>>> +            launch_info.GetArguments().AppendArgument(str_sp->
>>> GetValue().c_str());
>>> +        }
>>> +    }
>>> +
>>> +    return error;
>>> +}
>>>
>>> Modified: lldb/trunk/source/Target/Platform.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target
>>> /Platform.cpp?rev=230065&r1=230064&r2=230065&view=diff
>>> ============================================================
>>> ==================
>>> --- lldb/trunk/source/Target/Platform.cpp (original)
>>> +++ lldb/trunk/source/Target/Platform.cpp Fri Feb 20 15:48:38 2015
>>> @@ -1116,87 +1116,9 @@ Platform::LaunchProcess (ProcessLaunchIn
>>>          }
>>>          else if (launch_info.GetFlags().Test(eLaunchFlagGlobArguments))
>>>          {
>>> -            FileSpec glob_tool_spec;
>>> -            if (!HostInfo::GetLLDBPath(lldb::ePathTypeSupportExecutableDir,
>>> glob_tool_spec))
>>> -            {
>>> -                error.SetErrorString("could not find argdumper tool");
>>> +            error = GlobArguments(launch_info);
>>> +            if (error.Fail())
>>>                  return error;
>>> -            }
>>> -#if defined(_WIN32)
>>> -            glob_tool_spec.AppendPathComponent("argdumper.exe");
>>> -#else
>>> -            glob_tool_spec.AppendPathComponent("argdumper");
>>> -#endif
>>> -            if (!glob_tool_spec.Exists())
>>> -            {
>>> -                error.SetErrorString("could not find argdumper tool");
>>> -                return error;
>>> -            }
>>> -
>>> -            std::string quoted_cmd_string;
>>> -            launch_info.GetArguments().GetQuotedCommandString(quoted_
>>> cmd_string);
>>> -#if defined(_WIN32)
>>> -            std::replace(quoted_cmd_string.begin(),
>>> quoted_cmd_string.end(), '\\', '/');
>>> -#endif
>>> -            StreamString glob_command;
>>> -
>>> -            glob_command.Printf("%s %s",
>>> -                                glob_tool_spec.GetPath().c_str(),
>>> -                                quoted_cmd_string.c_str());
>>> -
>>> -            int status;
>>> -            std::string output;
>>> -            RunShellCommand(glob_command.GetData(), launch_info.
>>> GetWorkingDirectory(), &status, nullptr, &output, 10);
>>> -
>>> -            if (status != 0)
>>> -            {
>>> -                error.SetErrorStringWithFormat("argdumper exited with
>>> error %d", status);
>>> -                return error;
>>> -            }
>>> -
>>> -            auto data_sp = StructuredData::ParseJSON(output);
>>> -            if (!data_sp)
>>> -            {
>>> -                error.SetErrorString("invalid JSON");
>>> -                return error;
>>> -            }
>>> -
>>> -            auto dict_sp = data_sp->GetAsDictionary();
>>> -            if (!data_sp)
>>> -            {
>>> -                error.SetErrorString("invalid JSON");
>>> -                return error;
>>> -            }
>>> -
>>> -            auto args_sp = dict_sp->GetObjectForDotSeparatedPath("
>>> arguments");
>>> -            if (!args_sp)
>>> -            {
>>> -                error.SetErrorString("invalid JSON");
>>> -                return error;
>>> -            }
>>> -
>>> -            auto args_array_sp = args_sp->GetAsArray();
>>> -            if (!args_array_sp)
>>> -            {
>>> -                error.SetErrorString("invalid JSON");
>>> -                return error;
>>> -            }
>>> -
>>> -            launch_info.GetArguments().Clear();
>>> -
>>> -            for (size_t i = 0;
>>> -                 i < args_array_sp->GetSize();
>>> -                 i++)
>>> -            {
>>> -                auto item_sp = args_array_sp->GetItemAtIndex(i);
>>> -                if (!item_sp)
>>> -                    continue;
>>> -                auto str_sp = item_sp->GetAsString();
>>> -                if (!str_sp)
>>> -                    continue;
>>> -
>>> -                launch_info.GetArguments().AppendArgument(str_sp->
>>> GetValue().c_str());
>>> -            }
>>>          }
>>>
>>>          if (log)
>>> @@ -1210,6 +1132,14 @@ Platform::LaunchProcess (ProcessLaunchIn
>>>  }
>>>
>>>  Error
>>> +Platform::GlobArguments (ProcessLaunchInfo &launch_info)
>>> +{
>>> +    if (IsHost())
>>> +        return Host::GlobArguments(launch_info);
>>> +    return Error("base lldb_private::Platform class can't glob
>>> arguments");
>>> +}
>>> +
>>> +Error
>>>  Platform::KillProcess (const lldb::pid_t pid)
>>>  {
>>>      Log *log(lldb_private::GetLogIfAllCategoriesSet
>>> (LIBLLDB_LOG_PLATFORM));
>>>
>>>
>>> _______________________________________________
>>> lldb-commits mailing list
>>> lldb-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>>>
>>
>> Thanks,
>> *- Enrico*
>> 📩 egranata@.com ☎️ 27683
>>
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150220/d02e49dd/attachment.html>


More information about the lldb-commits mailing list