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"
15*7ced9fffSJonas Devlieghere #include "lldb/Interpreter/CommandObject.h"
16*7ced9fffSJonas Devlieghere #include "lldb/Interpreter/CommandOptionArgumentTable.h"
177169d3a3SMed Ismail Bennani #include "lldb/Interpreter/OptionArgParser.h"
187169d3a3SMed Ismail Bennani #include "lldb/Target/ExecutionContext.h"
197169d3a3SMed Ismail Bennani #include "lldb/Target/Platform.h"
207169d3a3SMed Ismail Bennani #include "lldb/Target/Target.h"
217169d3a3SMed Ismail Bennani
227169d3a3SMed Ismail Bennani #include "llvm/ADT/ArrayRef.h"
237169d3a3SMed Ismail Bennani
247169d3a3SMed Ismail Bennani using namespace llvm;
257169d3a3SMed Ismail Bennani using namespace lldb;
267169d3a3SMed Ismail Bennani using namespace lldb_private;
277169d3a3SMed Ismail Bennani
287169d3a3SMed Ismail Bennani #define LLDB_OPTIONS_process_launch
297169d3a3SMed Ismail Bennani #include "CommandOptions.inc"
307169d3a3SMed Ismail Bennani
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)317169d3a3SMed Ismail Bennani Status CommandOptionsProcessLaunch::SetOptionValue(
327169d3a3SMed Ismail Bennani uint32_t option_idx, llvm::StringRef option_arg,
337169d3a3SMed Ismail Bennani ExecutionContext *execution_context) {
347169d3a3SMed Ismail Bennani Status error;
353e0ad115SMed Ismail Bennani const int short_option = g_process_launch_options[option_idx].short_option;
367169d3a3SMed Ismail Bennani
377169d3a3SMed Ismail Bennani switch (short_option) {
387169d3a3SMed Ismail Bennani case 's': // Stop at program entry point
397169d3a3SMed Ismail Bennani launch_info.GetFlags().Set(eLaunchFlagStopAtEntry);
407169d3a3SMed Ismail Bennani break;
417169d3a3SMed Ismail Bennani
427169d3a3SMed Ismail Bennani case 'i': // STDIN for read only
437169d3a3SMed Ismail Bennani {
447169d3a3SMed Ismail Bennani FileAction action;
457169d3a3SMed Ismail Bennani if (action.Open(STDIN_FILENO, FileSpec(option_arg), true, false))
467169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
477169d3a3SMed Ismail Bennani break;
487169d3a3SMed Ismail Bennani }
497169d3a3SMed Ismail Bennani
507169d3a3SMed Ismail Bennani case 'o': // Open STDOUT for write only
517169d3a3SMed Ismail Bennani {
527169d3a3SMed Ismail Bennani FileAction action;
537169d3a3SMed Ismail Bennani if (action.Open(STDOUT_FILENO, FileSpec(option_arg), false, true))
547169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
557169d3a3SMed Ismail Bennani break;
567169d3a3SMed Ismail Bennani }
577169d3a3SMed Ismail Bennani
587169d3a3SMed Ismail Bennani case 'e': // STDERR for write only
597169d3a3SMed Ismail Bennani {
607169d3a3SMed Ismail Bennani FileAction action;
617169d3a3SMed Ismail Bennani if (action.Open(STDERR_FILENO, FileSpec(option_arg), false, true))
627169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
637169d3a3SMed Ismail Bennani break;
647169d3a3SMed Ismail Bennani }
657169d3a3SMed Ismail Bennani
668fc9b6c2SMed Ismail Bennani case 'P': // Process plug-in name
677169d3a3SMed Ismail Bennani launch_info.SetProcessPluginName(option_arg);
687169d3a3SMed Ismail Bennani break;
697169d3a3SMed Ismail Bennani
707169d3a3SMed Ismail Bennani case 'n': // Disable STDIO
717169d3a3SMed Ismail Bennani {
727169d3a3SMed Ismail Bennani FileAction action;
737169d3a3SMed Ismail Bennani const FileSpec dev_null(FileSystem::DEV_NULL);
747169d3a3SMed Ismail Bennani if (action.Open(STDIN_FILENO, dev_null, true, false))
757169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
767169d3a3SMed Ismail Bennani if (action.Open(STDOUT_FILENO, dev_null, false, true))
777169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
787169d3a3SMed Ismail Bennani if (action.Open(STDERR_FILENO, dev_null, false, true))
797169d3a3SMed Ismail Bennani launch_info.AppendFileAction(action);
807169d3a3SMed Ismail Bennani break;
817169d3a3SMed Ismail Bennani }
827169d3a3SMed Ismail Bennani
837169d3a3SMed Ismail Bennani case 'w':
847169d3a3SMed Ismail Bennani launch_info.SetWorkingDirectory(FileSpec(option_arg));
857169d3a3SMed Ismail Bennani break;
867169d3a3SMed Ismail Bennani
877169d3a3SMed Ismail Bennani case 't': // Open process in new terminal window
887169d3a3SMed Ismail Bennani launch_info.GetFlags().Set(eLaunchFlagLaunchInTTY);
897169d3a3SMed Ismail Bennani break;
907169d3a3SMed Ismail Bennani
917169d3a3SMed Ismail Bennani case 'a': {
927169d3a3SMed Ismail Bennani TargetSP target_sp =
937169d3a3SMed Ismail Bennani execution_context ? execution_context->GetTargetSP() : TargetSP();
947169d3a3SMed Ismail Bennani PlatformSP platform_sp =
957169d3a3SMed Ismail Bennani target_sp ? target_sp->GetPlatform() : PlatformSP();
967169d3a3SMed Ismail Bennani launch_info.GetArchitecture() =
977169d3a3SMed Ismail Bennani Platform::GetAugmentedArchSpec(platform_sp.get(), option_arg);
987169d3a3SMed Ismail Bennani } break;
997169d3a3SMed Ismail Bennani
1007169d3a3SMed Ismail Bennani case 'A': // Disable ASLR.
1017169d3a3SMed Ismail Bennani {
1027169d3a3SMed Ismail Bennani bool success;
1037169d3a3SMed Ismail Bennani const bool disable_aslr_arg =
1047169d3a3SMed Ismail Bennani OptionArgParser::ToBoolean(option_arg, true, &success);
1057169d3a3SMed Ismail Bennani if (success)
1067169d3a3SMed Ismail Bennani disable_aslr = disable_aslr_arg ? eLazyBoolYes : eLazyBoolNo;
1077169d3a3SMed Ismail Bennani else
1087169d3a3SMed Ismail Bennani error.SetErrorStringWithFormat(
1097169d3a3SMed Ismail Bennani "Invalid boolean value for disable-aslr option: '%s'",
1107169d3a3SMed Ismail Bennani option_arg.empty() ? "<null>" : option_arg.str().c_str());
1117169d3a3SMed Ismail Bennani break;
1127169d3a3SMed Ismail Bennani }
1137169d3a3SMed Ismail Bennani
1147169d3a3SMed Ismail Bennani case 'X': // shell expand args.
1157169d3a3SMed Ismail Bennani {
1167169d3a3SMed Ismail Bennani bool success;
1177169d3a3SMed Ismail Bennani const bool expand_args =
1187169d3a3SMed Ismail Bennani OptionArgParser::ToBoolean(option_arg, true, &success);
1197169d3a3SMed Ismail Bennani if (success)
1207169d3a3SMed Ismail Bennani launch_info.SetShellExpandArguments(expand_args);
1217169d3a3SMed Ismail Bennani else
1227169d3a3SMed Ismail Bennani error.SetErrorStringWithFormat(
1237169d3a3SMed Ismail Bennani "Invalid boolean value for shell-expand-args option: '%s'",
1247169d3a3SMed Ismail Bennani option_arg.empty() ? "<null>" : option_arg.str().c_str());
1257169d3a3SMed Ismail Bennani break;
1267169d3a3SMed Ismail Bennani }
1277169d3a3SMed Ismail Bennani
1287169d3a3SMed Ismail Bennani case 'c':
1297169d3a3SMed Ismail Bennani if (!option_arg.empty())
1307169d3a3SMed Ismail Bennani launch_info.SetShell(FileSpec(option_arg));
1317169d3a3SMed Ismail Bennani else
1327169d3a3SMed Ismail Bennani launch_info.SetShell(HostInfo::GetDefaultShell());
1337169d3a3SMed Ismail Bennani break;
1347169d3a3SMed Ismail Bennani
135103ad3f9SMed Ismail Bennani case 'E':
1367169d3a3SMed Ismail Bennani launch_info.GetEnvironment().insert(option_arg);
1377169d3a3SMed Ismail Bennani break;
1387169d3a3SMed Ismail Bennani
1397169d3a3SMed Ismail Bennani default:
1407169d3a3SMed Ismail Bennani error.SetErrorStringWithFormat("unrecognized short option character '%c'",
1417169d3a3SMed Ismail Bennani short_option);
1427169d3a3SMed Ismail Bennani break;
1437169d3a3SMed Ismail Bennani }
1447169d3a3SMed Ismail Bennani return error;
1457169d3a3SMed Ismail Bennani }
1467169d3a3SMed Ismail Bennani
GetDefinitions()1477169d3a3SMed Ismail Bennani llvm::ArrayRef<OptionDefinition> CommandOptionsProcessLaunch::GetDefinitions() {
1487169d3a3SMed Ismail Bennani return llvm::makeArrayRef(g_process_launch_options);
1497169d3a3SMed Ismail Bennani }
150