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