Author: walter erquinigo Date: 2024-11-05T13:29:51-05:00 New Revision: e952728f88c8b0e0208dc991dd9a04fe8c211cfb
URL: https://github.com/llvm/llvm-project/commit/e952728f88c8b0e0208dc991dd9a04fe8c211cfb DIFF: https://github.com/llvm/llvm-project/commit/e952728f88c8b0e0208dc991dd9a04fe8c211cfb.diff LOG: [LLDB] Retry Add a target.launch-working-dir setting This retries the PR 113521 skipping a test in a remote environment. Added: Modified: lldb/include/lldb/Target/Target.h lldb/source/Commands/CommandObjectProcess.cpp lldb/source/Commands/Options.td lldb/source/Target/Target.cpp lldb/source/Target/TargetProperties.td lldb/test/API/commands/process/launch/TestProcessLaunch.py llvm/docs/ReleaseNotes.md Removed: ################################################################################ diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h index e4848f19e64d62..cab21c29a7486f 100644 --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -37,6 +37,7 @@ #include "lldb/Utility/RealpathPrefixes.h" #include "lldb/Utility/Timeout.h" #include "lldb/lldb-public.h" +#include "llvm/ADT/StringRef.h" namespace lldb_private { @@ -114,6 +115,8 @@ class TargetProperties : public Properties { void SetDisableSTDIO(bool b); + llvm::StringRef GetLaunchWorkingDirectory() const; + const char *GetDisassemblyFlavor() const; InlineStrategy GetInlineStrategy() const; diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index e7c7d07ad47722..7444e46aa729e7 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -201,6 +201,13 @@ class CommandObjectProcessLaunch : public CommandObjectProcessLaunchOrAttach { if (target->GetDisableSTDIO()) m_options.launch_info.GetFlags().Set(eLaunchFlagDisableSTDIO); + if (!m_options.launch_info.GetWorkingDirectory()) { + if (llvm::StringRef wd = target->GetLaunchWorkingDirectory(); + !wd.empty()) { + m_options.launch_info.SetWorkingDirectory(FileSpec(wd)); + } + } + // Merge the launch info environment with the target environment. Environment target_env = target->GetEnvironment(); m_options.launch_info.GetEnvironment().insert(target_env.begin(), diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 4276d9e7f9c8b0..9d8d45d083eca4 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -691,7 +691,10 @@ let Command = "process launch" in { def process_launch_plugin : Option<"plugin", "P">, Arg<"Plugin">, Desc<"Name of the process plugin you want to use.">; def process_launch_working_dir : Option<"working-dir", "w">, Arg<"DirectoryName">, - Desc<"Set the current working directory to <path> when running the inferior.">; + Desc<"Set the current working directory to <path> when running the inferior. This option " + "applies only to the current `process launch` invocation. If " + "`target.launch-working-dir` is set and this option is given, the value of this " + "option will be used instead of the setting.">; def process_launch_arch : Option<"arch", "a">, Arg<"Architecture">, Desc<"Set the architecture for the process to launch when ambiguous.">; def process_launch_environment : Option<"environment", "E">, diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 8cd3fa8af6bae1..242d2eaec2a15a 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -4471,6 +4471,11 @@ void TargetProperties::SetDisableSTDIO(bool b) { const uint32_t idx = ePropertyDisableSTDIO; SetPropertyAtIndex(idx, b); } +llvm::StringRef TargetProperties::GetLaunchWorkingDirectory() const { + const uint32_t idx = ePropertyLaunchWorkingDir; + return GetPropertyAtIndexAs<llvm::StringRef>( + idx, g_target_properties[idx].default_cstr_value); +} const char *TargetProperties::GetDisassemblyFlavor() const { const uint32_t idx = ePropertyDisassemblyFlavor; diff --git a/lldb/source/Target/TargetProperties.td b/lldb/source/Target/TargetProperties.td index fb61478fb752dc..00ad8dd2a9f7f9 100644 --- a/lldb/source/Target/TargetProperties.td +++ b/lldb/source/Target/TargetProperties.td @@ -201,6 +201,13 @@ let Definition = "target" in { def DebugUtilityExpression: Property<"debug-utility-expression", "Boolean">, DefaultFalse, Desc<"Enable debugging of LLDB-internal utility expressions.">; + def LaunchWorkingDir: Property<"launch-working-dir", "String">, + DefaultStringValue<"">, + Desc<"A default value for the working directory to use when launching processes. " + "It is ignored when empty. This setting is only used when the target is " + "launched. If you change this setting, the new value will only apply to " + "subsequent launches. Commands that take an explicit working directory " + "will override this setting.">; } let Definition = "process_experimental" in { diff --git a/lldb/test/API/commands/process/launch/TestProcessLaunch.py b/lldb/test/API/commands/process/launch/TestProcessLaunch.py index 45f9f494ab8f5c..2d23c0a48960e1 100644 --- a/lldb/test/API/commands/process/launch/TestProcessLaunch.py +++ b/lldb/test/API/commands/process/launch/TestProcessLaunch.py @@ -8,6 +8,7 @@ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil +from pathlib import Path class ProcessLaunchTestCase(TestBase): @@ -206,3 +207,60 @@ def test_environment_with_special_char(self): self.assertEqual(value, evil_var) process.Continue() self.assertState(process.GetState(), lldb.eStateExited, PROCESS_EXITED) + + @skipIfRemote + def test_target_launch_working_dir_prop(self): + """Test that the setting `target.launch-working-dir` is correctly used when launching a process.""" + d = {"CXX_SOURCES": "print_cwd.cpp"} + self.build(dictionary=d) + self.setTearDownCleanup(d) + exe = self.getBuildArtifact("a.out") + self.runCmd("file " + exe) + + mywd = "my_working_dir" + out_file_name = "my_working_dir_test.out" + + my_working_dir_path = self.getBuildArtifact(mywd) + lldbutil.mkdir_p(my_working_dir_path) + out_file_path = os.path.join(my_working_dir_path, out_file_name) + another_working_dir_path = Path( + os.path.join(my_working_dir_path, "..") + ).resolve() + + # If -w is not passed to process launch, then the setting will be used. + self.runCmd( + f"settings set target.launch-working-dir {another_working_dir_path}" + ) + launch_command = f"process launch -o {out_file_path}" + + self.expect( + launch_command, + patterns=["Process .* launched: .*a.out"], + ) + + out = lldbutil.read_file_on_target(self, out_file_path) + + self.assertIn(f"stdout: {another_working_dir_path}", out) + + # If -w is passed to process launch, that value will be used instead of the setting. + launch_command = f"process launch -w {my_working_dir_path} -o {out_file_path}" + + self.expect( + launch_command, + patterns=["Process .* launched: .*a.out"], + ) + + out = lldbutil.read_file_on_target(self, out_file_path) + self.assertIn(f"stdout: {my_working_dir_path}", out) + + # If set to empty, then LLDB's cwd will be used to launch the process. + self.runCmd(f"settings set target.launch-working-dir ''") + launch_command = f"process launch -o {out_file_path}" + + self.expect( + launch_command, + patterns=["Process .* launched: .*a.out"], + ) + + out = lldbutil.read_file_on_target(self, out_file_path) + self.assertNotIn(f"stdout: {another_working_dir_path}", out) diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 290473cdb46f4c..5252ae5aadcf6a 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -309,6 +309,8 @@ Changes to LLDB * Program stdout/stderr redirection will now open the file with O_TRUNC flag, make sure to truncate the file if path already exists. * eg. `settings set target.output-path/target.error-path <path/to/file>` +* A new setting `target.launch-working-dir` can be used to set a persistent cwd that is used by default by `process launch` and `run`. + Changes to BOLT --------------------------------- _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits