1dda28197Spatrick //===-- OptionGroupPlatform.cpp -------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Interpreter/OptionGroupPlatform.h"
10061da546Spatrick
11061da546Spatrick #include "lldb/Host/OptionParser.h"
12061da546Spatrick #include "lldb/Interpreter/CommandInterpreter.h"
13061da546Spatrick #include "lldb/Target/Platform.h"
14061da546Spatrick
15061da546Spatrick using namespace lldb;
16061da546Spatrick using namespace lldb_private;
17061da546Spatrick
CreatePlatformWithOptions(CommandInterpreter & interpreter,const ArchSpec & arch,bool make_selected,Status & error,ArchSpec & platform_arch) const18061da546Spatrick PlatformSP OptionGroupPlatform::CreatePlatformWithOptions(
19061da546Spatrick CommandInterpreter &interpreter, const ArchSpec &arch, bool make_selected,
20061da546Spatrick Status &error, ArchSpec &platform_arch) const {
21*f6aab3d8Srobert PlatformList &platforms = interpreter.GetDebugger().GetPlatformList();
22*f6aab3d8Srobert
23061da546Spatrick PlatformSP platform_sp;
24061da546Spatrick
25061da546Spatrick if (!m_platform_name.empty()) {
26*f6aab3d8Srobert platform_sp = platforms.Create(m_platform_name);
27*f6aab3d8Srobert if (!platform_sp) {
28*f6aab3d8Srobert error.SetErrorStringWithFormatv(
29*f6aab3d8Srobert "unable to find a plug-in for the platform named \"{0}\"",
30*f6aab3d8Srobert m_platform_name);
31*f6aab3d8Srobert }
32061da546Spatrick if (platform_sp) {
33061da546Spatrick if (platform_arch.IsValid() &&
34*f6aab3d8Srobert !platform_sp->IsCompatibleArchitecture(
35*f6aab3d8Srobert arch, {}, ArchSpec::CompatibleMatch, &platform_arch)) {
36*f6aab3d8Srobert error.SetErrorStringWithFormatv("platform '{0}' doesn't support '{1}'",
37*f6aab3d8Srobert platform_sp->GetPluginName(),
38*f6aab3d8Srobert arch.GetTriple().getTriple());
39061da546Spatrick platform_sp.reset();
40061da546Spatrick return platform_sp;
41061da546Spatrick }
42061da546Spatrick }
43061da546Spatrick } else if (arch.IsValid()) {
44*f6aab3d8Srobert platform_sp = platforms.GetOrCreate(arch, {}, &platform_arch, error);
45061da546Spatrick }
46061da546Spatrick
47061da546Spatrick if (platform_sp) {
48*f6aab3d8Srobert if (make_selected)
49*f6aab3d8Srobert platforms.SetSelectedPlatform(platform_sp);
50061da546Spatrick if (!m_os_version.empty())
51061da546Spatrick platform_sp->SetOSVersion(m_os_version);
52061da546Spatrick
53061da546Spatrick if (m_sdk_sysroot)
54061da546Spatrick platform_sp->SetSDKRootDirectory(m_sdk_sysroot);
55061da546Spatrick
56061da546Spatrick if (m_sdk_build)
57061da546Spatrick platform_sp->SetSDKBuild(m_sdk_build);
58061da546Spatrick }
59061da546Spatrick
60061da546Spatrick return platform_sp;
61061da546Spatrick }
62061da546Spatrick
OptionParsingStarting(ExecutionContext * execution_context)63061da546Spatrick void OptionGroupPlatform::OptionParsingStarting(
64061da546Spatrick ExecutionContext *execution_context) {
65061da546Spatrick m_platform_name.clear();
66061da546Spatrick m_sdk_sysroot.Clear();
67061da546Spatrick m_sdk_build.Clear();
68061da546Spatrick m_os_version = llvm::VersionTuple();
69061da546Spatrick }
70061da546Spatrick
71061da546Spatrick static constexpr OptionDefinition g_option_table[] = {
72061da546Spatrick {LLDB_OPT_SET_ALL, false, "platform", 'p', OptionParser::eRequiredArgument,
73061da546Spatrick nullptr, {}, 0, eArgTypePlatform, "Specify name of the platform to "
74061da546Spatrick "use for this target, creating the "
75061da546Spatrick "platform if necessary."},
76061da546Spatrick {LLDB_OPT_SET_ALL, false, "version", 'v', OptionParser::eRequiredArgument,
77061da546Spatrick nullptr, {}, 0, eArgTypeNone,
78061da546Spatrick "Specify the initial SDK version to use prior to connecting."},
79061da546Spatrick {LLDB_OPT_SET_ALL, false, "build", 'b', OptionParser::eRequiredArgument,
80061da546Spatrick nullptr, {}, 0, eArgTypeNone,
81061da546Spatrick "Specify the initial SDK build number."},
82061da546Spatrick {LLDB_OPT_SET_ALL, false, "sysroot", 'S', OptionParser::eRequiredArgument,
83061da546Spatrick nullptr, {}, 0, eArgTypeFilename, "Specify the SDK root directory "
84061da546Spatrick "that contains a root of all "
85061da546Spatrick "remote system files."}};
86061da546Spatrick
GetDefinitions()87061da546Spatrick llvm::ArrayRef<OptionDefinition> OptionGroupPlatform::GetDefinitions() {
88061da546Spatrick llvm::ArrayRef<OptionDefinition> result(g_option_table);
89061da546Spatrick if (m_include_platform_option)
90061da546Spatrick return result;
91061da546Spatrick return result.drop_front();
92061da546Spatrick }
93061da546Spatrick
94061da546Spatrick Status
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)95061da546Spatrick OptionGroupPlatform::SetOptionValue(uint32_t option_idx,
96061da546Spatrick llvm::StringRef option_arg,
97061da546Spatrick ExecutionContext *execution_context) {
98061da546Spatrick Status error;
99061da546Spatrick if (!m_include_platform_option)
100061da546Spatrick ++option_idx;
101061da546Spatrick
102061da546Spatrick const int short_option = g_option_table[option_idx].short_option;
103061da546Spatrick
104061da546Spatrick switch (short_option) {
105061da546Spatrick case 'p':
106dda28197Spatrick m_platform_name.assign(std::string(option_arg));
107061da546Spatrick break;
108061da546Spatrick
109061da546Spatrick case 'v':
110061da546Spatrick if (m_os_version.tryParse(option_arg))
111061da546Spatrick error.SetErrorStringWithFormatv("invalid version string '{0}'",
112061da546Spatrick option_arg);
113061da546Spatrick break;
114061da546Spatrick
115061da546Spatrick case 'b':
116061da546Spatrick m_sdk_build.SetString(option_arg);
117061da546Spatrick break;
118061da546Spatrick
119061da546Spatrick case 'S':
120061da546Spatrick m_sdk_sysroot.SetString(option_arg);
121061da546Spatrick break;
122061da546Spatrick
123061da546Spatrick default:
124061da546Spatrick llvm_unreachable("Unimplemented option");
125061da546Spatrick }
126061da546Spatrick return error;
127061da546Spatrick }
128061da546Spatrick
PlatformMatches(const lldb::PlatformSP & platform_sp) const129061da546Spatrick bool OptionGroupPlatform::PlatformMatches(
130061da546Spatrick const lldb::PlatformSP &platform_sp) const {
131061da546Spatrick if (platform_sp) {
132061da546Spatrick if (!m_platform_name.empty()) {
133*f6aab3d8Srobert if (platform_sp->GetName() != m_platform_name)
134061da546Spatrick return false;
135061da546Spatrick }
136061da546Spatrick
137061da546Spatrick if (m_sdk_build && m_sdk_build != platform_sp->GetSDKBuild())
138061da546Spatrick return false;
139061da546Spatrick
140061da546Spatrick if (m_sdk_sysroot && m_sdk_sysroot != platform_sp->GetSDKRootDirectory())
141061da546Spatrick return false;
142061da546Spatrick
143061da546Spatrick if (!m_os_version.empty() && m_os_version != platform_sp->GetOSVersion())
144061da546Spatrick return false;
145061da546Spatrick return true;
146061da546Spatrick }
147061da546Spatrick return false;
148061da546Spatrick }
149