forked from OSchip/llvm-project
[lldb] Make SBTarget::LaunchSimple start form the target's LaunchInfo
Currently SBTarget::LaunchSimple creates a new LaunchInfo which means it ignores any target properties that have been set. Instead, it should start from the target's LaunchInfo and populated the specified fields. Differential revision: https://reviews.llvm.org/D85235
This commit is contained in:
parent
3169d920cc
commit
882d8e60dd
|
@ -287,16 +287,24 @@ SBProcess SBTarget::LaunchSimple(char const **argv, char const **envp,
|
|||
(const char **, const char **, const char *), argv, envp,
|
||||
working_directory);
|
||||
|
||||
char *stdin_path = nullptr;
|
||||
char *stdout_path = nullptr;
|
||||
char *stderr_path = nullptr;
|
||||
uint32_t launch_flags = 0;
|
||||
bool stop_at_entry = false;
|
||||
TargetSP target_sp = GetSP();
|
||||
if (!target_sp)
|
||||
return LLDB_RECORD_RESULT(SBProcess());
|
||||
|
||||
SBLaunchInfo launch_info = GetLaunchInfo();
|
||||
|
||||
if (Module *exe_module = target_sp->GetExecutableModulePointer())
|
||||
launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(),
|
||||
/*add_as_first_arg*/ true);
|
||||
if (argv)
|
||||
launch_info.SetArguments(argv, /*append*/ true);
|
||||
if (envp)
|
||||
launch_info.SetEnvironmentEntries(envp, /*append*/ false);
|
||||
if (working_directory)
|
||||
launch_info.SetWorkingDirectory(working_directory);
|
||||
|
||||
SBError error;
|
||||
SBListener listener = GetDebugger().GetListener();
|
||||
return LLDB_RECORD_RESULT(Launch(listener, argv, envp, stdin_path,
|
||||
stdout_path, stderr_path, working_directory,
|
||||
launch_flags, stop_at_entry, error));
|
||||
return LLDB_RECORD_RESULT(Launch(launch_info, error));
|
||||
}
|
||||
|
||||
SBError SBTarget::Install() {
|
||||
|
|
|
@ -150,6 +150,38 @@ class TargetAPITestCase(TestBase):
|
|||
self.assertTrue(error.Success(), "Make sure memory read succeeded")
|
||||
self.assertEqual(len(content), 1)
|
||||
|
||||
|
||||
@add_test_categories(['pyapi'])
|
||||
def test_launch_simple(self):
|
||||
d = {'EXE': 'b.out'}
|
||||
self.build(dictionary=d)
|
||||
self.setTearDownCleanup(dictionary=d)
|
||||
target = self.create_simple_target('b.out')
|
||||
|
||||
process = target.LaunchSimple(
|
||||
['foo', 'bar'], ['baz'], self.get_process_working_directory())
|
||||
self.runCmd("run")
|
||||
output = process.GetSTDOUT(9999)
|
||||
self.assertIn('arg: foo', output)
|
||||
self.assertIn('arg: bar', output)
|
||||
self.assertIn('env: baz', output)
|
||||
|
||||
self.runCmd("setting set target.run-args foo")
|
||||
self.runCmd("setting set target.env-vars bar=baz")
|
||||
process = target.LaunchSimple(None, None,
|
||||
self.get_process_working_directory())
|
||||
self.runCmd("run")
|
||||
output = process.GetSTDOUT(9999)
|
||||
self.assertIn('arg: foo', output)
|
||||
self.assertIn('env: bar=baz', output)
|
||||
|
||||
self.runCmd("settings set target.disable-stdio true")
|
||||
process = target.LaunchSimple(
|
||||
None, None, self.get_process_working_directory())
|
||||
self.runCmd("run")
|
||||
output = process.GetSTDOUT(9999)
|
||||
self.assertEqual(output, "")
|
||||
|
||||
def create_simple_target(self, fn):
|
||||
exe = self.getBuildArtifact(fn)
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
|
|
|
@ -36,17 +36,24 @@ int c(int val)
|
|||
return val + 3;
|
||||
}
|
||||
|
||||
int main (int argc, char const *argv[])
|
||||
int main (int argc, char const *argv[], char** env)
|
||||
{
|
||||
// Set a break at entry to main.
|
||||
int A1 = a(1); // a(1) -> b(1) -> c(1)
|
||||
printf("a(1) returns %d\n", A1);
|
||||
|
||||
|
||||
int B2 = b(2); // b(2) -> c(2)
|
||||
printf("b(2) returns %d\n", B2);
|
||||
|
||||
|
||||
int A3 = a(3); // a(3) -> c(3)
|
||||
printf("a(3) returns %d\n", A3);
|
||||
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
printf("arg: %s\n", argv[i]);
|
||||
}
|
||||
|
||||
while (*env)
|
||||
printf("env: %s\n", *env++);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue