xref: /openbsd-src/gnu/llvm/lldb/source/Interpreter/OptionGroupPlatform.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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