From: Pavel Labath Date: Thu, 30 Dec 2021 14:02:23 +0000 (+0100) Subject: [lldb/qemu] More flexible emulator specification X-Git-Tag: upstream/15.0.7~21997 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9b8f9d33dbbcd6525ab4d582cb9abb6f98e3601c;p=platform%2Fupstream%2Fllvm.git [lldb/qemu] More flexible emulator specification This small patch adds two useful improvements: - allows one to specify the emulator path as a bare filename, and have it be looked up in the PATH - allows one to leave the path empty and have the filename be derived from the architecture. --- diff --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp index 67c9484..572a5b3 100644 --- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp +++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp @@ -162,7 +162,10 @@ lldb::ProcessSP PlatformQemuUser::DebugProcess(ProcessLaunchInfo &launch_info, Target &target, Status &error) { Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PLATFORM); - std::string qemu = GetGlobalProperties().GetEmulatorPath().GetPath(); + FileSpec qemu = GetGlobalProperties().GetEmulatorPath(); + if (!qemu) + qemu.SetPath(("qemu-" + GetGlobalProperties().GetArchitecture()).str()); + FileSystem::Instance().ResolveExecutableLocation(qemu); llvm::SmallString<0> socket_model, socket_path; HostInfo::GetProcessTempDir().GetPath(socket_model); @@ -171,7 +174,7 @@ lldb::ProcessSP PlatformQemuUser::DebugProcess(ProcessLaunchInfo &launch_info, llvm::sys::fs::createUniquePath(socket_model, socket_path, false); } while (FileSystem::Instance().Exists(socket_path)); - Args args({qemu, "-g", socket_path}); + Args args({qemu.GetPath(), "-g", socket_path}); args.AppendArguments(GetGlobalProperties().GetEmulatorArgs()); args.AppendArgument("--"); args.AppendArgument(launch_info.GetExecutableFile().GetPath()); diff --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td index 4e8fbcf..c7ec4bb 100644 --- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td +++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td @@ -8,7 +8,7 @@ let Definition = "platformqemuuser" in { def EmulatorPath: Property<"emulator-path", "FileSpec">, Global, DefaultStringValue<"">, - Desc<"Path to the emulator binary.">; + Desc<"Path to the emulator binary. If the path does not contain a directory separator, the filename is looked up in the PATH environment variable. If empty, the filename is derived from the architecture setting.">; def EmulatorArgs: Property<"emulator-args", "Args">, Global, DefaultStringValue<"">, diff --git a/lldb/test/API/qemu/TestQemuLaunch.py b/lldb/test/API/qemu/TestQemuLaunch.py index 2e817ed..01c4143 100644 --- a/lldb/test/API/qemu/TestQemuLaunch.py +++ b/lldb/test/API/qemu/TestQemuLaunch.py @@ -154,6 +154,24 @@ class TestQemuLaunch(TestBase): state = json.load(s) self.assertEqual(state["stdin"], "STDIN CONTENT") + def test_find_in_PATH(self): + emulator = self.getBuildArtifact("qemu-" + self.getArchitecture()) + os.rename(self.getBuildArtifact("qemu.py"), emulator) + self.set_emulator_setting("emulator-path", "''") + + original_path = os.environ["PATH"] + os.environ["PATH"] = (self.getBuildDir() + + self.platformContext.shlib_path_separator + original_path) + def cleanup(): + os.environ["PATH"] = original_path + + self.addTearDownHook(cleanup) + state = self._run_and_get_state() + + self.assertEqual(state["program"], self.getBuildArtifact()) + self.assertEqual(state["args"], + ["dump:" + self.getBuildArtifact("state.log")]) + def test_bad_emulator_path(self): self.set_emulator_setting("emulator-path", self.getBuildArtifact("nonexistent.file"))