diff --git a/lldb/include/lldb/Utility/XcodeSDK.h b/lldb/include/lldb/Utility/XcodeSDK.h --- a/lldb/include/lldb/Utility/XcodeSDK.h +++ b/lldb/include/lldb/Utility/XcodeSDK.h @@ -14,6 +14,10 @@ #include "llvm/Support/VersionTuple.h" #include +namespace llvm { +class Triple; +} + namespace lldb_private { /// An abstraction for Xcode-style SDKs that works like \ref ArchSpec. @@ -72,6 +76,8 @@ static bool SDKSupportsModules(Type desired_type, const FileSpec &sdk_path); /// Return the canonical SDK name, such as "macosx" for the macOS SDK. static std::string GetCanonicalName(Info info); + /// Return the best-matching SDK type for a specific triple. + static XcodeSDK::Type GetSDKTypeForTriple(const llvm::Triple &triple); }; } // namespace lldb_private diff --git a/lldb/source/Utility/XcodeSDK.cpp b/lldb/source/Utility/XcodeSDK.cpp --- a/lldb/source/Utility/XcodeSDK.cpp +++ b/lldb/source/Utility/XcodeSDK.cpp @@ -6,10 +6,13 @@ // //===----------------------------------------------------------------------===// -#include "lldb/Utility/FileSpec.h" #include "lldb/Utility/XcodeSDK.h" +#include "lldb/Utility/FileSpec.h" #include "lldb/lldb-types.h" + +#include "llvm/ADT/Triple.h" + #include using namespace lldb; @@ -190,3 +193,33 @@ return false; return SDKSupportsModules(sdk.GetType(), sdk.GetVersion()); } + +XcodeSDK::Type XcodeSDK::GetSDKTypeForTriple(const llvm::Triple &triple) { + using namespace llvm; + switch (triple.getOS()) { + case Triple::MacOSX: + case Triple::Darwin: + return XcodeSDK::MacOSX; + case Triple::IOS: + switch (triple.getEnvironment()) { + case Triple::MacABI: + return XcodeSDK::MacOSX; + case Triple::Simulator: + return XcodeSDK::iPhoneSimulator; + default: + return XcodeSDK::iPhoneOS; + } + case Triple::TvOS: + if (triple.getEnvironment() == Triple::Simulator) + return XcodeSDK::AppleTVSimulator; + return XcodeSDK::AppleTVOS; + case Triple::WatchOS: + if (triple.getEnvironment() == Triple::Simulator) + return XcodeSDK::WatchSimulator; + return XcodeSDK::watchOS; + case Triple::Linux: + return XcodeSDK::Linux; + default: + return XcodeSDK::unknown; + } +} diff --git a/lldb/unittests/Utility/XcodeSDKTest.cpp b/lldb/unittests/Utility/XcodeSDKTest.cpp --- a/lldb/unittests/Utility/XcodeSDKTest.cpp +++ b/lldb/unittests/Utility/XcodeSDKTest.cpp @@ -12,6 +12,7 @@ #include "lldb/Utility/XcodeSDK.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Triple.h" #include @@ -147,3 +148,33 @@ info.version = llvm::VersionTuple(7, 0); EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info)); } + +TEST(XcodeSDKTest, GetSDKTypeForTriple) { + EXPECT_EQ( + XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")), + XcodeSDK::Type::MacOSX); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")), + XcodeSDK::Type::MacOSX); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( + llvm::Triple("x86_64-apple-ios13.4-simulator")), + XcodeSDK::Type::iPhoneSimulator); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")), + XcodeSDK::Type::iPhoneOS); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( + llvm::Triple("x86_64-apple-ios13.4-macabi")), + XcodeSDK::Type::MacOSX); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( + llvm::Triple("x86_64-apple-tvos-simulator")), + XcodeSDK::Type::AppleTVSimulator); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")), + XcodeSDK::Type::AppleTVOS); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( + llvm::Triple("x86_64-apple-watchos-simulator")), + XcodeSDK::Type::WatchSimulator); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")), + XcodeSDK::Type::watchOS); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")), + XcodeSDK::Type::Linux); + EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")), + XcodeSDK::Type::unknown); +}