1 //===-- OptionGroupPlatform.cpp ---------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/lldb-python.h" 11 12 #include "lldb/Interpreter/OptionGroupPlatform.h" 13 14 // C Includes 15 // C++ Includes 16 // Other libraries and framework includes 17 // Project includes 18 #include "lldb/Interpreter/CommandInterpreter.h" 19 #include "lldb/Target/Platform.h" 20 #include "lldb/Utility/Utils.h" 21 22 using namespace lldb; 23 using namespace lldb_private; 24 25 PlatformSP 26 OptionGroupPlatform::CreatePlatformWithOptions (CommandInterpreter &interpreter, 27 const ArchSpec &arch, 28 bool make_selected, 29 Error& error, 30 ArchSpec &platform_arch) const 31 { 32 PlatformSP platform_sp; 33 34 if (!m_platform_name.empty()) 35 { 36 platform_sp = Platform::Create (m_platform_name.c_str(), error); 37 if (platform_sp) 38 { 39 if (platform_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch)) 40 { 41 error.SetErrorStringWithFormat ("platform '%s' doesn't support '%s'", 42 platform_sp->GetName().GetCString(), 43 arch.GetTriple().getTriple().c_str()); 44 platform_sp.reset(); 45 return platform_sp; 46 } 47 } 48 } 49 else if (arch.IsValid()) 50 { 51 platform_sp = Platform::Create (arch, &platform_arch, error); 52 } 53 54 if (platform_sp) 55 { 56 interpreter.GetDebugger().GetPlatformList().Append (platform_sp, make_selected); 57 if (m_os_version_major != UINT32_MAX) 58 { 59 platform_sp->SetOSVersion (m_os_version_major, 60 m_os_version_minor, 61 m_os_version_update); 62 } 63 64 if (m_sdk_sysroot) 65 platform_sp->SetSDKRootDirectory (m_sdk_sysroot); 66 67 if (m_sdk_build) 68 platform_sp->SetSDKBuild (m_sdk_build); 69 } 70 71 return platform_sp; 72 } 73 74 void 75 OptionGroupPlatform::OptionParsingStarting (CommandInterpreter &interpreter) 76 { 77 m_platform_name.clear(); 78 m_sdk_sysroot.Clear(); 79 m_sdk_build.Clear(); 80 m_os_version_major = UINT32_MAX; 81 m_os_version_minor = UINT32_MAX; 82 m_os_version_update = UINT32_MAX; 83 } 84 85 static OptionDefinition 86 g_option_table[] = 87 { 88 { LLDB_OPT_SET_ALL, false, "platform", 'p', required_argument, NULL, 0, eArgTypePlatform, "Specify name of the platform to use for this target, creating the platform if necessary."}, 89 { LLDB_OPT_SET_ALL, false, "version" , 'v', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." }, 90 { LLDB_OPT_SET_ALL, false, "build" , 'b', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK build number." }, 91 { LLDB_OPT_SET_ALL, false, "sysroot" , 'S', required_argument, NULL, 0, eArgTypeFilename, "Specify the SDK root directory that contains a root of all remote system files." } 92 }; 93 94 const OptionDefinition* 95 OptionGroupPlatform::GetDefinitions () 96 { 97 if (m_include_platform_option) 98 return g_option_table; 99 return g_option_table + 1; 100 } 101 102 uint32_t 103 OptionGroupPlatform::GetNumDefinitions () 104 { 105 if (m_include_platform_option) 106 return llvm::array_lengthof(g_option_table); 107 return llvm::array_lengthof(g_option_table) - 1; 108 } 109 110 111 Error 112 OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter, 113 uint32_t option_idx, 114 const char *option_arg) 115 { 116 Error error; 117 if (!m_include_platform_option) 118 ++option_idx; 119 120 const int short_option = g_option_table[option_idx].short_option; 121 122 switch (short_option) 123 { 124 case 'p': 125 m_platform_name.assign (option_arg); 126 break; 127 128 case 'v': 129 if (Args::StringToVersion (option_arg, 130 m_os_version_major, 131 m_os_version_minor, 132 m_os_version_update) == option_arg) 133 error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg); 134 break; 135 136 case 'b': 137 m_sdk_build.SetCString (option_arg); 138 break; 139 140 case 'S': 141 m_sdk_sysroot.SetCString (option_arg); 142 break; 143 144 default: 145 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option); 146 break; 147 } 148 return error; 149 } 150