blob: 62311626f10941359c6e096cf384598b5e305395 [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
Zachary Turner1f0f5b52016-09-22 20:22:55 +000088llvm::ArrayRef<OptionDefinition> OptionGroupPlatform::GetDefinitions() {
89 llvm::ArrayRef<OptionDefinition> result(g_option_table);
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 if (m_include_platform_option)
Zachary Turner1f0f5b52016-09-22 20:22:55 +000091 return result;
92 return result.drop_front();
Greg Clayton7260f622011-04-18 08:33:37 +000093}
94
Kate Stoneb9c1b512016-09-06 20:57:50 +000095Error OptionGroupPlatform::SetOptionValue(uint32_t option_idx,
Zachary Turner8cef4b02016-09-23 17:48:13 +000096 llvm::StringRef option_arg,
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 ExecutionContext *execution_context) {
98 Error error;
99 if (!m_include_platform_option)
100 ++option_idx;
Greg Clayton7260f622011-04-18 08:33:37 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 const int short_option = g_option_table[option_idx].short_option;
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 switch (short_option) {
105 case 'p':
106 m_platform_name.assign(option_arg);
107 break;
108
109 case 'v':
Zachary Turner8cef4b02016-09-23 17:48:13 +0000110 if (!Args::StringToVersion(option_arg, m_os_version_major,
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000111 m_os_version_minor, m_os_version_update))
Zachary Turner8cef4b02016-09-23 17:48:13 +0000112 error.SetErrorStringWithFormat("invalid version string '%s'",
113 option_arg.str().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 break;
115
116 case 'b':
Zachary Turner8cef4b02016-09-23 17:48:13 +0000117 m_sdk_build.SetString(option_arg);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 break;
119
120 case 'S':
Zachary Turner8cef4b02016-09-23 17:48:13 +0000121 m_sdk_sysroot.SetString(option_arg);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 break;
123
124 default:
125 error.SetErrorStringWithFormat("unrecognized option '%c'", short_option);
126 break;
127 }
128 return error;
129}
130
131bool OptionGroupPlatform::PlatformMatches(
132 const lldb::PlatformSP &platform_sp) const {
133 if (platform_sp) {
134 if (!m_platform_name.empty()) {
135 if (platform_sp->GetName() != ConstString(m_platform_name.c_str()))
136 return false;
Greg Clayton7260f622011-04-18 08:33:37 +0000137 }
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000138
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild())
140 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory())
143 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 if (m_os_version_major != UINT32_MAX) {
146 uint32_t major, minor, update;
147 if (platform_sp->GetOSVersion(major, minor, update)) {
148 if (m_os_version_major != major)
149 return false;
150 if (m_os_version_minor != minor)
151 return false;
152 if (m_os_version_update != update)
153 return false;
154 }
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000155 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 return true;
157 }
158 return false;
Greg Claytonccd2a6d2015-01-28 01:33:37 +0000159}