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