[Lldb-commits] [lldb] r230065 - Start the refactoring of globbing
Enrico Granata
egranata at apple.com
Fri Feb 20 14:25:42 PST 2015
After juggling with the idea of TextBasedCommandProcessorStyleCommandLineArgumentExpansion </joke>, we settled for ShellExpandArguments()
r230077
> On Feb 20, 2015, at 2:00 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 <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(), '\\' <smb://'>, '/');
>> + 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(), '\\' <smb://'>, '/');
>> -#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
>
>
>
>
> _______________________________________________
> 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/dbb595dd/attachment.html>
More information about the lldb-commits
mailing list