OptionGroupPlatform.cpp revision 288943
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/Interpreter/OptionGroupPlatform.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Interpreter/CommandInterpreter.h"
17#include "lldb/Target/Platform.h"
18#include "lldb/Utility/Utils.h"
19
20using namespace lldb;
21using namespace lldb_private;
22
23PlatformSP
24OptionGroupPlatform::CreatePlatformWithOptions (CommandInterpreter &interpreter,
25                                                const ArchSpec &arch,
26                                                bool make_selected,
27                                                Error& error,
28                                                ArchSpec &platform_arch) const
29{
30    PlatformSP platform_sp;
31
32    if (!m_platform_name.empty())
33    {
34        platform_sp = Platform::Create (ConstString(m_platform_name.c_str()), error);
35        if (platform_sp)
36        {
37            if (platform_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch))
38            {
39                error.SetErrorStringWithFormat ("platform '%s' doesn't support '%s'",
40                                                platform_sp->GetName().GetCString(),
41                                                arch.GetTriple().getTriple().c_str());
42                platform_sp.reset();
43                return platform_sp;
44            }
45        }
46    }
47    else if (arch.IsValid())
48    {
49        platform_sp = Platform::Create (arch, &platform_arch, error);
50    }
51
52    if (platform_sp)
53    {
54        interpreter.GetDebugger().GetPlatformList().Append (platform_sp, make_selected);
55        if (m_os_version_major != UINT32_MAX)
56        {
57            platform_sp->SetOSVersion (m_os_version_major,
58                                       m_os_version_minor,
59                                       m_os_version_update);
60        }
61
62        if (m_sdk_sysroot)
63            platform_sp->SetSDKRootDirectory (m_sdk_sysroot);
64
65        if (m_sdk_build)
66            platform_sp->SetSDKBuild (m_sdk_build);
67    }
68
69    return platform_sp;
70}
71
72void
73OptionGroupPlatform::OptionParsingStarting (CommandInterpreter &interpreter)
74{
75    m_platform_name.clear();
76    m_sdk_sysroot.Clear();
77    m_sdk_build.Clear();
78    m_os_version_major = UINT32_MAX;
79    m_os_version_minor = UINT32_MAX;
80    m_os_version_update = UINT32_MAX;
81}
82
83static OptionDefinition
84g_option_table[] =
85{
86    { LLDB_OPT_SET_ALL, false, "platform", 'p', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypePlatform, "Specify name of the platform to use for this target, creating the platform if necessary."},
87    { LLDB_OPT_SET_ALL, false, "version" , 'v', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." },
88    { LLDB_OPT_SET_ALL, false, "build"   , 'b', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeNone, "Specify the initial SDK build number." },
89    { LLDB_OPT_SET_ALL, false, "sysroot" , 'S', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFilename, "Specify the SDK root directory that contains a root of all remote system files." }
90};
91
92const OptionDefinition*
93OptionGroupPlatform::GetDefinitions ()
94{
95    if (m_include_platform_option)
96        return g_option_table;
97    return g_option_table + 1;
98}
99
100uint32_t
101OptionGroupPlatform::GetNumDefinitions ()
102{
103    if (m_include_platform_option)
104        return llvm::array_lengthof(g_option_table);
105    return llvm::array_lengthof(g_option_table) - 1;
106}
107
108
109Error
110OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter,
111                                     uint32_t option_idx,
112                                     const char *option_arg)
113{
114    Error error;
115    if (!m_include_platform_option)
116        ++option_idx;
117
118    const int short_option = g_option_table[option_idx].short_option;
119
120    switch (short_option)
121    {
122        case 'p':
123            m_platform_name.assign (option_arg);
124            break;
125
126        case 'v':
127            if (Args::StringToVersion (option_arg,
128                                       m_os_version_major,
129                                       m_os_version_minor,
130                                       m_os_version_update) == option_arg)
131                error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg);
132            break;
133
134        case 'b':
135            m_sdk_build.SetCString (option_arg);
136            break;
137
138        case 'S':
139            m_sdk_sysroot.SetCString (option_arg);
140            break;
141
142        default:
143            error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
144            break;
145    }
146    return error;
147}
148
149bool
150OptionGroupPlatform::PlatformMatches(const lldb::PlatformSP &platform_sp) const
151{
152    if (platform_sp)
153    {
154        if (!m_platform_name.empty())
155        {
156            if (platform_sp->GetName() != ConstString(m_platform_name.c_str()))
157                return false;
158        }
159
160        if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild())
161            return false;
162
163        if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory())
164            return false;
165
166        if (m_os_version_major != UINT32_MAX)
167        {
168            uint32_t major, minor, update;
169            if (platform_sp->GetOSVersion (major, minor, update))
170            {
171                if (m_os_version_major != major)
172                    return false;
173                if (m_os_version_minor != minor)
174                    return false;
175                if (m_os_version_update != update)
176                    return false;
177            }
178        }
179        return true;
180    }
181    return false;
182}
183