[llvm] e952728 - [LLDB] Retry Add a target.launch-working-dir setting
walter erquinigo via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 5 10:30:03 PST 2024
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
---------------------------------
More information about the llvm-commits
mailing list