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
22using namespace lldb;
23using namespace lldb_private;
24
25PlatformSP
26OptionGroupPlatform::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
74void
75OptionGroupPlatform::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
85static OptionDefinition
86g_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
94const OptionDefinition*
95OptionGroupPlatform::GetDefinitions ()
96{
97    if (m_include_platform_option)
98        return g_option_table;
99    return g_option_table + 1;
100}
101
102uint32_t
103OptionGroupPlatform::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
111Error
112OptionGroupPlatform::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