1b60736ecSDimitry Andric //===-- CommandOptionsProcessLaunch.cpp -----------------------------------===//
2b60736ecSDimitry Andric //
3b60736ecSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b60736ecSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5b60736ecSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b60736ecSDimitry Andric //
7b60736ecSDimitry Andric //===----------------------------------------------------------------------===//
8b60736ecSDimitry Andric
9b60736ecSDimitry Andric #include "CommandOptionsProcessLaunch.h"
10b60736ecSDimitry Andric
11b60736ecSDimitry Andric #include "lldb/Host/FileSystem.h"
12b60736ecSDimitry Andric #include "lldb/Host/HostInfo.h"
13b60736ecSDimitry Andric #include "lldb/Host/OptionParser.h"
14b60736ecSDimitry Andric #include "lldb/Interpreter/CommandCompletions.h"
154b4fe385SDimitry Andric #include "lldb/Interpreter/CommandObject.h"
164b4fe385SDimitry Andric #include "lldb/Interpreter/CommandOptionArgumentTable.h"
17b60736ecSDimitry Andric #include "lldb/Interpreter/OptionArgParser.h"
18b60736ecSDimitry Andric #include "lldb/Target/ExecutionContext.h"
19b60736ecSDimitry Andric #include "lldb/Target/Platform.h"
20b60736ecSDimitry Andric #include "lldb/Target/Target.h"
21b60736ecSDimitry Andric
22b60736ecSDimitry Andric #include "llvm/ADT/ArrayRef.h"
23b60736ecSDimitry Andric
24b60736ecSDimitry Andric using namespace llvm;
25b60736ecSDimitry Andric using namespace lldb;
26b60736ecSDimitry Andric using namespace lldb_private;
27b60736ecSDimitry Andric
28b60736ecSDimitry Andric #define LLDB_OPTIONS_process_launch
29b60736ecSDimitry Andric #include "CommandOptions.inc"
30b60736ecSDimitry Andric
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)31b60736ecSDimitry Andric Status CommandOptionsProcessLaunch::SetOptionValue(
32b60736ecSDimitry Andric uint32_t option_idx, llvm::StringRef option_arg,
33b60736ecSDimitry Andric ExecutionContext *execution_context) {
34b60736ecSDimitry Andric Status error;
35344a3780SDimitry Andric const int short_option = g_process_launch_options[option_idx].short_option;
36b60736ecSDimitry Andric
37b1c73532SDimitry Andric TargetSP target_sp =
38b1c73532SDimitry Andric execution_context ? execution_context->GetTargetSP() : TargetSP();
39b60736ecSDimitry Andric switch (short_option) {
40b60736ecSDimitry Andric case 's': // Stop at program entry point
41b60736ecSDimitry Andric launch_info.GetFlags().Set(eLaunchFlagStopAtEntry);
42b60736ecSDimitry Andric break;
43b1c73532SDimitry Andric case 'm': // Stop at user entry point
44b1c73532SDimitry Andric target_sp->CreateBreakpointAtUserEntry(error);
45b1c73532SDimitry Andric break;
46b60736ecSDimitry Andric case 'i': // STDIN for read only
47b60736ecSDimitry Andric {
48b60736ecSDimitry Andric FileAction action;
49b60736ecSDimitry Andric if (action.Open(STDIN_FILENO, FileSpec(option_arg), true, false))
50b60736ecSDimitry Andric launch_info.AppendFileAction(action);
51b60736ecSDimitry Andric break;
52b60736ecSDimitry Andric }
53b60736ecSDimitry Andric
54b60736ecSDimitry Andric case 'o': // Open STDOUT for write only
55b60736ecSDimitry Andric {
56b60736ecSDimitry Andric FileAction action;
57b60736ecSDimitry Andric if (action.Open(STDOUT_FILENO, FileSpec(option_arg), false, true))
58b60736ecSDimitry Andric launch_info.AppendFileAction(action);
59b60736ecSDimitry Andric break;
60b60736ecSDimitry Andric }
61b60736ecSDimitry Andric
62b60736ecSDimitry Andric case 'e': // STDERR for write only
63b60736ecSDimitry Andric {
64b60736ecSDimitry Andric FileAction action;
65b60736ecSDimitry Andric if (action.Open(STDERR_FILENO, FileSpec(option_arg), false, true))
66b60736ecSDimitry Andric launch_info.AppendFileAction(action);
67b60736ecSDimitry Andric break;
68b60736ecSDimitry Andric }
69b60736ecSDimitry Andric
70b60736ecSDimitry Andric case 'P': // Process plug-in name
71b60736ecSDimitry Andric launch_info.SetProcessPluginName(option_arg);
72b60736ecSDimitry Andric break;
73b60736ecSDimitry Andric
74b60736ecSDimitry Andric case 'n': // Disable STDIO
75b60736ecSDimitry Andric {
76b60736ecSDimitry Andric FileAction action;
77b60736ecSDimitry Andric const FileSpec dev_null(FileSystem::DEV_NULL);
78b60736ecSDimitry Andric if (action.Open(STDIN_FILENO, dev_null, true, false))
79b60736ecSDimitry Andric launch_info.AppendFileAction(action);
80b60736ecSDimitry Andric if (action.Open(STDOUT_FILENO, dev_null, false, true))
81b60736ecSDimitry Andric launch_info.AppendFileAction(action);
82b60736ecSDimitry Andric if (action.Open(STDERR_FILENO, dev_null, false, true))
83b60736ecSDimitry Andric launch_info.AppendFileAction(action);
84b60736ecSDimitry Andric break;
85b60736ecSDimitry Andric }
86b60736ecSDimitry Andric
87b60736ecSDimitry Andric case 'w':
88b60736ecSDimitry Andric launch_info.SetWorkingDirectory(FileSpec(option_arg));
89b60736ecSDimitry Andric break;
90b60736ecSDimitry Andric
91b60736ecSDimitry Andric case 't': // Open process in new terminal window
92b60736ecSDimitry Andric launch_info.GetFlags().Set(eLaunchFlagLaunchInTTY);
93b60736ecSDimitry Andric break;
94b60736ecSDimitry Andric
95b60736ecSDimitry Andric case 'a': {
96b60736ecSDimitry Andric PlatformSP platform_sp =
97b60736ecSDimitry Andric target_sp ? target_sp->GetPlatform() : PlatformSP();
98b60736ecSDimitry Andric launch_info.GetArchitecture() =
99b60736ecSDimitry Andric Platform::GetAugmentedArchSpec(platform_sp.get(), option_arg);
100b60736ecSDimitry Andric } break;
101b60736ecSDimitry Andric
102b60736ecSDimitry Andric case 'A': // Disable ASLR.
103b60736ecSDimitry Andric {
104b60736ecSDimitry Andric bool success;
105b60736ecSDimitry Andric const bool disable_aslr_arg =
106b60736ecSDimitry Andric OptionArgParser::ToBoolean(option_arg, true, &success);
107b60736ecSDimitry Andric if (success)
108b60736ecSDimitry Andric disable_aslr = disable_aslr_arg ? eLazyBoolYes : eLazyBoolNo;
109b60736ecSDimitry Andric else
110b60736ecSDimitry Andric error.SetErrorStringWithFormat(
111b60736ecSDimitry Andric "Invalid boolean value for disable-aslr option: '%s'",
112b60736ecSDimitry Andric option_arg.empty() ? "<null>" : option_arg.str().c_str());
113b60736ecSDimitry Andric break;
114b60736ecSDimitry Andric }
115b60736ecSDimitry Andric
116b60736ecSDimitry Andric case 'X': // shell expand args.
117b60736ecSDimitry Andric {
118b60736ecSDimitry Andric bool success;
119b60736ecSDimitry Andric const bool expand_args =
120b60736ecSDimitry Andric OptionArgParser::ToBoolean(option_arg, true, &success);
121b60736ecSDimitry Andric if (success)
122b60736ecSDimitry Andric launch_info.SetShellExpandArguments(expand_args);
123b60736ecSDimitry Andric else
124b60736ecSDimitry Andric error.SetErrorStringWithFormat(
125b60736ecSDimitry Andric "Invalid boolean value for shell-expand-args option: '%s'",
126b60736ecSDimitry Andric option_arg.empty() ? "<null>" : option_arg.str().c_str());
127b60736ecSDimitry Andric break;
128b60736ecSDimitry Andric }
129b60736ecSDimitry Andric
130b60736ecSDimitry Andric case 'c':
131b60736ecSDimitry Andric if (!option_arg.empty())
132b60736ecSDimitry Andric launch_info.SetShell(FileSpec(option_arg));
133b60736ecSDimitry Andric else
134b60736ecSDimitry Andric launch_info.SetShell(HostInfo::GetDefaultShell());
135b60736ecSDimitry Andric break;
136b60736ecSDimitry Andric
137344a3780SDimitry Andric case 'E':
138b60736ecSDimitry Andric launch_info.GetEnvironment().insert(option_arg);
139b60736ecSDimitry Andric break;
140b60736ecSDimitry Andric
141b60736ecSDimitry Andric default:
142b60736ecSDimitry Andric error.SetErrorStringWithFormat("unrecognized short option character '%c'",
143b60736ecSDimitry Andric short_option);
144b60736ecSDimitry Andric break;
145b60736ecSDimitry Andric }
146b60736ecSDimitry Andric return error;
147b60736ecSDimitry Andric }
148b60736ecSDimitry Andric
GetDefinitions()149b60736ecSDimitry Andric llvm::ArrayRef<OptionDefinition> CommandOptionsProcessLaunch::GetDefinitions() {
150e3b55780SDimitry Andric return llvm::ArrayRef(g_process_launch_options);
151b60736ecSDimitry Andric }
152