diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -505,6 +505,16 @@ return process_infos.size(); } +/// Whether to skip creating a simulator platform. +static bool shouldSkipSimulatorPlatform(bool force, const ArchSpec *arch) { + // If the arch is known not to specify a simulator environment, skip creating + // the simulator platform (we can create it later if there's a matching arch). + // This avoids very slow xcrun queries for non-simulator archs (the slowness + // is due to xcrun not caching negative queries (rdar://74882205)). + return !force && arch && arch->IsValid() && + !arch->TripleEnvironmentWasSpecified(); +} + static llvm::StringRef GetXcodeSDKDir(std::string preferred, std::string secondary) { llvm::StringRef sdk; @@ -530,6 +540,8 @@ } 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()) @@ -578,6 +590,8 @@ } static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + if (shouldSkipSimulatorPlatform(force, arch)) + return nullptr; return PlatformAppleSimulator::CreateInstance( "PlatformAppleTVSimulator", g_tvos_description, ConstString(g_tvos_plugin_name), @@ -619,6 +633,8 @@ } static PlatformSP CreateInstance(bool force, const ArchSpec *arch) { + if (shouldSkipSimulatorPlatform(force, arch)) + return nullptr; return PlatformAppleSimulator::CreateInstance( "PlatformAppleWatchSimulator", g_watchos_description, ConstString(g_watchos_plugin_name),