@@ -522,41 +522,69 @@ static void ParseOSVersion(llvm::VersionTuple &version, NSString *Key) {
522
522
return path;
523
523
}
524
524
525
- llvm::Expected<llvm::StringRef> HostInfoMacOSX::GetSDKRoot (SDKOptions options) {
526
- struct ErrorOrPath {
527
- std::string str;
528
- bool is_error;
529
- };
530
- static llvm::StringMap<ErrorOrPath> g_sdk_path;
531
- static std::mutex g_sdk_path_mutex;
525
+ namespace {
526
+ struct ErrorOrPath {
527
+ std::string str;
528
+ bool is_error;
529
+ };
530
+ } // namespace
532
531
533
- std::lock_guard<std::mutex> guard (g_sdk_path_mutex);
532
+ static llvm::Expected<llvm::StringRef>
533
+ find_cached_path (llvm::StringMap<ErrorOrPath> &cache, std::mutex &mutex,
534
+ llvm::StringRef key,
535
+ std::function<llvm::Expected<std::string>(void )> compute) {
536
+ std::lock_guard<std::mutex> guard (mutex);
534
537
LLDB_SCOPED_TIMER ();
535
538
536
- if (!options.XcodeSDK )
537
- return llvm::createStringError (llvm::inconvertibleErrorCode (),
538
- " XCodeSDK not specified" );
539
- XcodeSDK sdk = *options.XcodeSDK ;
540
-
541
- auto key = sdk.GetString ();
542
- auto it = g_sdk_path.find (key);
543
- if (it != g_sdk_path.end ()) {
539
+ auto it = cache.find (key);
540
+ if (it != cache.end ()) {
544
541
if (it->second .is_error )
545
542
return llvm::createStringError (llvm::inconvertibleErrorCode (),
546
543
it->second .str );
547
- else
548
- return it->second .str ;
544
+ return it->second .str ;
549
545
}
550
- auto path_or_err = GetXcodeSDK (sdk );
546
+ auto path_or_err = compute ( );
551
547
if (!path_or_err) {
552
548
std::string error = toString (path_or_err.takeError ());
553
- g_sdk_path .insert ({key, {error, true }});
549
+ cache .insert ({key, {error, true }});
554
550
return llvm::createStringError (llvm::inconvertibleErrorCode (), error);
555
551
}
556
- auto it_new = g_sdk_path .insert ({key, {*path_or_err, false }});
552
+ auto it_new = cache .insert ({key, {*path_or_err, false }});
557
553
return it_new.first ->second .str ;
558
554
}
559
555
556
+ llvm::Expected<llvm::StringRef> HostInfoMacOSX::GetSDKRoot (SDKOptions options) {
557
+ static llvm::StringMap<ErrorOrPath> g_sdk_path;
558
+ static std::mutex g_sdk_path_mutex;
559
+ if (!options.XcodeSDK )
560
+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
561
+ " XCodeSDK not specified" );
562
+ XcodeSDK sdk = *options.XcodeSDK ;
563
+ auto key = sdk.GetString ();
564
+ return find_cached_path (g_sdk_path, g_sdk_path_mutex, key, [&](){
565
+ return GetXcodeSDK (sdk);
566
+ });
567
+ }
568
+
569
+ llvm::Expected<llvm::StringRef>
570
+ HostInfoMacOSX::FindSDKTool (XcodeSDK sdk, llvm::StringRef tool) {
571
+ static llvm::StringMap<ErrorOrPath> g_tool_path;
572
+ static std::mutex g_tool_path_mutex;
573
+ std::string key;
574
+ llvm::raw_string_ostream (key) << sdk.GetString () << " :" << tool;
575
+ return find_cached_path (
576
+ g_tool_path, g_tool_path_mutex, key,
577
+ [&]() -> llvm::Expected<std::string> {
578
+ std::string sdk_name = XcodeSDK::GetCanonicalName (sdk.Parse ());
579
+ if (sdk_name.empty ())
580
+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
581
+ " Unrecognized SDK type: " +
582
+ sdk.GetString ());
583
+ llvm::SmallVector<llvm::StringRef, 2 > find = {" -find" , tool};
584
+ return xcrun (sdk_name, find);
585
+ });
586
+ }
587
+
560
588
namespace {
561
589
struct dyld_shared_cache_dylib_text_info {
562
590
uint64_t version; // current version 1
0 commit comments