https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/128712
>From 2665e747d5866480f2f704d5a72fe016d258f200 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Tue, 25 Feb 2025 13:11:33 +0000 Subject: [PATCH 1/2] [lldb]HostInfoMacOSX] Search CommandLineTools directory when looking up SDK paths `GetSDKRoot` uses `xcrun` to find an SDK root path for a given SDK version string. But if the SDK doesn't exist in the Xcode installations, but instead lives in the `CommandLineTools`, `xcrun` will fail to find it. Negative searches for an SDK path cost a lot (a few seconds) each time `xcrun` is invoked. We do cache negative results in `find_cached_path` inside LLDB, but we would still pay the price on every new debug session the first time we evaluate an expression. This doesn't only cause a noticable delay in running the expression, but also generates following error: ``` error: Error while searching for Xcode SDK: timed out waiting for shell command to complete (int) $0 = 42 ``` To avoid this `xcrun` penalty, we search `CommandLineTools` for a matching SDK ourselves, and only if we don't find it, do we fall back to calling `xcrun`. rdar://113619904 rdar://113619723 --- lldb/include/lldb/Host/FileSystem.h | 5 +- .../Host/macosx/objcxx/HostInfoMacOSX.mm | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lldb/include/lldb/Host/FileSystem.h b/lldb/include/lldb/Host/FileSystem.h index 640f3846e448c..4128d7b012041 100644 --- a/lldb/include/lldb/Host/FileSystem.h +++ b/lldb/include/lldb/Host/FileSystem.h @@ -183,8 +183,9 @@ class FileSystem { eEnumerateDirectoryResultQuit }; - typedef EnumerateDirectoryResult (*EnumerateDirectoryCallbackType)( - void *baton, llvm::sys::fs::file_type file_type, llvm::StringRef); + typedef std::function<EnumerateDirectoryResult( + void *baton, llvm::sys::fs::file_type file_type, llvm::StringRef)> + EnumerateDirectoryCallbackType; typedef std::function<EnumerateDirectoryResult( llvm::sys::fs::file_type file_type, llvm::StringRef)> diff --git a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm index 6e924fdc684cf..a94fd3b57f9d6 100644 --- a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm +++ b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm @@ -15,11 +15,14 @@ #include "lldb/Utility/Log.h" #include "lldb/Utility/Timer.h" +#include "clang/Basic/DarwinSDKInfo.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringMap.h" +#include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/VersionTuple.h" #include "llvm/Support/raw_ostream.h" // C++ Includes @@ -569,10 +572,52 @@ static bool ResolveAndVerifyCandidateSupportDir(FileSpec &path) { cache.insert({key, {error, true}}); return llvm::createStringError(llvm::inconvertibleErrorCode(), error); } + + if (path_or_err->empty()) + return llvm::createStringError("Empty path determined for '%s'", + key.data()); + auto it_new = cache.insert({key, {*path_or_err, false}}); return it_new.first->second.str; } +static llvm::Expected<std::string> +GetCommandLineToolsSDKRoot(llvm::VersionTuple version) { + std::string clt_root_dir; + FileSystem::Instance().EnumerateDirectory( + "/Library/Developer/CommandLineTools/SDKs/", /*find_directories=*/true, + /*find_files=*/false, /*find_other=*/false, + [&](void *baton, llvm::sys::fs::file_type file_type, + llvm::StringRef name) { + assert(file_type == llvm::sys::fs::file_type::directory_file); + + if (!name.ends_with(".sdk")) + return FileSystem::eEnumerateDirectoryResultNext; + + llvm::Expected<std::optional<clang::DarwinSDKInfo>> sdk_info = + clang::parseDarwinSDKInfo( + *FileSystem::Instance().GetVirtualFileSystem(), name); + if (!sdk_info) { + LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), sdk_info.takeError(), + "Error while parsing {1}: {0}", name); + return FileSystem::eEnumerateDirectoryResultNext; + } + + if (!*sdk_info) + return FileSystem::eEnumerateDirectoryResultNext; + + if (version == (*sdk_info)->getVersion()) { + clt_root_dir = name; + return FileSystem::eEnumerateDirectoryResultQuit; + } + + return FileSystem::eEnumerateDirectoryResultNext; + }, + /*baton=*/nullptr); + + return clt_root_dir; +} + llvm::Expected<llvm::StringRef> HostInfoMacOSX::GetSDKRoot(SDKOptions options) { static llvm::StringMap<ErrorOrPath> g_sdk_path; static std::mutex g_sdk_path_mutex; @@ -581,6 +626,21 @@ static bool ResolveAndVerifyCandidateSupportDir(FileSpec &path) { "XcodeSDK not specified"); XcodeSDK sdk = *options.XcodeSDKSelection; auto key = sdk.GetString(); + + // xcrun doesn't search SDKs in the CommandLineTools (CLT) directory. So if + // a program was compiled against a CLT SDK, but that SDK wasn't present in + // any of the Xcode installations, then xcrun would fail to find the SDK + // (which is expensive). To avoid this we first try to find the specified SDK + // in the CLT directory. + auto clt_root_dir = find_cached_path(g_sdk_path, g_sdk_path_mutex, key, [&] { + return GetCommandLineToolsSDKRoot(sdk.GetVersion()); + }); + + if (clt_root_dir) + return clt_root_dir; + else + llvm::consumeError(clt_root_dir.takeError()); + return find_cached_path(g_sdk_path, g_sdk_path_mutex, key, [&](){ return GetXcodeSDK(sdk); }); >From 96ae6dbf77692fb063eae65a15730997b3f65303 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 28 Feb 2025 12:55:03 +0000 Subject: [PATCH 2/2] fixup! if path at DW_AT_LLVM_sysroot exists, use it --- lldb/include/lldb/Host/FileSystem.h | 5 +- lldb/include/lldb/Symbol/SymbolFile.h | 6 +- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 2 +- lldb/include/lldb/Target/Platform.h | 24 +------- .../Host/macosx/objcxx/HostInfoMacOSX.mm | 60 ------------------- .../Clang/ClangExpressionParser.cpp | 8 +-- .../Platform/MacOSX/PlatformDarwin.cpp | 56 ++++------------- .../Plugins/Platform/MacOSX/PlatformDarwin.h | 6 +- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 32 ++++++---- .../SymbolFile/DWARF/SymbolFileDWARF.h | 3 +- .../DWARF/SymbolFileDWARFDebugMap.cpp | 3 +- .../DWARF/SymbolFileDWARFDebugMap.h | 3 +- lldb/source/Symbol/SymbolFileOnDemand.cpp | 7 ++- .../SymbolFile/DWARF/XcodeSDKModuleTests.cpp | 2 +- 14 files changed, 54 insertions(+), 163 deletions(-) diff --git a/lldb/include/lldb/Host/FileSystem.h b/lldb/include/lldb/Host/FileSystem.h index 4128d7b012041..640f3846e448c 100644 --- a/lldb/include/lldb/Host/FileSystem.h +++ b/lldb/include/lldb/Host/FileSystem.h @@ -183,9 +183,8 @@ class FileSystem { eEnumerateDirectoryResultQuit }; - typedef std::function<EnumerateDirectoryResult( - void *baton, llvm::sys::fs::file_type file_type, llvm::StringRef)> - EnumerateDirectoryCallbackType; + typedef EnumerateDirectoryResult (*EnumerateDirectoryCallbackType)( + void *baton, llvm::sys::fs::file_type file_type, llvm::StringRef); typedef std::function<EnumerateDirectoryResult( llvm::sys::fs::file_type file_type, llvm::StringRef)> diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 837b922ae77f7..d417899e97084 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -32,6 +32,7 @@ #include <mutex> #include <optional> #include <unordered_map> +#include <utility> #if defined(LLDB_CONFIGURATION_DEBUG) #define ASSERT_MODULE_LOCK(expr) (expr->AssertModuleLock()) @@ -148,7 +149,10 @@ class SymbolFile : public PluginInterface { virtual lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) = 0; /// Return the Xcode SDK comp_unit was compiled against. - virtual XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) { return {}; } + virtual std::pair<XcodeSDK, std::string> + ParseXcodeSDK(CompileUnit &comp_unit) { + return {}; + } /// This function exists because SymbolFileDWARFDebugMap may extra compile /// units which aren't exposed as "real" compile units. In every other diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index 7a366bfabec86..77e7b50539043 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -65,7 +65,7 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { lldb::LanguageType ParseLanguage(lldb_private::CompileUnit &comp_unit) override; - lldb_private::XcodeSDK + std::pair<lldb_private::XcodeSDK, std::string> ParseXcodeSDK(lldb_private::CompileUnit &comp_unit) override; void InitializeObject() override; diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h index a702abb540fd9..5f85caeb790ba 100644 --- a/lldb/include/lldb/Target/Platform.h +++ b/lldb/include/lldb/Target/Platform.h @@ -438,25 +438,6 @@ class Platform : public PluginInterface { return lldb_private::ConstString(); } - /// Search each CU associated with the specified 'module' for - /// the SDK paths the CUs were compiled against. In the presence - /// of different SDKs, we try to pick the most appropriate one - /// using \ref XcodeSDK::Merge. - /// - /// \param[in] module Module whose debug-info CUs to parse for - /// which SDK they were compiled against. - /// - /// \returns If successful, returns a pair of a parsed XcodeSDK - /// object and a boolean that is 'true' if we encountered - /// a conflicting combination of SDKs when parsing the CUs - /// (e.g., a public and internal SDK). - virtual llvm::Expected<std::pair<XcodeSDK, bool>> - GetSDKPathFromDebugInfo(Module &module) { - return llvm::createStringError( - llvm::formatv("{0} not implemented for '{1}' platform.", - LLVM_PRETTY_FUNCTION, GetName())); - } - /// Returns the full path of the most appropriate SDK for the /// specified 'module'. This function gets this path by parsing /// debug-info (see \ref `GetSDKPathFromDebugInfo`). @@ -477,8 +458,9 @@ class Platform : public PluginInterface { /// /// \param[in] unit The CU /// - /// \returns A parsed XcodeSDK object if successful, an Error otherwise. - virtual llvm::Expected<XcodeSDK> GetSDKPathFromDebugInfo(CompileUnit &unit) { + /// \returns A parsed XcodeSDK object if successful, an Error otherwise. + virtual llvm::Expected<std::pair<XcodeSDK, std::string>> + GetSDKPathFromDebugInfo(CompileUnit &unit) { return llvm::createStringError( llvm::formatv("{0} not implemented for '{1}' platform.", LLVM_PRETTY_FUNCTION, GetName())); diff --git a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm index a94fd3b57f9d6..6e924fdc684cf 100644 --- a/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm +++ b/lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm @@ -15,14 +15,11 @@ #include "lldb/Utility/Log.h" #include "lldb/Utility/Timer.h" -#include "clang/Basic/DarwinSDKInfo.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringMap.h" -#include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" -#include "llvm/Support/VersionTuple.h" #include "llvm/Support/raw_ostream.h" // C++ Includes @@ -572,52 +569,10 @@ static bool ResolveAndVerifyCandidateSupportDir(FileSpec &path) { cache.insert({key, {error, true}}); return llvm::createStringError(llvm::inconvertibleErrorCode(), error); } - - if (path_or_err->empty()) - return llvm::createStringError("Empty path determined for '%s'", - key.data()); - auto it_new = cache.insert({key, {*path_or_err, false}}); return it_new.first->second.str; } -static llvm::Expected<std::string> -GetCommandLineToolsSDKRoot(llvm::VersionTuple version) { - std::string clt_root_dir; - FileSystem::Instance().EnumerateDirectory( - "/Library/Developer/CommandLineTools/SDKs/", /*find_directories=*/true, - /*find_files=*/false, /*find_other=*/false, - [&](void *baton, llvm::sys::fs::file_type file_type, - llvm::StringRef name) { - assert(file_type == llvm::sys::fs::file_type::directory_file); - - if (!name.ends_with(".sdk")) - return FileSystem::eEnumerateDirectoryResultNext; - - llvm::Expected<std::optional<clang::DarwinSDKInfo>> sdk_info = - clang::parseDarwinSDKInfo( - *FileSystem::Instance().GetVirtualFileSystem(), name); - if (!sdk_info) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), sdk_info.takeError(), - "Error while parsing {1}: {0}", name); - return FileSystem::eEnumerateDirectoryResultNext; - } - - if (!*sdk_info) - return FileSystem::eEnumerateDirectoryResultNext; - - if (version == (*sdk_info)->getVersion()) { - clt_root_dir = name; - return FileSystem::eEnumerateDirectoryResultQuit; - } - - return FileSystem::eEnumerateDirectoryResultNext; - }, - /*baton=*/nullptr); - - return clt_root_dir; -} - llvm::Expected<llvm::StringRef> HostInfoMacOSX::GetSDKRoot(SDKOptions options) { static llvm::StringMap<ErrorOrPath> g_sdk_path; static std::mutex g_sdk_path_mutex; @@ -626,21 +581,6 @@ static bool ResolveAndVerifyCandidateSupportDir(FileSpec &path) { "XcodeSDK not specified"); XcodeSDK sdk = *options.XcodeSDKSelection; auto key = sdk.GetString(); - - // xcrun doesn't search SDKs in the CommandLineTools (CLT) directory. So if - // a program was compiled against a CLT SDK, but that SDK wasn't present in - // any of the Xcode installations, then xcrun would fail to find the SDK - // (which is expensive). To avoid this we first try to find the specified SDK - // in the CLT directory. - auto clt_root_dir = find_cached_path(g_sdk_path, g_sdk_path_mutex, key, [&] { - return GetCommandLineToolsSDKRoot(sdk.GetVersion()); - }); - - if (clt_root_dir) - return clt_root_dir; - else - llvm::consumeError(clt_root_dir.takeError()); - return find_cached_path(g_sdk_path, g_sdk_path_mutex, key, [&](){ return GetXcodeSDK(sdk); }); diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index f1573bae2651b..e980c914afd1a 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -336,13 +336,7 @@ sdkSupportsBuiltinModules(lldb_private::Target &target) { if (!platform_sp) return llvm::createStringError("No Platform plugin found on target."); - auto sdk_or_err = platform_sp->GetSDKPathFromDebugInfo(*module_sp); - if (!sdk_or_err) - return sdk_or_err.takeError(); - - // Use the SDK path from debug-info to find a local matching SDK directory. - auto sdk_path_or_err = - HostInfo::GetSDKRoot(HostInfo::SDKOptions{std::move(sdk_or_err->first)}); + auto sdk_path_or_err = platform_sp->ResolveSDKPathFromDebugInfo(*module_sp); if (!sdk_path_or_err) return sdk_path_or_err.takeError(); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp index 51e9a6d81b839..ef10481503efe 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -1386,57 +1386,18 @@ llvm::Triple::OSType PlatformDarwin::GetHostOSType() { #endif // __APPLE__ } -llvm::Expected<std::pair<XcodeSDK, bool>> -PlatformDarwin::GetSDKPathFromDebugInfo(Module &module) { - SymbolFile *sym_file = module.GetSymbolFile(); - if (!sym_file) - return llvm::createStringError( - llvm::inconvertibleErrorCode(), - llvm::formatv("No symbol file available for module '{0}'", - module.GetFileSpec().GetFilename().AsCString(""))); - - bool found_public_sdk = false; - bool found_internal_sdk = false; - XcodeSDK merged_sdk; - for (unsigned i = 0; i < sym_file->GetNumCompileUnits(); ++i) { - if (auto cu_sp = sym_file->GetCompileUnitAtIndex(i)) { - auto cu_sdk = sym_file->ParseXcodeSDK(*cu_sp); - bool is_internal_sdk = cu_sdk.IsAppleInternalSDK(); - found_public_sdk |= !is_internal_sdk; - found_internal_sdk |= is_internal_sdk; - - merged_sdk.Merge(cu_sdk); - } - } - - const bool found_mismatch = found_internal_sdk && found_public_sdk; - - return std::pair{std::move(merged_sdk), found_mismatch}; -} - llvm::Expected<std::string> PlatformDarwin::ResolveSDKPathFromDebugInfo(Module &module) { - auto sdk_or_err = GetSDKPathFromDebugInfo(module); - if (!sdk_or_err) + auto cu_sp = module.GetCompileUnitAtIndex(0); + if (!cu_sp) return llvm::createStringError( - llvm::inconvertibleErrorCode(), - llvm::formatv("Failed to parse SDK path from debug-info: {0}", - llvm::toString(sdk_or_err.takeError()))); - - auto [sdk, _] = std::move(*sdk_or_err); - - auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk}); - if (!path_or_err) - return llvm::createStringError( - llvm::inconvertibleErrorCode(), - llvm::formatv("Error while searching for SDK (XcodeSDK '{0}'): {1}", - sdk.GetString(), - llvm::toString(path_or_err.takeError()))); + "Couldn't retrieve compile-unit for module '%s'.", + module.GetObjectName().AsCString("<null>")); - return path_or_err->str(); + return ResolveSDKPathFromDebugInfo(*cu_sp); } -llvm::Expected<XcodeSDK> +llvm::Expected<std::pair<XcodeSDK, std::string>> PlatformDarwin::GetSDKPathFromDebugInfo(CompileUnit &unit) { ModuleSP module_sp = unit.CalculateSymbolContextModule(); if (!module_sp) @@ -1459,7 +1420,10 @@ PlatformDarwin::ResolveSDKPathFromDebugInfo(CompileUnit &unit) { llvm::formatv("Failed to parse SDK path from debug-info: {0}", llvm::toString(sdk_or_err.takeError()))); - auto sdk = std::move(*sdk_or_err); + auto [sdk, sysroot] = std::move(*sdk_or_err); + + if (FileSystem::Instance().Exists(sysroot)) + return sysroot; auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk}); if (!path_or_err) diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h index e2d4cb6726d58..0a4e6c9938c17 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h @@ -124,13 +124,11 @@ class PlatformDarwin : public PlatformPOSIX { /// located in. static FileSpec GetCurrentCommandLineToolsDirectory(); - llvm::Expected<std::pair<XcodeSDK, bool>> - GetSDKPathFromDebugInfo(Module &module) override; - llvm::Expected<std::string> ResolveSDKPathFromDebugInfo(Module &module) override; - llvm::Expected<XcodeSDK> GetSDKPathFromDebugInfo(CompileUnit &unit) override; + llvm::Expected<std::pair<XcodeSDK, std::string>> + GetSDKPathFromDebugInfo(CompileUnit &unit) override; llvm::Expected<std::string> ResolveSDKPathFromDebugInfo(CompileUnit &unit) override; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index a96757afabddf..714586a4e2468 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -982,7 +982,8 @@ lldb::LanguageType SymbolFileDWARF::ParseLanguage(CompileUnit &comp_unit) { return eLanguageTypeUnknown; } -XcodeSDK SymbolFileDWARF::ParseXcodeSDK(CompileUnit &comp_unit) { +std::pair<XcodeSDK, std::string> +SymbolFileDWARF::ParseXcodeSDK(CompileUnit &comp_unit) { std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); DWARFUnit *dwarf_cu = GetDWARFCompileUnit(&comp_unit); if (!dwarf_cu) @@ -993,21 +994,26 @@ XcodeSDK SymbolFileDWARF::ParseXcodeSDK(CompileUnit &comp_unit) { const char *sdk = cu_die.GetAttributeValueAsString(DW_AT_APPLE_sdk, nullptr); if (!sdk) return {}; - const char *sysroot = + std::string sysroot = cu_die.GetAttributeValueAsString(DW_AT_LLVM_sysroot, ""); - // Register the sysroot path remapping with the module belonging to - // the CU as well as the one belonging to the symbol file. The two - // would be different if this is an OSO object and module is the - // corresponding debug map, in which case both should be updated. - ModuleSP module_sp = comp_unit.GetModule(); - if (module_sp) - module_sp->RegisterXcodeSDK(sdk, sysroot); - ModuleSP local_module_sp = m_objfile_sp->GetModule(); - if (local_module_sp && local_module_sp != module_sp) - local_module_sp->RegisterXcodeSDK(sdk, sysroot); + // RegisterXcodeSDK calls into xcrun which is not aware of CLT, which is + // expensive. + if (sysroot.find("/Library/Developer/CommandLineTools/SDKs") != 0) { + // Register the sysroot path remapping with the module belonging to + // the CU as well as the one belonging to the symbol file. The two + // would be different if this is an OSO object and module is the + // corresponding debug map, in which case both should be updated. + ModuleSP module_sp = comp_unit.GetModule(); + if (module_sp) + module_sp->RegisterXcodeSDK(sdk, sysroot); + + ModuleSP local_module_sp = m_objfile_sp->GetModule(); + if (local_module_sp && local_module_sp != module_sp) + local_module_sp->RegisterXcodeSDK(sdk, sysroot); + } - return {sdk}; + return std::pair{XcodeSDK{sdk}, std::move(sysroot)}; } size_t SymbolFileDWARF::ParseFunctions(CompileUnit &comp_unit) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 7309f7a86b659..8f7f84aff355d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -110,7 +110,8 @@ class SymbolFileDWARF : public SymbolFileCommon { lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override; - XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) override; + std::pair<XcodeSDK, std::string> + ParseXcodeSDK(CompileUnit &comp_unit) override; size_t ParseFunctions(CompileUnit &comp_unit) override; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 0ecf47a3c7869..eb2db68dd9435 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -673,7 +673,8 @@ SymbolFileDWARFDebugMap::ParseLanguage(CompileUnit &comp_unit) { return eLanguageTypeUnknown; } -XcodeSDK SymbolFileDWARFDebugMap::ParseXcodeSDK(CompileUnit &comp_unit) { +std::pair<XcodeSDK, std::string> +SymbolFileDWARFDebugMap::ParseXcodeSDK(CompileUnit &comp_unit) { std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit); if (oso_dwarf) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index df41d6a2a4e42..9f1fe9abe002b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -64,7 +64,8 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { // Compile Unit function calls lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override; - XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) override; + std::pair<XcodeSDK, std::string> + ParseXcodeSDK(CompileUnit &comp_unit) override; llvm::SmallSet<lldb::LanguageType, 4> ParseAllLanguages(CompileUnit &comp_unit) override; size_t ParseFunctions(CompileUnit &comp_unit) override; diff --git a/lldb/source/Symbol/SymbolFileOnDemand.cpp b/lldb/source/Symbol/SymbolFileOnDemand.cpp index 94979b2fb1c22..94c6e01d83d1d 100644 --- a/lldb/source/Symbol/SymbolFileOnDemand.cpp +++ b/lldb/source/Symbol/SymbolFileOnDemand.cpp @@ -58,17 +58,18 @@ lldb::LanguageType SymbolFileOnDemand::ParseLanguage(CompileUnit &comp_unit) { return m_sym_file_impl->ParseLanguage(comp_unit); } -XcodeSDK SymbolFileOnDemand::ParseXcodeSDK(CompileUnit &comp_unit) { +std::pair<XcodeSDK, std::string> +SymbolFileOnDemand::ParseXcodeSDK(CompileUnit &comp_unit) { if (!m_debug_info_enabled) { Log *log = GetLog(); LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__); XcodeSDK defaultValue{}; if (log) { - XcodeSDK sdk = m_sym_file_impl->ParseXcodeSDK(comp_unit); + auto [sdk, sysroot] = m_sym_file_impl->ParseXcodeSDK(comp_unit); if (!(sdk == defaultValue)) LLDB_LOG(log, "SDK {0} would return if hydrated.", sdk.GetString()); } - return defaultValue; + return {defaultValue, {}}; } return m_sym_file_impl->ParseXcodeSDK(comp_unit); } diff --git a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp index fc008ca7011e4..bda69815ad388 100644 --- a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp +++ b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp @@ -118,7 +118,7 @@ TEST_F(XcodeSDKModuleTests, TestModuleGetXcodeSDK) { ASSERT_TRUE(static_cast<bool>(comp_unit.get())); ModuleSP module = t.GetModule(); ASSERT_EQ(module->GetSourceMappingList().GetSize(), 0u); - XcodeSDK sdk = sym_file.ParseXcodeSDK(*comp_unit); + auto [sdk, sysroot] = sym_file.ParseXcodeSDK(*comp_unit); ASSERT_EQ(sdk.GetType(), XcodeSDK::Type::MacOSX); ASSERT_EQ(module->GetSourceMappingList().GetSize(), 1u); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits