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

Enrico Granata egranata at apple.com
Fri Feb 20 14:46:24 PST 2015


My best guess is a missing include, which I added in 230080. If that doesn’t fix it, I am going to need somebody who knows their way around Windows to help out

> On Feb 20, 2015, at 2:41 PM, Zachary Turner <zturner at google.com> wrote:
> 
> 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 <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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 <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 <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 <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 <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 <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 <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 <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 <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 <mailto:lldb-commits at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits <http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits>
> 
> Thanks,
> - Enrico
> 📩 egranata@.com ☎️ 27683
> 
> 
> 
> 

Thanks,
- Enrico
📩 egranata@.com ☎️ 27683




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


More information about the lldb-commits mailing list