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
CreatePlatformWithOptions(CommandInterpreter & interpreter,const ArchSpec & arch,bool make_selected,Error & error,ArchSpec & platform_arch) const26 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
OptionParsingStarting(CommandInterpreter & interpreter)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*
GetDefinitions()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
GetNumDefinitions()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
SetOptionValue(CommandInterpreter & interpreter,uint32_t option_idx,const char * option_arg)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