jasonmolenda created this revision. jasonmolenda added a reviewer: aprantl. jasonmolenda added a project: LLDB. Herald added a subscriber: JDevlieghere. Herald added a project: All. jasonmolenda requested review of this revision. Herald added a subscriber: lldb-commits.
This is a perf fix for when lldb on a mac is iterating through all of the Platforms looking for a good one, and the iOS/watchOS/tvOS simulators all call xcrun to find an SDK. If those SDKs are not installed, the xcruns can be quite expensive. The code today determines the SDK path before it knows if the Platform will create itself or not. When the SDKs are present, these xcrun calls are very inexpensive, but some people have different setups. This patch passes the names of the SDKs into the central method that decides whether to create the Platform, and only searches for the SDK path via xcrun if this Platform is a match. Adrian, I think you might have written this? If you'd like to review. Else I can ask around if anyone wants to take a look. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D122373 Files: lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h
Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h @@ -59,7 +59,8 @@ llvm::Triple::OSType preferred_os, llvm::SmallVector<llvm::Triple::OSType, 4> supported_os, llvm::SmallVector<llvm::StringRef, 4> supported_triples, - llvm::StringRef sdk, XcodeSDK::Type sdk_type, + std::string sdk_name_preferred, std::string sdk_name_secondary, + XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind, bool force, const ArchSpec *arch); Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -274,13 +274,23 @@ return result; } +static llvm::StringRef GetXcodeSDKDir(std::string preferred, + std::string secondary) { + llvm::StringRef sdk; + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(preferred))); + if (sdk.empty()) + sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(secondary))); + return sdk; +} + PlatformSP PlatformAppleSimulator::CreateInstance( const char *class_name, const char *description, ConstString plugin_name, llvm::SmallVector<llvm::Triple::ArchType, 4> supported_arch, llvm::Triple::OSType preferred_os, llvm::SmallVector<llvm::Triple::OSType, 4> supported_os, llvm::SmallVector<llvm::StringRef, 4> supported_triples, - llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, + std::string sdk_name_preferred, std::string sdk_name_secondary, + lldb_private::XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind, bool force, const ArchSpec *arch) { Log *log = GetLog(LLDBLog::Platform); @@ -338,6 +348,8 @@ if (create) { LLDB_LOGF(log, "%s::%s() creating platform", class_name, __FUNCTION__); + llvm::StringRef sdk = + GetXcodeSDKDir(sdk_name_preferred, sdk_name_secondary); return PlatformSP(new PlatformAppleSimulator( class_name, description, plugin_name, preferred_os, supported_triples, sdk, sdk_type, kind)); @@ -514,15 +526,6 @@ !arch->TripleEnvironmentWasSpecified(); } -static llvm::StringRef GetXcodeSDKDir(std::string preferred, - std::string secondary) { - llvm::StringRef sdk; - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(preferred))); - if (sdk.empty()) - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(secondary))); - return sdk; -} - static const char *g_ios_plugin_name = "ios-simulator"; static const char *g_ios_description = "iPhone simulator platform plug-in."; @@ -540,10 +543,6 @@ static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { if (shouldSkipSimulatorPlatform(force, arch)) return nullptr; - llvm::StringRef sdk; - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.Internal.sdk")); - if (sdk.empty()) - sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.sdk")); return PlatformAppleSimulator::CreateInstance( "PlatformiOSSimulator", g_ios_description, @@ -566,7 +565,7 @@ #endif #endif }, - GetXcodeSDKDir("iPhoneSimulator.Internal.sdk", "iPhoneSimulator.sdk"), + "iPhoneSimulator.Internal.sdk", "iPhoneSimulator.sdk", XcodeSDK::Type::iPhoneSimulator, CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone, force, arch); } @@ -604,7 +603,7 @@ #endif #endif }, - GetXcodeSDKDir("AppleTVSimulator.Internal.sdk", "AppleTVSimulator.sdk"), + "AppleTVSimulator.Internal.sdk", "AppleTVSimulator.sdk", XcodeSDK::Type::AppleTVSimulator, CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV, force, arch); @@ -646,7 +645,7 @@ #endif #endif }, - GetXcodeSDKDir("WatchSimulator.Internal.sdk", "WatchSimulator.sdk"), + "WatchSimulator.Internal.sdk", "WatchSimulator.sdk", XcodeSDK::Type::WatchSimulator, CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch, force, arch); Index: lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm =================================================================== --- lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm +++ lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm @@ -379,6 +379,13 @@ args.AppendArgument("--sdk"); args.AppendArgument(sdk); + Log *log = GetLog(LLDBLog::Host); + if (log) { + std::string cmdstr; + args.GetCommandString(cmdstr); + log->Printf("GetXcodeSDK() running shell cmd '%s'", cmdstr.c_str()); + } + int status = 0; int signo = 0; std::string output_str;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits