14#include "llvm/TargetParser/Triple.h"
26 return "iPhoneSimulator";
30 return "AppleTVSimulator";
34 return "WatchSimulator";
48 llvm_unreachable(
"Unhandled sdk type!");
53 if (!info.version.empty())
54 m_name += info.version.getAsString();
56 m_name +=
".Internal";
68 if (name.consume_front(
"MacOSX"))
70 if (name.consume_front(
"iPhoneSimulator"))
72 if (name.consume_front(
"iPhoneOS"))
74 if (name.consume_front(
"AppleTVSimulator"))
76 if (name.consume_front(
"AppleTVOS"))
78 if (name.consume_front(
"WatchSimulator"))
80 if (name.consume_front(
"WatchOS"))
82 if (name.consume_front(
"XRSimulator"))
84 if (name.consume_front(
"XROS"))
86 if (name.consume_front(
"BridgeOS"))
88 if (name.consume_front(
"Linux"))
91 "New SDK type was added, update this list!");
97 while (i < name.size() && name[i] >=
'0' && name[i] <=
'9')
99 if (i == name.size() || name[i++] !=
'.')
101 while (i < name.size() && name[i] >=
'0' && name[i] <=
'9')
103 if (i == name.size() || name[i++] !=
'.')
106 llvm::VersionTuple version;
107 version.tryParse(name.slice(0, i - 1));
108 name = name.drop_front(i);
113 return name.consume_front(
"Internal.") || name.consume_front(
".Internal.");
118 llvm::StringRef input(
m_name);
126 llvm::StringRef input(
m_name);
133 llvm::StringRef input(
m_name);
139 llvm::StringRef input(
m_name);
158 auto add_internal_sdk_suffix = [](llvm::StringRef sdk) {
159 return (sdk.substr(0, sdk.size() - 3) +
"Internal.sdk").str();
164 auto r = other.
Parse();
169 if (!
l.internal && r.internal) {
170 if (llvm::StringRef(
m_name).ends_with(
".sdk")) {
177 if (
m_sysroot.GetFileNameExtension() ==
".sdk")
179 add_internal_sdk_suffix(
m_sysroot.GetFilename()));
192 name =
"iphonesimulator";
198 name =
"appletvsimulator";
204 name =
"watchsimulator";
210 name =
"xrsimulator";
225 name += info.
version.getAsString();
232 llvm::VersionTuple version) {
235 return version >= llvm::VersionTuple(10, 10);
240 return version >= llvm::VersionTuple(8);
243 return version >= llvm::VersionTuple(6);
256 llvm::StringRef last_path_component = sdk_path.
GetFilename();
258 if (last_path_component.empty())
261 XcodeSDK sdk(last_path_component.str());
262 if (sdk.
GetType() != desired_type)
268 using namespace llvm;
269 switch (triple.getOS()) {
274 switch (triple.getEnvironment()) {
277 case Triple::Simulator:
283 if (triple.getEnvironment() == Triple::Simulator)
286 case Triple::WatchOS:
287 if (triple.getEnvironment() == Triple::Simulator)
291 if (triple.getEnvironment() == Triple::Simulator)
302 auto begin = llvm::sys::path::begin(path);
303 auto end = llvm::sys::path::end(path);
308 for (
auto it = begin; it != end; ++it) {
309 if (it->ends_with(
".app")) {
311 if (++next != end && *next ==
"Contents") {
312 llvm::SmallString<128> buffer;
313 llvm::sys::path::append(buffer, begin, ++next,
314 llvm::sys::path::Style::posix);
315 return buffer.str().str();
static llvm::VersionTuple ParseSDKVersion(llvm::StringRef &name)
static llvm::StringRef GetName(XcodeSDK::Type type)
static bool ParseAppleInternalSDK(llvm::StringRef &name)
static XcodeSDK::Type ParseSDKName(llvm::StringRef &name)
llvm::StringRef GetFilename() const
Filename string const get accessor.
An abstraction for Xcode-style SDKs that works like ArchSpec.
static constexpr int numSDKTypes
Type
Different types of Xcode SDKs.
static std::string FindXcodeContentsDirectoryInPath(llvm::StringRef path)
const FileSpec & GetSysroot() const
void Merge(const XcodeSDK &other)
The merge function follows a strict order to maintain monotonicity:
XcodeSDK & operator=(const XcodeSDK &other)
XcodeSDK()=default
Default constructor, constructs an empty string.
llvm::VersionTuple GetVersion() const
llvm::StringRef GetString() const
static std::string GetCanonicalName(Info info)
Return the canonical SDK name, such as "macosx" for the macOS SDK.
static XcodeSDK::Type GetSDKTypeForTriple(const llvm::Triple &triple)
Return the best-matching SDK type for a specific triple.
Info Parse() const
Return parsed SDK type and version number.
bool operator==(const XcodeSDK &other) const
bool IsAppleInternalSDK() const
static bool SDKSupportsModules(Type type, llvm::VersionTuple version)
Whether LLDB feels confident importing Clang modules from this SDK.
A class that represents a running process on the host machine.
A parsed SDK directory name.
llvm::VersionTuple version
bool operator<(const Info &other) const
bool operator==(const Info &other) const