diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp')
| -rw-r--r-- | contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp | 788 | 
1 files changed, 351 insertions, 437 deletions
diff --git a/contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp b/contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp index f132450ca359..92d9371b541f 100644 --- a/contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp +++ b/contrib/llvm/tools/lldb/source/Target/ProcessLaunchInfo.cpp @@ -35,498 +35,412 @@ using namespace lldb_private;  // ProcessLaunchInfo member functions  //---------------------------------------------------------------------------- -ProcessLaunchInfo::ProcessLaunchInfo() : -    ProcessInfo(), -    m_working_dir(), -    m_plugin_name(), -    m_flags(0), -    m_file_actions(), -    m_pty(new lldb_utility::PseudoTerminal), -    m_resume_count(0), -    m_monitor_callback(nullptr), -    m_monitor_callback_baton(nullptr), -    m_monitor_signals(false), -    m_listener_sp(), -    m_hijack_listener_sp() -{ -} +ProcessLaunchInfo::ProcessLaunchInfo() +    : ProcessInfo(), m_working_dir(), m_plugin_name(), m_flags(0), +      m_file_actions(), m_pty(new lldb_utility::PseudoTerminal), +      m_resume_count(0), m_monitor_callback(nullptr), +      m_monitor_callback_baton(nullptr), m_monitor_signals(false), +      m_listener_sp(), m_hijack_listener_sp() {}  ProcessLaunchInfo::ProcessLaunchInfo(const FileSpec &stdin_file_spec,                                       const FileSpec &stdout_file_spec,                                       const FileSpec &stderr_file_spec,                                       const FileSpec &working_directory, -                                     uint32_t launch_flags) : -    ProcessInfo(), -    m_working_dir(), -    m_plugin_name(), -    m_flags(launch_flags), -    m_file_actions(), -    m_pty(new lldb_utility::PseudoTerminal), -    m_resume_count(0), -    m_monitor_callback(nullptr), -    m_monitor_callback_baton(nullptr), -    m_monitor_signals(false), -    m_listener_sp (), -    m_hijack_listener_sp() -{ -    if (stdin_file_spec) -    { -        FileAction file_action; -        const bool read = true; -        const bool write = false; -        if (file_action.Open(STDIN_FILENO, stdin_file_spec, read, write)) -            AppendFileAction (file_action); -    } -    if (stdout_file_spec) -    { -        FileAction file_action; -        const bool read = false; -        const bool write = true; -        if (file_action.Open(STDOUT_FILENO, stdout_file_spec, read, write)) -            AppendFileAction (file_action); -    } -    if (stderr_file_spec) -    { -        FileAction file_action; -        const bool read = false; -        const bool write = true; -        if (file_action.Open(STDERR_FILENO, stderr_file_spec, read, write)) -            AppendFileAction (file_action); -    } -    if (working_directory) -        SetWorkingDirectory(working_directory); -} - -bool -ProcessLaunchInfo::AppendCloseFileAction (int fd) -{ +                                     uint32_t launch_flags) +    : ProcessInfo(), m_working_dir(), m_plugin_name(), m_flags(launch_flags), +      m_file_actions(), m_pty(new lldb_utility::PseudoTerminal), +      m_resume_count(0), m_monitor_callback(nullptr), +      m_monitor_callback_baton(nullptr), m_monitor_signals(false), +      m_listener_sp(), m_hijack_listener_sp() { +  if (stdin_file_spec) {      FileAction file_action; -    if (file_action.Close (fd)) -    { -        AppendFileAction (file_action); -        return true; -    } -    return false; +    const bool read = true; +    const bool write = false; +    if (file_action.Open(STDIN_FILENO, stdin_file_spec, read, write)) +      AppendFileAction(file_action); +  } +  if (stdout_file_spec) { +    FileAction file_action; +    const bool read = false; +    const bool write = true; +    if (file_action.Open(STDOUT_FILENO, stdout_file_spec, read, write)) +      AppendFileAction(file_action); +  } +  if (stderr_file_spec) { +    FileAction file_action; +    const bool read = false; +    const bool write = true; +    if (file_action.Open(STDERR_FILENO, stderr_file_spec, read, write)) +      AppendFileAction(file_action); +  } +  if (working_directory) +    SetWorkingDirectory(working_directory);  } -bool -ProcessLaunchInfo::AppendDuplicateFileAction (int fd, int dup_fd) -{ -    FileAction file_action; -    if (file_action.Duplicate (fd, dup_fd)) -    { -        AppendFileAction (file_action); -        return true; -    } -    return false; +bool ProcessLaunchInfo::AppendCloseFileAction(int fd) { +  FileAction file_action; +  if (file_action.Close(fd)) { +    AppendFileAction(file_action); +    return true; +  } +  return false;  } -bool -ProcessLaunchInfo::AppendOpenFileAction(int fd, const FileSpec &file_spec, -                                        bool read, bool write) -{ -    FileAction file_action; -    if (file_action.Open(fd, file_spec, read, write)) -    { -        AppendFileAction (file_action); -        return true; -    } -    return false; +bool ProcessLaunchInfo::AppendDuplicateFileAction(int fd, int dup_fd) { +  FileAction file_action; +  if (file_action.Duplicate(fd, dup_fd)) { +    AppendFileAction(file_action); +    return true; +  } +  return false;  } -bool -ProcessLaunchInfo::AppendSuppressFileAction (int fd, bool read, bool write) -{ -    FileAction file_action; -    if (file_action.Open(fd, FileSpec{FileSystem::DEV_NULL, false}, read, write)) -    { -        AppendFileAction (file_action); -        return true; -    } -    return false; +bool ProcessLaunchInfo::AppendOpenFileAction(int fd, const FileSpec &file_spec, +                                             bool read, bool write) { +  FileAction file_action; +  if (file_action.Open(fd, file_spec, read, write)) { +    AppendFileAction(file_action); +    return true; +  } +  return false;  } -const FileAction * -ProcessLaunchInfo::GetFileActionAtIndex(size_t idx) const -{ -    if (idx < m_file_actions.size()) -        return &m_file_actions[idx]; -    return nullptr; +bool ProcessLaunchInfo::AppendSuppressFileAction(int fd, bool read, +                                                 bool write) { +  FileAction file_action; +  if (file_action.Open(fd, FileSpec{FileSystem::DEV_NULL, false}, read, +                       write)) { +    AppendFileAction(file_action); +    return true; +  } +  return false;  } -const FileAction * -ProcessLaunchInfo::GetFileActionForFD(int fd) const -{ -    for (size_t idx=0, count=m_file_actions.size(); idx < count; ++idx) -    { -        if (m_file_actions[idx].GetFD () == fd) -            return &m_file_actions[idx]; -    } -    return nullptr; +const FileAction *ProcessLaunchInfo::GetFileActionAtIndex(size_t idx) const { +  if (idx < m_file_actions.size()) +    return &m_file_actions[idx]; +  return nullptr;  } -const FileSpec & -ProcessLaunchInfo::GetWorkingDirectory() const -{ -    return m_working_dir; +const FileAction *ProcessLaunchInfo::GetFileActionForFD(int fd) const { +  for (size_t idx = 0, count = m_file_actions.size(); idx < count; ++idx) { +    if (m_file_actions[idx].GetFD() == fd) +      return &m_file_actions[idx]; +  } +  return nullptr;  } -void -ProcessLaunchInfo::SetWorkingDirectory(const FileSpec &working_dir) -{ -    m_working_dir = working_dir; +const FileSpec &ProcessLaunchInfo::GetWorkingDirectory() const { +  return m_working_dir;  } -const char * -ProcessLaunchInfo::GetProcessPluginName () const -{ -    return (m_plugin_name.empty() ? nullptr : m_plugin_name.c_str()); +void ProcessLaunchInfo::SetWorkingDirectory(const FileSpec &working_dir) { +  m_working_dir = working_dir;  } -void -ProcessLaunchInfo::SetProcessPluginName (const char *plugin) -{ -    if (plugin && plugin[0]) -        m_plugin_name.assign (plugin); -    else -        m_plugin_name.clear(); +const char *ProcessLaunchInfo::GetProcessPluginName() const { +  return (m_plugin_name.empty() ? nullptr : m_plugin_name.c_str());  } -const FileSpec & -ProcessLaunchInfo::GetShell () const -{ -    return m_shell; +void ProcessLaunchInfo::SetProcessPluginName(llvm::StringRef plugin) { +  m_plugin_name = plugin;  } -void -ProcessLaunchInfo::SetShell (const FileSpec &shell) -{ -    m_shell = shell; -    if (m_shell) -    { -        m_shell.ResolveExecutableLocation(); -        m_flags.Set (lldb::eLaunchFlagLaunchInShell); -    } -    else -        m_flags.Clear (lldb::eLaunchFlagLaunchInShell); +const FileSpec &ProcessLaunchInfo::GetShell() const { return m_shell; } + +void ProcessLaunchInfo::SetShell(const FileSpec &shell) { +  m_shell = shell; +  if (m_shell) { +    m_shell.ResolveExecutableLocation(); +    m_flags.Set(lldb::eLaunchFlagLaunchInShell); +  } else +    m_flags.Clear(lldb::eLaunchFlagLaunchInShell);  } -void -ProcessLaunchInfo::SetLaunchInSeparateProcessGroup (bool separate) -{ -    if (separate) -        m_flags.Set(lldb::eLaunchFlagLaunchInSeparateProcessGroup); -    else -        m_flags.Clear (lldb::eLaunchFlagLaunchInSeparateProcessGroup); +void ProcessLaunchInfo::SetLaunchInSeparateProcessGroup(bool separate) { +  if (separate) +    m_flags.Set(lldb::eLaunchFlagLaunchInSeparateProcessGroup); +  else +    m_flags.Clear(lldb::eLaunchFlagLaunchInSeparateProcessGroup);  } -void -ProcessLaunchInfo::SetShellExpandArguments (bool expand) -{ -    if (expand) -        m_flags.Set(lldb::eLaunchFlagShellExpandArguments); -    else -        m_flags.Clear(lldb::eLaunchFlagShellExpandArguments); +void ProcessLaunchInfo::SetShellExpandArguments(bool expand) { +  if (expand) +    m_flags.Set(lldb::eLaunchFlagShellExpandArguments); +  else +    m_flags.Clear(lldb::eLaunchFlagShellExpandArguments);  } -void -ProcessLaunchInfo::Clear () -{ -    ProcessInfo::Clear(); -    m_working_dir.Clear(); -    m_plugin_name.clear(); -    m_shell.Clear(); -    m_flags.Clear(); -    m_file_actions.clear(); -    m_resume_count = 0; -    m_listener_sp.reset(); -    m_hijack_listener_sp.reset(); +void ProcessLaunchInfo::Clear() { +  ProcessInfo::Clear(); +  m_working_dir.Clear(); +  m_plugin_name.clear(); +  m_shell.Clear(); +  m_flags.Clear(); +  m_file_actions.clear(); +  m_resume_count = 0; +  m_listener_sp.reset(); +  m_hijack_listener_sp.reset();  } -void -ProcessLaunchInfo::SetMonitorProcessCallback(const Host::MonitorChildProcessCallback &callback, bool monitor_signals) -{ -    m_monitor_callback = callback; -    m_monitor_signals = monitor_signals; +void ProcessLaunchInfo::SetMonitorProcessCallback( +    const Host::MonitorChildProcessCallback &callback, bool monitor_signals) { +  m_monitor_callback = callback; +  m_monitor_signals = monitor_signals;  } -bool -ProcessLaunchInfo::MonitorProcess () const -{ -    if (m_monitor_callback && ProcessIDIsValid()) -    { -        Host::StartMonitoringChildProcess (m_monitor_callback, -                                           GetProcessID(), -                                           m_monitor_signals); -        return true; -    } -    return false; +bool ProcessLaunchInfo::MonitorProcess() const { +  if (m_monitor_callback && ProcessIDIsValid()) { +    Host::StartMonitoringChildProcess(m_monitor_callback, GetProcessID(), +                                      m_monitor_signals); +    return true; +  } +  return false;  } -void -ProcessLaunchInfo::SetDetachOnError (bool enable) -{ -    if (enable) -        m_flags.Set(lldb::eLaunchFlagDetachOnError); -    else -        m_flags.Clear(lldb::eLaunchFlagDetachOnError); +void ProcessLaunchInfo::SetDetachOnError(bool enable) { +  if (enable) +    m_flags.Set(lldb::eLaunchFlagDetachOnError); +  else +    m_flags.Clear(lldb::eLaunchFlagDetachOnError);  } -void -ProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); - -    // If nothing for stdin or stdout or stderr was specified, then check the process for any default -    // settings that were set with "settings set" -    if (GetFileActionForFD(STDIN_FILENO) == nullptr || -        GetFileActionForFD(STDOUT_FILENO) == nullptr || -        GetFileActionForFD(STDERR_FILENO) == nullptr) -    { +void ProcessLaunchInfo::FinalizeFileActions(Target *target, +                                            bool default_to_use_pty) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); + +  // If nothing for stdin or stdout or stderr was specified, then check the +  // process for any default +  // settings that were set with "settings set" +  if (GetFileActionForFD(STDIN_FILENO) == nullptr || +      GetFileActionForFD(STDOUT_FILENO) == nullptr || +      GetFileActionForFD(STDERR_FILENO) == nullptr) { +    if (log) +      log->Printf("ProcessLaunchInfo::%s at least one of stdin/stdout/stderr " +                  "was not set, evaluating default handling", +                  __FUNCTION__); + +    if (m_flags.Test(eLaunchFlagLaunchInTTY)) { +      // Do nothing, if we are launching in a remote terminal +      // no file actions should be done at all. +      return; +    } + +    if (m_flags.Test(eLaunchFlagDisableSTDIO)) { +      if (log) +        log->Printf("ProcessLaunchInfo::%s eLaunchFlagDisableSTDIO set, adding " +                    "suppression action for stdin, stdout and stderr", +                    __FUNCTION__); +      AppendSuppressFileAction(STDIN_FILENO, true, false); +      AppendSuppressFileAction(STDOUT_FILENO, false, true); +      AppendSuppressFileAction(STDERR_FILENO, false, true); +    } else { +      // Check for any values that might have gotten set with any of: +      // (lldb) settings set target.input-path +      // (lldb) settings set target.output-path +      // (lldb) settings set target.error-path +      FileSpec in_file_spec; +      FileSpec out_file_spec; +      FileSpec err_file_spec; +      if (target) { +        // Only override with the target settings if we don't already have +        // an action for in, out or error +        if (GetFileActionForFD(STDIN_FILENO) == nullptr) +          in_file_spec = target->GetStandardInputPath(); +        if (GetFileActionForFD(STDOUT_FILENO) == nullptr) +          out_file_spec = target->GetStandardOutputPath(); +        if (GetFileActionForFD(STDERR_FILENO) == nullptr) +          err_file_spec = target->GetStandardErrorPath(); +      } + +      if (log) +        log->Printf("ProcessLaunchInfo::%s target stdin='%s', target " +                    "stdout='%s', stderr='%s'", +                    __FUNCTION__, +                    in_file_spec ? in_file_spec.GetCString() : "<null>", +                    out_file_spec ? out_file_spec.GetCString() : "<null>", +                    err_file_spec ? err_file_spec.GetCString() : "<null>"); + +      if (in_file_spec) { +        AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false);          if (log) -            log->Printf ("ProcessLaunchInfo::%s at least one of stdin/stdout/stderr was not set, evaluating default handling", -                         __FUNCTION__); +          log->Printf( +              "ProcessLaunchInfo::%s appended stdin open file action for %s", +              __FUNCTION__, in_file_spec.GetCString()); +      } -        if (m_flags.Test(eLaunchFlagLaunchInTTY)) -        { -            // Do nothing, if we are launching in a remote terminal -            // no file actions should be done at all. -            return; -        } +      if (out_file_spec) { +        AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true); +        if (log) +          log->Printf( +              "ProcessLaunchInfo::%s appended stdout open file action for %s", +              __FUNCTION__, out_file_spec.GetCString()); +      } -        if (m_flags.Test(eLaunchFlagDisableSTDIO)) -        { -            if (log) -                log->Printf ("ProcessLaunchInfo::%s eLaunchFlagDisableSTDIO set, adding suppression action for stdin, stdout and stderr", -                             __FUNCTION__); -            AppendSuppressFileAction (STDIN_FILENO , true, false); -            AppendSuppressFileAction (STDOUT_FILENO, false, true); -            AppendSuppressFileAction (STDERR_FILENO, false, true); -        } -        else -        { -            // Check for any values that might have gotten set with any of: -            // (lldb) settings set target.input-path -            // (lldb) settings set target.output-path -            // (lldb) settings set target.error-path -            FileSpec in_file_spec; -            FileSpec out_file_spec; -            FileSpec err_file_spec; -            if (target) -            { -                // Only override with the target settings if we don't already have -                // an action for in, out or error -                if (GetFileActionForFD(STDIN_FILENO) == nullptr) -                    in_file_spec = target->GetStandardInputPath(); -                if (GetFileActionForFD(STDOUT_FILENO) == nullptr) -                    out_file_spec = target->GetStandardOutputPath(); -                if (GetFileActionForFD(STDERR_FILENO) == nullptr) -                    err_file_spec = target->GetStandardErrorPath(); -            } - -            if (log) -                log->Printf ("ProcessLaunchInfo::%s target stdin='%s', target stdout='%s', stderr='%s'", -                             __FUNCTION__, -                              in_file_spec ?  in_file_spec.GetCString() : "<null>", -                             out_file_spec ? out_file_spec.GetCString() : "<null>", -                             err_file_spec ? err_file_spec.GetCString() : "<null>"); - -            if (in_file_spec) -            { -                AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false); -                if (log) -                    log->Printf ("ProcessLaunchInfo::%s appended stdin open file action for %s", -                                 __FUNCTION__, in_file_spec.GetCString()); -            } - -            if (out_file_spec) -            { -                AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true); -                if (log) -                    log->Printf ("ProcessLaunchInfo::%s appended stdout open file action for %s", -                                 __FUNCTION__, out_file_spec.GetCString()); -            } - -            if (err_file_spec) -            { -                AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true); -                if (log) -                    log->Printf ("ProcessLaunchInfo::%s appended stderr open file action for %s", -                                 __FUNCTION__, err_file_spec.GetCString()); -            } - -            if (default_to_use_pty && (!in_file_spec || !out_file_spec || !err_file_spec)) -            { -                if (log) -                    log->Printf ("ProcessLaunchInfo::%s default_to_use_pty is set, and at least one stdin/stderr/stdout is unset, so generating a pty to use for it", -                                 __FUNCTION__); - -                int open_flags = O_RDWR | O_NOCTTY; -#if !defined(_MSC_VER) -                // We really shouldn't be specifying platform specific flags -                // that are intended for a system call in generic code.  But -                // this will have to do for now. -                open_flags |= O_CLOEXEC; +      if (err_file_spec) { +        AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true); +        if (log) +          log->Printf( +              "ProcessLaunchInfo::%s appended stderr open file action for %s", +              __FUNCTION__, err_file_spec.GetCString()); +      } + +      if (default_to_use_pty && +          (!in_file_spec || !out_file_spec || !err_file_spec)) { +        if (log) +          log->Printf("ProcessLaunchInfo::%s default_to_use_pty is set, and at " +                      "least one stdin/stderr/stdout is unset, so generating a " +                      "pty to use for it", +                      __FUNCTION__); + +        int open_flags = O_RDWR | O_NOCTTY; +#if !defined(_WIN32) +        // We really shouldn't be specifying platform specific flags +        // that are intended for a system call in generic code.  But +        // this will have to do for now. +        open_flags |= O_CLOEXEC;  #endif -                if (m_pty->OpenFirstAvailableMaster(open_flags, nullptr, 0)) -                { -                    const FileSpec slave_file_spec{m_pty->GetSlaveName(nullptr, 0), false}; - -                    // Only use the slave tty if we don't have anything specified for -                    // input and don't have an action for stdin -                    if (!in_file_spec && GetFileActionForFD(STDIN_FILENO) == nullptr) -                    { -                        AppendOpenFileAction(STDIN_FILENO, slave_file_spec, true, false); -                    } - -                    // Only use the slave tty if we don't have anything specified for -                    // output and don't have an action for stdout -                    if (!out_file_spec && GetFileActionForFD(STDOUT_FILENO) == nullptr) -                    { -                        AppendOpenFileAction(STDOUT_FILENO, slave_file_spec, false, true); -                    } - -                    // Only use the slave tty if we don't have anything specified for -                    // error and don't have an action for stderr -                    if (!err_file_spec && GetFileActionForFD(STDERR_FILENO) == nullptr) -                    { -                        AppendOpenFileAction(STDERR_FILENO, slave_file_spec, false, true); -                    } -                } -            } +        if (m_pty->OpenFirstAvailableMaster(open_flags, nullptr, 0)) { +          const FileSpec slave_file_spec{m_pty->GetSlaveName(nullptr, 0), +                                         false}; + +          // Only use the slave tty if we don't have anything specified for +          // input and don't have an action for stdin +          if (!in_file_spec && GetFileActionForFD(STDIN_FILENO) == nullptr) { +            AppendOpenFileAction(STDIN_FILENO, slave_file_spec, true, false); +          } + +          // Only use the slave tty if we don't have anything specified for +          // output and don't have an action for stdout +          if (!out_file_spec && GetFileActionForFD(STDOUT_FILENO) == nullptr) { +            AppendOpenFileAction(STDOUT_FILENO, slave_file_spec, false, true); +          } + +          // Only use the slave tty if we don't have anything specified for +          // error and don't have an action for stderr +          if (!err_file_spec && GetFileActionForFD(STDERR_FILENO) == nullptr) { +            AppendOpenFileAction(STDERR_FILENO, slave_file_spec, false, true); +          }          } +      }      } +  }  } -bool -ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, -                                                        bool localhost, -                                                        bool will_debug, -                                                        bool first_arg_is_full_shell_command, -                                                        int32_t num_resumes) -{ -    error.Clear(); - -    if (GetFlags().Test (eLaunchFlagLaunchInShell)) -    { -        if (m_shell) +bool ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell( +    Error &error, bool localhost, bool will_debug, +    bool first_arg_is_full_shell_command, int32_t num_resumes) { +  error.Clear(); + +  if (GetFlags().Test(eLaunchFlagLaunchInShell)) { +    if (m_shell) { +      std::string shell_executable = m_shell.GetPath(); + +      const char **argv = GetArguments().GetConstArgumentVector(); +      if (argv == nullptr || argv[0] == nullptr) +        return false; +      Args shell_arguments; +      std::string safe_arg; +      shell_arguments.AppendArgument(shell_executable); +      const llvm::Triple &triple = GetArchitecture().GetTriple(); +      if (triple.getOS() == llvm::Triple::Win32 && +          !triple.isWindowsCygwinEnvironment()) +        shell_arguments.AppendArgument(llvm::StringRef("/C")); +      else +        shell_arguments.AppendArgument(llvm::StringRef("-c")); + +      StreamString shell_command; +      if (will_debug) { +        // Add a modified PATH environment variable in case argv[0] +        // is a relative path. +        const char *argv0 = argv[0]; +        FileSpec arg_spec(argv0, false); +        if (arg_spec.IsRelative()) { +          // We have a relative path to our executable which may not work if +          // we just try to run "a.out" (without it being converted to +          // "./a.out") +          FileSpec working_dir = GetWorkingDirectory(); +          // Be sure to put quotes around PATH's value in case any paths have +          // spaces... +          std::string new_path("PATH=\""); +          const size_t empty_path_len = new_path.size(); + +          if (working_dir) { +            new_path += working_dir.GetPath(); +          } else { +            char current_working_dir[PATH_MAX]; +            const char *cwd = +                getcwd(current_working_dir, sizeof(current_working_dir)); +            if (cwd && cwd[0]) +              new_path += cwd; +          } +          std::string curr_path; +          if (HostInfo::GetEnvironmentVar("PATH", curr_path)) { +            if (new_path.size() > empty_path_len) +              new_path += ':'; +            new_path += curr_path; +          } +          new_path += "\" "; +          shell_command.PutCString(new_path); +        } + +        if (triple.getOS() != llvm::Triple::Win32 || +            triple.isWindowsCygwinEnvironment()) +          shell_command.PutCString("exec"); + +        // Only Apple supports /usr/bin/arch being able to specify the +        // architecture +        if (GetArchitecture().IsValid() && // Valid architecture +            GetArchitecture().GetTriple().getVendor() == +                llvm::Triple::Apple && // Apple only +            GetArchitecture().GetCore() != +                ArchSpec::eCore_x86_64_x86_64h) // Don't do this for x86_64h          { -            std::string shell_executable = m_shell.GetPath(); - -            const char **argv = GetArguments().GetConstArgumentVector (); -            if (argv == nullptr || argv[0] == nullptr) -                return false; -            Args shell_arguments; -            std::string safe_arg; -            shell_arguments.AppendArgument (shell_executable.c_str()); -            const llvm::Triple &triple = GetArchitecture().GetTriple(); -            if (triple.getOS() == llvm::Triple::Win32 && !triple.isWindowsCygwinEnvironment()) -                shell_arguments.AppendArgument("/C"); -            else -                shell_arguments.AppendArgument("-c"); - -            StreamString shell_command; -            if (will_debug) -            { -                // Add a modified PATH environment variable in case argv[0] -                // is a relative path. -                const char *argv0 = argv[0]; -                FileSpec arg_spec(argv0, false); -                if (arg_spec.IsRelative()) -                { -                    // We have a relative path to our executable which may not work if -                    // we just try to run "a.out" (without it being converted to "./a.out") -                    FileSpec working_dir = GetWorkingDirectory(); -                    // Be sure to put quotes around PATH's value in case any paths have spaces... -                    std::string new_path("PATH=\""); -                    const size_t empty_path_len = new_path.size(); - -                    if (working_dir) -                    { -                        new_path += working_dir.GetPath(); -                    } -                    else -                    { -                        char current_working_dir[PATH_MAX]; -                        const char *cwd = getcwd(current_working_dir, sizeof(current_working_dir)); -                        if (cwd && cwd[0]) -                            new_path += cwd; -                    } -                    std::string curr_path; -                    if (HostInfo::GetEnvironmentVar("PATH", curr_path)) -                    { -                        if (new_path.size() > empty_path_len) -                            new_path += ':'; -                        new_path += curr_path; -                    } -                    new_path += "\" "; -                    shell_command.PutCString(new_path.c_str()); -                } - -                if (triple.getOS() != llvm::Triple::Win32 || triple.isWindowsCygwinEnvironment()) -                    shell_command.PutCString("exec"); - -                // Only Apple supports /usr/bin/arch being able to specify the architecture -                if (GetArchitecture().IsValid() &&                                          // Valid architecture -                    GetArchitecture().GetTriple().getVendor() == llvm::Triple::Apple &&     // Apple only -                    GetArchitecture().GetCore() != ArchSpec::eCore_x86_64_x86_64h)          // Don't do this for x86_64h -                { -                    shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName()); -                    // Set the resume count to 2: -                    // 1 - stop in shell -                    // 2 - stop in /usr/bin/arch -                    // 3 - then we will stop in our program -                    SetResumeCount(num_resumes + 1); -                } -                else -                { -                    // Set the resume count to 1: -                    // 1 - stop in shell -                    // 2 - then we will stop in our program -                    SetResumeCount(num_resumes); -                } -            } - -            if (first_arg_is_full_shell_command) -            { -                // There should only be one argument that is the shell command itself to be used as is -                if (argv[0] && !argv[1]) -                    shell_command.Printf("%s", argv[0]); -                else -                    return false; -            } -            else -            { -                for (size_t i=0; argv[i] != nullptr; ++i) -                { -                    const char *arg = Args::GetShellSafeArgument (m_shell, -                                                                  argv[i], -                                                                  safe_arg); -                    shell_command.Printf(" %s", arg); -                } -            } -            shell_arguments.AppendArgument (shell_command.GetString().c_str()); -            m_executable = m_shell; -            m_arguments = shell_arguments; -            return true; +          shell_command.Printf(" /usr/bin/arch -arch %s", +                               GetArchitecture().GetArchitectureName()); +          // Set the resume count to 2: +          // 1 - stop in shell +          // 2 - stop in /usr/bin/arch +          // 3 - then we will stop in our program +          SetResumeCount(num_resumes + 1); +        } else { +          // Set the resume count to 1: +          // 1 - stop in shell +          // 2 - then we will stop in our program +          SetResumeCount(num_resumes);          } +      } + +      if (first_arg_is_full_shell_command) { +        // There should only be one argument that is the shell command itself to +        // be used as is +        if (argv[0] && !argv[1]) +          shell_command.Printf("%s", argv[0]);          else -        { -            error.SetErrorString ("invalid shell path"); +          return false; +      } else { +        for (size_t i = 0; argv[i] != nullptr; ++i) { +          const char *arg = +              Args::GetShellSafeArgument(m_shell, argv[i], safe_arg); +          shell_command.Printf(" %s", arg);          } +      } +      shell_arguments.AppendArgument(shell_command.GetString()); +      m_executable = m_shell; +      m_arguments = shell_arguments; +      return true; +    } else { +      error.SetErrorString("invalid shell path");      } -    else -    { -        error.SetErrorString ("not launching in shell"); -    } -    return false; +  } else { +    error.SetErrorString("not launching in shell"); +  } +  return false;  } -ListenerSP -ProcessLaunchInfo::GetListenerForProcess (Debugger &debugger) -{ -    if (m_listener_sp) -        return m_listener_sp; -    else -        return debugger.GetListener(); +ListenerSP ProcessLaunchInfo::GetListenerForProcess(Debugger &debugger) { +  if (m_listener_sp) +    return m_listener_sp; +  else +    return debugger.GetListener();  }  | 
