================
@@ -285,6 +304,117 @@ static llvm::Error
LaunchRunInTerminalTarget(llvm::opt::Arg &target_arg,
#endif
lldb_private::FileSystem::Initialize();
+
+#ifdef _WIN32
+ RunInTerminalLauncherCommChannel comm_channel(comm_file);
+
+ llvm::ArrayRef<const char *> args_arr = llvm::ArrayRef(argv, argc);
+ auto wcommandLineOrErr =
+ lldb_private::GetFlattenedWindowsCommandStringW(args_arr);
+ if (!wcommandLineOrErr)
+ return notifyError(comm_channel, "Failed to process arguments");
+
+ STARTUPINFOEXW startupinfoex = {};
+ startupinfoex.StartupInfo.cb = sizeof(STARTUPINFOEXW);
+ startupinfoex.StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+
+ HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
+ HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+ HANDLE stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
+
+ auto attributelist_or_err =
+ lldb_private::ProcThreadAttributeList::Create(startupinfoex);
+ if (!attributelist_or_err) {
+ return notifyError(comm_channel, "Could not open inherited handles",
+ attributelist_or_err.getError());
+ }
+
+ if (!stdio.empty()) {
+ llvm::SmallVector<llvm::StringRef, 3> files;
+ stdio.split(files, ';');
+ while (files.size() < 3)
+ files.push_back(files.back());
+
+ stdin_handle = lldb_private::ProcessLauncherWindows::GetStdioHandle(
+ files[0], STDIN_FILENO);
+ stdout_handle = lldb_private::ProcessLauncherWindows::GetStdioHandle(
+ files[1], STDOUT_FILENO);
+ stderr_handle = lldb_private::ProcessLauncherWindows::GetStdioHandle(
+ files[2], STDERR_FILENO);
+ }
+
+ llvm::scope_exit close_handles([&] {
+ // Only close the handles we created
+ if (stdio.empty())
+ return;
+ if (stdin_handle)
+ CloseHandle(stdin_handle);
+ if (stdout_handle)
+ CloseHandle(stdout_handle);
+ if (stderr_handle)
+ CloseHandle(stderr_handle);
+ });
+
+ auto inherited_handles_or_err =
+ lldb_private::ProcessLauncherWindows::GetInheritedHandles(
+ startupinfoex, /*launch_info*=*/nullptr, stdout_handle,
stderr_handle,
+ stdin_handle);
+
+ if (!inherited_handles_or_err)
+ return notifyError(comm_channel, "Failed to get inherited handles",
+ inherited_handles_or_err.getError());
+ std::vector<HANDLE> inherited_handles = std::move(*inherited_handles_or_err);
+
+ PROCESS_INFORMATION pi = {};
+
+ // Start the process in a suspended state, while we attach the debugger.
+ BOOL result = CreateProcessW(
+ /*lpApplicationName=*/NULL, /*lpCommandLine=*/&(*wcommandLineOrErr)[0],
----------------
Nerixyz wrote:
```suggestion
/*lpApplicationName=*/NULL, /*lpCommandLine=*/wcommandLineOrErr->c_str(),
```
If this is an `llvm::Expected<std::wstring>`.
https://github.com/llvm/llvm-project/pull/174635
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits