Author: Alvin Wong Date: 2022-06-22T17:16:05+03:00 New Revision: 2bae9560575362ffd756f193efa1de2d5c2f4cfd
URL: https://github.com/llvm/llvm-project/commit/2bae9560575362ffd756f193efa1de2d5c2f4cfd DIFF: https://github.com/llvm/llvm-project/commit/2bae9560575362ffd756f193efa1de2d5c2f4cfd.diff LOG: [lldb] Resolve exe location for `target create` This fixes an issue that, when you start lldb or use `target create` with a program name which is on $PATH, or not specify the .exe suffix of a program in the working directory on Windows, you get a confusing error, for example: (lldb) target create notepad error: 'C:\WINDOWS\SYSTEM32\notepad.exe' doesn't contain any 'host' platform architectures: i686, x86_64, i386, i386 Fixes https://github.com/mstorsjo/llvm-mingw/issues/265 Reviewed By: DavidSpickett Differential Revision: https://reviews.llvm.org/D127436 Added: lldb/test/Shell/Commands/command-target-create-resolve-exe.test Modified: lldb/source/Commands/CommandObjectTarget.cpp lldb/source/Target/TargetList.cpp Removed: ################################################################################ diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 7789698c1d678..23ebbdb64d028 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -299,12 +299,6 @@ class CommandObjectTargetCreate : public CommandObjectParsed { const char *file_path = command.GetArgumentAtIndex(0); LLDB_SCOPED_TIMERF("(lldb) target create '%s'", file_path); - FileSpec file_spec; - - if (file_path) { - file_spec.SetFile(file_path, FileSpec::Style::native); - FileSystem::Instance().Resolve(file_spec); - } bool must_set_platform_path = false; @@ -333,6 +327,18 @@ class CommandObjectTargetCreate : public CommandObjectParsed { PlatformSP platform_sp = target_sp->GetPlatform(); + FileSpec file_spec; + if (file_path) { + file_spec.SetFile(file_path, FileSpec::Style::native); + FileSystem::Instance().Resolve(file_spec); + + // Try to resolve the exe based on PATH and/or platform-specific + // suffixes, but only if using the host platform. + if (platform_sp && platform_sp->IsHost() && + !FileSystem::Instance().Exists(file_spec)) + FileSystem::Instance().ResolveExecutableLocation(file_spec); + } + if (remote_file) { if (platform_sp) { // I have a remote file.. two possible cases diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index 72b50811b8745..214e98ee91edb 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -121,6 +121,14 @@ Status TargetList::CreateTargetInternal( if (!user_exe_path.empty()) { ModuleSpec module_spec(FileSpec(user_exe_path, FileSpec::Style::native)); FileSystem::Instance().Resolve(module_spec.GetFileSpec()); + + // Try to resolve the exe based on PATH and/or platform-specific suffixes, + // but only if using the host platform. + if (platform_sp->IsHost() && + !FileSystem::Instance().Exists(module_spec.GetFileSpec())) + FileSystem::Instance().ResolveExecutableLocation( + module_spec.GetFileSpec()); + // Resolve the executable in case we are given a path to a application // bundle like a .app bundle on MacOSX. Host::ResolveExecutableInBundle(module_spec.GetFileSpec()); diff --git a/lldb/test/Shell/Commands/command-target-create-resolve-exe.test b/lldb/test/Shell/Commands/command-target-create-resolve-exe.test new file mode 100644 index 0000000000000..30263217ede1d --- /dev/null +++ b/lldb/test/Shell/Commands/command-target-create-resolve-exe.test @@ -0,0 +1,28 @@ +# REQUIRES: system-windows + +## This checks that when starting lldb (or using `target create`) with a +## program name which is on $PATH, or not specify the .exe suffix of a program +## in the working directory on Windows, lldb can still detect the target +## architecture correctly instead of producing an error. + +# RUN: mkdir -p "%t.dir" +# RUN: %clang_host -g0 -O0 %S/Inputs/main.c -o %t.dir/testmain.exe + +## Test with full path to exe +# RUN: %lldb %t.dir/testmain.exe -b | FileCheck %s + +## Test with exe on path, with .exe suffix +# RUN: env "PATH=%t.dir;%PATH%" %lldb testmain.exe -b | FileCheck %s + +## Test with exe on path, without .exe suffix +# RUN: env "PATH=%t.dir;%PATH%" %lldb testmain -b | FileCheck %s + +## Test in cwd, with .exe suffix +# RUN: cd "%t.dir" && %lldb testmain.exe -b | FileCheck %s + +## Test in cwd, without .exe suffix +# RUN: cd "%t.dir" && %lldb testmain -b | FileCheck %s + +# CHECK-LABEL: target create +# CHECK-NEXT: Current executable set to '{{.*[/\\]}}testmain.exe' +# CHECK-NOT: Error _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits