Author: Charles Zablit Date: 2026-06-17T16:24:47+01:00 New Revision: e12ce86b96bd008d9adf682005c00e133c7daf5b
URL: https://github.com/llvm/llvm-project/commit/e12ce86b96bd008d9adf682005c00e133c7daf5b DIFF: https://github.com/llvm/llvm-project/commit/e12ce86b96bd008d9adf682005c00e133c7daf5b.diff LOG: [lldb][gdb-remote] Send argv[0] in remote target's separator style on launch (#204134) When lldb launches an inferior on a remote stub via the A or vRun packet, `ProcessGDBRemote::DoLaunch` currently sends the executable path through `FileSpec::GetPath(denormalize=true)`. That uses the FileSpec's `m_style`, which is the lldb client host's native style by default, not the remote target's. So a Windows lldb client launching on a POSIX remote sent the path with backslashes, so the remote tried to launch a file that didn't exist. The fix re-normalizes the `FileSpec` with the target's triple before denormalizing, so path uses the remote's native separators. This is only done when the target's OS is actually known. When it isn't, we keep the historical host-native behavior, since tests and callers that only set arch (e.g. QLaunchArch:x86_64 with no qHostInfo OS) have always relied on the old default. This fixes `TestNoLocalFile` on Windows with `LLDB_USE_LLDB_SERVER=1`. rdar://179932755 Added: Modified: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 5f59cbeb2dda0..a986d0350bf57 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -875,8 +875,19 @@ Status ProcessGDBRemote::DoLaunch(lldb_private::Module *exe_module, // Since we can't send argv0 separate from the executable path, we need to // make sure to use the actual executable path found in the launch_info... Args args = launch_info.GetArguments(); - if (FileSpec exe_file = launch_info.GetExecutableFile()) - args.ReplaceArgumentAtIndex(0, exe_file.GetPath(/*denormalize=*/true)); + if (FileSpec exe_file = launch_info.GetExecutableFile()) { + const llvm::Triple &remote_triple = + GetTarget().GetArchitecture().GetTriple(); + if (remote_triple.getOS() != llvm::Triple::UnknownOS) { + FileSpec remote_exe_file(exe_file.GetPath(/*denormalize=*/false), + remote_triple); + args.ReplaceArgumentAtIndex( + 0, remote_exe_file.GetPath(/*denormalize=*/true)); + } else { + args.ReplaceArgumentAtIndex(0, + exe_file.GetPath(/*denormalize=*/true)); + } + } if (llvm::Error err = m_gdb_comm.LaunchProcess(args)) { error = Status::FromErrorStringWithFormatv( "Cannot launch '{0}': {1}", args.GetArgumentAtIndex(0), _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
