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