blob: 776bac79da4a9ae6598836cc58d5376294e370fa [file] [log] [blame]
Greg Clayton7260f622011-04-18 08:33:37 +00001//===-- 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"
Johnny Chen7c575b32011-09-10 00:48:33 +000018#include "lldb/Utility/Utils.h"
Greg Clayton7260f622011-04-18 08:33:37 +000019
20using namespace lldb;
21using namespace lldb_private;
22
Kate Stoneb9c1b512016-09-06 20:57:50 +000023PlatformSP OptionGroupPlatform::CreatePlatformWithOptions(
24 CommandInterpreter &interpreter, const ArchSpec &arch, bool make_selected,
25 Error &error, ArchSpec &platform_arch) const {
26 PlatformSP platform_sp;
27
28 if (!m_platform_name.empty()) {
29 platform_sp = Platform::Create(ConstString(m_platform_name.c_str()), error);
30 if (platform_sp) {
31 if (platform_arch.IsValid() &&
32 !platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch)) {
33 error.SetErrorStringWithFormat("platform '%s' doesn't support '%s'",
34 platform_sp->GetName().GetCString(),
35 arch.GetTriple().getTriple().c_str());
36 platform_sp.reset();
37 return platform_sp;
38 }
Greg Clayton7260f622011-04-18 08:33:37 +000039 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000040 } else if (arch.IsValid()) {
41 platform_sp = Platform::Create(arch, &platform_arch, error);
42 }
43
44 if (platform_sp) {
45 interpreter.GetDebugger().GetPlatformList().Append(platform_sp,
46 make_selected);
47 if (m_os_version_major != UINT32_MAX) {
48 platform_sp->SetOSVersion(m_os_version_major, m_os_version_minor,
49 m_os_version_update);
Greg Claytonb3a40ba2012-03-20 18:34:04 +000050 }
51
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 if (m_sdk_sysroot)
53 platform_sp->SetSDKRootDirectory(m_sdk_sysroot);
54
55 if (m_sdk_build)
56 platform_sp->SetSDKBuild(m_sdk_build);
57 }
58
59 return platform_sp;
Greg Clayton7260f622011-04-18 08:33:37 +000060}
61
Kate Stoneb9c1b512016-09-06 20:57:50 +000062void OptionGroupPlatform::OptionParsingStarting(
63 ExecutionContext *execution_context) {
64 m_platform_name.clear();
65 m_sdk_sysroot.Clear();
66 m_sdk_build.Clear();
67 m_os_version_major = UINT32_MAX;
68 m_os_version_minor = UINT32_MAX;
69 m_os_version_update = UINT32_MAX;
Greg Clayton7260f622011-04-18 08:33:37 +000070}
71
Kate Stoneb9c1b512016-09-06 20:57:50 +000072static OptionDefinition g_option_table[] = {
73 {LLDB_OPT_SET_ALL, false, "platform", 'p', OptionParser::eRequiredArgument,
74 nullptr, nullptr, 0, eArgTypePlatform, "Specify name of the platform to "
75 "use for this target, creating the "
76 "platform if necessary."},
77 {LLDB_OPT_SET_ALL, false, "version", 'v', OptionParser::eRequiredArgument,
78 nullptr, nullptr, 0, eArgTypeNone,
79 "Specify the initial SDK version to use prior to connecting."},
80 {LLDB_OPT_SET_ALL, false, "build", 'b', OptionParser::eRequiredArgument,
81 nullptr, nullptr, 0, eArgTypeNone,
82 "Specify the initial SDK build number."},
83 {LLDB_OPT_SET_ALL, false, "sysroot", 'S', OptionParser::eRequiredArgument,
84 nullptr, nullptr, 0, eArgTypeFilename, "Specify the SDK root directory "
85 "that contains a root of all "
86 "remote system files."}};
Greg Clayton7260f622011-04-18 08:33:37 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088const OptionDefinition *OptionGroupPlatform::GetDefinitions() {
89 if (m_include_platform_option)
90 return g_option_table;
91 return g_option_table + 1;
Greg Clayton7260f622011-04-18 08:33:37 +000092}
93
Kate Stoneb9c1b512016-09-06 20:57:50 +000094uint32_t OptionGroupPlatform::GetNumDefinitions() {
95 if (m_include_platform_option)
96 return llvm::array_lengthof(g_option_table);
97 return llvm::array_lengthof(g_option_table) - 1;
Greg Clayton7260f622011-04-18 08:33:37 +000098}
99
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100Error OptionGroupPlatform::SetOptionValue(uint32_t option_idx,
101 const char *option_arg,
102 ExecutionContext *execution_context) {
103 Error error;
104 if (!m_include_platform_option)
105 ++option_idx;
Greg Clayton7260f622011-04-18 08:33:37 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 const int short_option = g_option_table[option_idx].short_option;
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000108 llvm::StringRef option_strref(option_arg ? option_arg : "");
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 switch (short_option) {
111 case 'p':
112 m_platform_name.assign(option_arg);
113 break;
114
115 case 'v':
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000116 if (!Args::StringToVersion(option_strref, m_os_version_major,
117 m_os_version_minor, m_os_version_update))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 error.SetErrorStringWithFormat("invalid version string '%s'", option_arg);
119 break;
120
121 case 'b':
122 m_sdk_build.SetCString(option_arg);
123 break;
124
125 case 'S':
126 m_sdk_sysroot.SetCString(option_arg);
127 break;
128
129 default:
130 error.SetErrorStringWithFormat("unrecognized option '%c'", short_option);
131 break;
132 }
133 return error;
134}
135
136bool OptionGroupPlatform::PlatformMatches(
137 const lldb::PlatformSP &platform_sp) const {
138 if (platform_sp) {
139 if (!m_platform_name.empty()) {
140 if (platform_sp->GetName() != ConstString(m_platform_name.c_str()))
141 return false;
Greg Clayton7260f622011-04-18 08:33:37 +0000142 }
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild())
145 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory())
148 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 if (m_os_version_major != UINT32_MAX) {
151 uint32_t major, minor, update;
152 if (platform_sp->GetOSVersion(major, minor, update)) {
153 if (m_os_version_major != major)
154 return false;
155 if (m_os_version_minor != minor)
156 return false;
157 if (m_os_version_update != update)
158 return false;
159 }
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000160 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 return true;
162 }
163 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000164}