[Lldb-commits] [lldb] 586765c - [lldb/qemu] Add emulator-env-vars setting
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 17 04:59:28 PST 2021
Author: Pavel Labath
Date: 2021-12-17T13:59:21+01:00
New Revision: 586765c0ee518310612d286f3a731786b4ea4148
URL: https://github.com/llvm/llvm-project/commit/586765c0ee518310612d286f3a731786b4ea4148
DIFF: https://github.com/llvm/llvm-project/commit/586765c0ee518310612d286f3a731786b4ea4148.diff
LOG: [lldb/qemu] Add emulator-env-vars setting
This setting is for variables we want to pass to the emulator only --
then will be automatically removed from the target environment by our
environment diffing code. This variable can be used to pass various
QEMU_*** variables (although most of these can be passed through
emulator-args as well), as well as any other variables that can affect
the operation of the emulator (e.g. LD_LIBRARY_PATH).
Added:
Modified:
lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp
lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td
lldb/test/API/qemu/TestQemuLaunch.py
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp
index 2542464301dee..67c9484680a42 100644
--- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp
+++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUser.cpp
@@ -55,6 +55,13 @@ class PluginProperties : public Properties {
return result;
}
+ Environment GetEmulatorEnvVars() {
+ Args args;
+ m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, ePropertyEmulatorEnvVars,
+ args);
+ return Environment(args);
+ }
+
Environment GetTargetEnvVars() {
Args args;
m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, ePropertyTargetEnvVars,
@@ -175,8 +182,13 @@ lldb::ProcessSP PlatformQemuUser::DebugProcess(ProcessLaunchInfo &launch_info,
get_arg_range(args));
launch_info.SetArguments(args, true);
+
+ Environment emulator_env = Host::GetEnvironment();
+ for (const auto &KV : GetGlobalProperties().GetEmulatorEnvVars())
+ emulator_env[KV.first()] = KV.second;
launch_info.GetEnvironment() = ComputeLaunchEnvironment(
- std::move(launch_info.GetEnvironment()), Host::GetEnvironment());
+ std::move(launch_info.GetEnvironment()), std::move(emulator_env));
+
launch_info.SetLaunchInSeparateProcessGroup(true);
launch_info.GetFlags().Clear(eLaunchFlagDebug);
launch_info.SetMonitorProcessCallback(ProcessLaunchInfo::NoOpMonitorCallback,
diff --git a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td
index 2792e2cef0349..4e8fbcfd67609 100644
--- a/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td
+++ b/lldb/source/Plugins/Platform/QemuUser/PlatformQemuUserProperties.td
@@ -13,7 +13,12 @@ let Definition = "platformqemuuser" in {
Global,
DefaultStringValue<"">,
Desc<"Extra arguments to pass to the emulator.">;
+ def EmulatorEnvVars: Property<"emulator-env-vars", "Dictionary">,
+ Global,
+ ElementType<"String">,
+ Desc<"Extra variables to add to the emulator environment.">;
def TargetEnvVars: Property<"target-env-vars", "Dictionary">,
+ Global,
ElementType<"String">,
Desc<"Extra variables to add to emulated target environment.">;
}
diff --git a/lldb/test/API/qemu/TestQemuLaunch.py b/lldb/test/API/qemu/TestQemuLaunch.py
index 07d7cb6a82f9d..2e817ede4154d 100644
--- a/lldb/test/API/qemu/TestQemuLaunch.py
+++ b/lldb/test/API/qemu/TestQemuLaunch.py
@@ -171,7 +171,7 @@ def test_extra_args(self):
self.assertEqual(state["fake-arg"], "fake-value")
- def test_target_env_vars(self):
+ def test_env_vars(self):
# First clear any global environment to have a clean slate for this test
self.runCmd("settings clear target.env-vars")
self.runCmd("settings clear target.unset-env-vars")
@@ -187,6 +187,10 @@ def cleanup():
del os.environ[var(i)]
self.addTearDownHook(cleanup)
+ # Set some emulator-only variables.
+ self.set_emulator_setting("emulator-env-vars",
+ "%s='emulator only'"%var(4))
+
# And through the platform setting.
self.set_emulator_setting("target-env-vars",
"%s='from platform' %s='from platform'" % (var(1), var(2)))
@@ -195,11 +199,13 @@ def cleanup():
info = target.GetLaunchInfo()
env = info.GetEnvironment()
- # Platform settings should trump host values.
+ # Platform settings should trump host values. Emulator-only variables
+ # should not be visible.
self.assertEqual(env.Get(var(0)), "from host")
self.assertEqual(env.Get(var(1)), "from platform")
self.assertEqual(env.Get(var(2)), "from platform")
self.assertEqual(env.Get(var(3)), "from host")
+ self.assertIsNone(env.Get(var(4)))
# Finally, make some launch_info specific changes.
env.Set(var(2), "from target", True)
@@ -212,7 +218,8 @@ def cleanup():
state = self._run_and_get_state(target, info)
for i in range(4):
self.assertEqual(state["environ"][var(i)], "from host")
+ self.assertEqual(state["environ"][var(4)], "emulator only")
self.assertEqual(state["environ"]["QEMU_SET_ENV"],
"%s=from platform,%s=from target" % (var(1), var(2)))
self.assertEqual(state["environ"]["QEMU_UNSET_ENV"],
- "%s,QEMU_SET_ENV,QEMU_UNSET_ENV" % var(3))
+ "%s,%s,QEMU_SET_ENV,QEMU_UNSET_ENV" % (var(3), var(4)))
More information about the lldb-commits
mailing list