17169d3a3SMed Ismail Bennani //===-- CommandOptionsProcessLaunch.cpp -----------------------------------===//
27169d3a3SMed Ismail Bennani //
37169d3a3SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47169d3a3SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
57169d3a3SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67169d3a3SMed Ismail Bennani //
77169d3a3SMed Ismail Bennani //===----------------------------------------------------------------------===//
87169d3a3SMed Ismail Bennani 
97169d3a3SMed Ismail Bennani #include "CommandOptionsProcessLaunch.h"
107169d3a3SMed Ismail Bennani 
117169d3a3SMed Ismail Bennani #include "lldb/Host/FileSystem.h"
127169d3a3SMed Ismail Bennani #include "lldb/Host/HostInfo.h"
137169d3a3SMed Ismail Bennani #include "lldb/Host/OptionParser.h"
147169d3a3SMed Ismail Bennani #include "lldb/Interpreter/CommandCompletions.h"
157169d3a3SMed Ismail Bennani #include "lldb/Interpreter/OptionArgParser.h"
167169d3a3SMed Ismail Bennani #include "lldb/Target/ExecutionContext.h"
177169d3a3SMed Ismail Bennani #include "lldb/Target/Platform.h"
187169d3a3SMed Ismail Bennani #include "lldb/Target/Target.h"
197169d3a3SMed Ismail Bennani 
207169d3a3SMed Ismail Bennani #include "llvm/ADT/ArrayRef.h"
217169d3a3SMed Ismail Bennani 
227169d3a3SMed Ismail Bennani using namespace llvm;
237169d3a3SMed Ismail Bennani using namespace lldb;
247169d3a3SMed Ismail Bennani using namespace lldb_private;
257169d3a3SMed Ismail Bennani 
267169d3a3SMed Ismail Bennani #define LLDB_OPTIONS_process_launch
277169d3a3SMed Ismail Bennani #include "CommandOptions.inc"
287169d3a3SMed Ismail Bennani 
297169d3a3SMed Ismail Bennani Status CommandOptionsProcessLaunch::SetOptionValue(
307169d3a3SMed Ismail Bennani     uint32_t option_idx, llvm::StringRef option_arg,
317169d3a3SMed Ismail Bennani     ExecutionContext *execution_context) {
327169d3a3SMed Ismail Bennani   Status error;
337169d3a3SMed Ismail Bennani   const int short_option = m_getopt_table[option_idx].val;
347169d3a3SMed Ismail Bennani 
357169d3a3SMed Ismail Bennani   switch (short_option) {
367169d3a3SMed Ismail Bennani   case 's': // Stop at program entry point
377169d3a3SMed Ismail Bennani     launch_info.GetFlags().Set(eLaunchFlagStopAtEntry);
387169d3a3SMed Ismail Bennani     break;
397169d3a3SMed Ismail Bennani 
407169d3a3SMed Ismail Bennani   case 'i': // STDIN for read only
417169d3a3SMed Ismail Bennani   {
427169d3a3SMed Ismail Bennani     FileAction action;
437169d3a3SMed Ismail Bennani     if (action.Open(STDIN_FILENO, FileSpec(option_arg), true, false))
447169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
457169d3a3SMed Ismail Bennani     break;
467169d3a3SMed Ismail Bennani   }
477169d3a3SMed Ismail Bennani 
487169d3a3SMed Ismail Bennani   case 'o': // Open STDOUT for write only
497169d3a3SMed Ismail Bennani   {
507169d3a3SMed Ismail Bennani     FileAction action;
517169d3a3SMed Ismail Bennani     if (action.Open(STDOUT_FILENO, FileSpec(option_arg), false, true))
527169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
537169d3a3SMed Ismail Bennani     break;
547169d3a3SMed Ismail Bennani   }
557169d3a3SMed Ismail Bennani 
567169d3a3SMed Ismail Bennani   case 'e': // STDERR for write only
577169d3a3SMed Ismail Bennani   {
587169d3a3SMed Ismail Bennani     FileAction action;
597169d3a3SMed Ismail Bennani     if (action.Open(STDERR_FILENO, FileSpec(option_arg), false, true))
607169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
617169d3a3SMed Ismail Bennani     break;
627169d3a3SMed Ismail Bennani   }
637169d3a3SMed Ismail Bennani 
648fc9b6c2SMed Ismail Bennani   case 'P': // Process plug-in name
657169d3a3SMed Ismail Bennani     launch_info.SetProcessPluginName(option_arg);
667169d3a3SMed Ismail Bennani     break;
677169d3a3SMed Ismail Bennani 
687169d3a3SMed Ismail Bennani   case 'n': // Disable STDIO
697169d3a3SMed Ismail Bennani   {
707169d3a3SMed Ismail Bennani     FileAction action;
717169d3a3SMed Ismail Bennani     const FileSpec dev_null(FileSystem::DEV_NULL);
727169d3a3SMed Ismail Bennani     if (action.Open(STDIN_FILENO, dev_null, true, false))
737169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
747169d3a3SMed Ismail Bennani     if (action.Open(STDOUT_FILENO, dev_null, false, true))
757169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
767169d3a3SMed Ismail Bennani     if (action.Open(STDERR_FILENO, dev_null, false, true))
777169d3a3SMed Ismail Bennani       launch_info.AppendFileAction(action);
787169d3a3SMed Ismail Bennani     break;
797169d3a3SMed Ismail Bennani   }
807169d3a3SMed Ismail Bennani 
817169d3a3SMed Ismail Bennani   case 'w':
827169d3a3SMed Ismail Bennani     launch_info.SetWorkingDirectory(FileSpec(option_arg));
837169d3a3SMed Ismail Bennani     break;
847169d3a3SMed Ismail Bennani 
857169d3a3SMed Ismail Bennani   case 't': // Open process in new terminal window
867169d3a3SMed Ismail Bennani     launch_info.GetFlags().Set(eLaunchFlagLaunchInTTY);
877169d3a3SMed Ismail Bennani     break;
887169d3a3SMed Ismail Bennani 
897169d3a3SMed Ismail Bennani   case 'a': {
907169d3a3SMed Ismail Bennani     TargetSP target_sp =
917169d3a3SMed Ismail Bennani         execution_context ? execution_context->GetTargetSP() : TargetSP();
927169d3a3SMed Ismail Bennani     PlatformSP platform_sp =
937169d3a3SMed Ismail Bennani         target_sp ? target_sp->GetPlatform() : PlatformSP();
947169d3a3SMed Ismail Bennani     launch_info.GetArchitecture() =
957169d3a3SMed Ismail Bennani         Platform::GetAugmentedArchSpec(platform_sp.get(), option_arg);
967169d3a3SMed Ismail Bennani   } break;
977169d3a3SMed Ismail Bennani 
987169d3a3SMed Ismail Bennani   case 'A': // Disable ASLR.
997169d3a3SMed Ismail Bennani   {
1007169d3a3SMed Ismail Bennani     bool success;
1017169d3a3SMed Ismail Bennani     const bool disable_aslr_arg =
1027169d3a3SMed Ismail Bennani         OptionArgParser::ToBoolean(option_arg, true, &success);
1037169d3a3SMed Ismail Bennani     if (success)
1047169d3a3SMed Ismail Bennani       disable_aslr = disable_aslr_arg ? eLazyBoolYes : eLazyBoolNo;
1057169d3a3SMed Ismail Bennani     else
1067169d3a3SMed Ismail Bennani       error.SetErrorStringWithFormat(
1077169d3a3SMed Ismail Bennani           "Invalid boolean value for disable-aslr option: '%s'",
1087169d3a3SMed Ismail Bennani           option_arg.empty() ? "<null>" : option_arg.str().c_str());
1097169d3a3SMed Ismail Bennani     break;
1107169d3a3SMed Ismail Bennani   }
1117169d3a3SMed Ismail Bennani 
1127169d3a3SMed Ismail Bennani   case 'X': // shell expand args.
1137169d3a3SMed Ismail Bennani   {
1147169d3a3SMed Ismail Bennani     bool success;
1157169d3a3SMed Ismail Bennani     const bool expand_args =
1167169d3a3SMed Ismail Bennani         OptionArgParser::ToBoolean(option_arg, true, &success);
1177169d3a3SMed Ismail Bennani     if (success)
1187169d3a3SMed Ismail Bennani       launch_info.SetShellExpandArguments(expand_args);
1197169d3a3SMed Ismail Bennani     else
1207169d3a3SMed Ismail Bennani       error.SetErrorStringWithFormat(
1217169d3a3SMed Ismail Bennani           "Invalid boolean value for shell-expand-args option: '%s'",
1227169d3a3SMed Ismail Bennani           option_arg.empty() ? "<null>" : option_arg.str().c_str());
1237169d3a3SMed Ismail Bennani     break;
1247169d3a3SMed Ismail Bennani   }
1257169d3a3SMed Ismail Bennani 
1267169d3a3SMed Ismail Bennani   case 'c':
1277169d3a3SMed Ismail Bennani     if (!option_arg.empty())
1287169d3a3SMed Ismail Bennani       launch_info.SetShell(FileSpec(option_arg));
1297169d3a3SMed Ismail Bennani     else
1307169d3a3SMed Ismail Bennani       launch_info.SetShell(HostInfo::GetDefaultShell());
1317169d3a3SMed Ismail Bennani     break;
1327169d3a3SMed Ismail Bennani 
133*103ad3f9SMed Ismail Bennani   case 'E':
1347169d3a3SMed Ismail Bennani     launch_info.GetEnvironment().insert(option_arg);
1357169d3a3SMed Ismail Bennani     break;
1367169d3a3SMed Ismail Bennani 
1377169d3a3SMed Ismail Bennani   default:
1387169d3a3SMed Ismail Bennani     error.SetErrorStringWithFormat("unrecognized short option character '%c'",
1397169d3a3SMed Ismail Bennani                                    short_option);
1407169d3a3SMed Ismail Bennani     break;
1417169d3a3SMed Ismail Bennani   }
1427169d3a3SMed Ismail Bennani   return error;
1437169d3a3SMed Ismail Bennani }
1447169d3a3SMed Ismail Bennani 
1457169d3a3SMed Ismail Bennani llvm::ArrayRef<OptionDefinition> CommandOptionsProcessLaunch::GetDefinitions() {
1467169d3a3SMed Ismail Bennani   return llvm::makeArrayRef(g_process_launch_options);
1477169d3a3SMed Ismail Bennani }
148