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