xref: /src/contrib/llvm-project/lldb/source/Commands/CommandOptionsProcessLaunch.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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