180814287SRaphael Isemann //===-- MonitoringProcessLauncher.cpp -------------------------------------===// 2172d37d3SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6172d37d3SZachary Turner // 7172d37d3SZachary Turner //===----------------------------------------------------------------------===// 8172d37d3SZachary Turner 9b9c1b51eSKate Stone #include "lldb/Host/MonitoringProcessLauncher.h" 102c22c800SJonas Devlieghere #include "lldb/Host/FileSystem.h" 11172d37d3SZachary Turner #include "lldb/Host/HostProcess.h" 12eef758e9SPavel Labath #include "lldb/Host/ProcessLaunchInfo.h" 13c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h" 146f9e6901SZachary Turner #include "lldb/Utility/Log.h" 15172d37d3SZachary Turner 167d86ee5aSZachary Turner #include "llvm/Support/FileSystem.h" 177d86ee5aSZachary Turner 18172d37d3SZachary Turner using namespace lldb; 19172d37d3SZachary Turner using namespace lldb_private; 20172d37d3SZachary Turner MonitoringProcessLauncher(std::unique_ptr<ProcessLauncher> delegate_launcher)21b9c1b51eSKate StoneMonitoringProcessLauncher::MonitoringProcessLauncher( 22b9c1b51eSKate Stone std::unique_ptr<ProcessLauncher> delegate_launcher) 23b9c1b51eSKate Stone : m_delegate_launcher(std::move(delegate_launcher)) {} 24172d37d3SZachary Turner 25172d37d3SZachary Turner HostProcess LaunchProcess(const ProcessLaunchInfo & launch_info,Status & error)26b9c1b51eSKate StoneMonitoringProcessLauncher::LaunchProcess(const ProcessLaunchInfo &launch_info, 2797206d57SZachary Turner Status &error) { 28172d37d3SZachary Turner ProcessLaunchInfo resolved_info(launch_info); 29172d37d3SZachary Turner 30172d37d3SZachary Turner error.Clear(); 31172d37d3SZachary Turner 320bbe9a7aSJonas Devlieghere FileSystem &fs = FileSystem::Instance(); 33172d37d3SZachary Turner FileSpec exe_spec(resolved_info.GetExecutableFile()); 34172d37d3SZachary Turner 350bbe9a7aSJonas Devlieghere if (!fs.Exists(exe_spec)) 368f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(exe_spec); 37172d37d3SZachary Turner 380bbe9a7aSJonas Devlieghere if (!fs.Exists(exe_spec)) 390bbe9a7aSJonas Devlieghere FileSystem::Instance().ResolveExecutableLocation(exe_spec); 400bbe9a7aSJonas Devlieghere 410bbe9a7aSJonas Devlieghere if (!fs.Exists(exe_spec)) { 4291f14e69SPavel Labath error.SetErrorStringWithFormatv("executable doesn't exist: '{0}'", 4391f14e69SPavel Labath exe_spec); 44172d37d3SZachary Turner return HostProcess(); 45172d37d3SZachary Turner } 46172d37d3SZachary Turner 47172d37d3SZachary Turner resolved_info.SetExecutableFile(exe_spec, false); 48172d37d3SZachary Turner assert(!resolved_info.GetFlags().Test(eLaunchFlagLaunchInTTY)); 49172d37d3SZachary Turner 50b9c1b51eSKate Stone HostProcess process = 51b9c1b51eSKate Stone m_delegate_launcher->LaunchProcess(resolved_info, error); 52172d37d3SZachary Turner 53b9c1b51eSKate Stone if (process.GetProcessId() != LLDB_INVALID_PROCESS_ID) { 54a007a6d8SPavel Labath Log *log = GetLog(LLDBLog::Process); 55172d37d3SZachary Turner 56245dd2e0SPavel Labath assert(launch_info.GetMonitorProcessCallback()); 5723d10f7aSFangrui Song llvm::Expected<HostThread> maybe_thread = 58*12c9c4a8SPavel Labath process.StartMonitoring(launch_info.GetMonitorProcessCallback()); 5923d10f7aSFangrui Song if (!maybe_thread) 6023d10f7aSFangrui Song error.SetErrorStringWithFormatv("failed to launch host thread: {}", 6123d10f7aSFangrui Song llvm::toString(maybe_thread.takeError())); 62172d37d3SZachary Turner if (log) 63172d37d3SZachary Turner log->PutCString("started monitoring child process."); 64b9c1b51eSKate Stone } else { 65172d37d3SZachary Turner // Invalid process ID, something didn't go well 66172d37d3SZachary Turner if (error.Success()) 67172d37d3SZachary Turner error.SetErrorString("process launch failed for unknown reasons"); 68172d37d3SZachary Turner } 69172d37d3SZachary Turner return process; 70172d37d3SZachary Turner } 71