[Lldb-commits] [lldb] df7948e - [LLDB] Refactor SDK-related functions in Platform (#199141)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 22 11:15:43 PDT 2026
Author: Adrian Prantl
Date: 2026-05-22T11:15:38-07:00
New Revision: df7948e445b5e9446053491a75980cc187316a09
URL: https://github.com/llvm/llvm-project/commit/df7948e445b5e9446053491a75980cc187316a09
DIFF: https://github.com/llvm/llvm-project/commit/df7948e445b5e9446053491a75980cc187316a09.diff
LOG: [LLDB] Refactor SDK-related functions in Platform (#199141)
There are a lot of similar and repetetive variants of SDK lookups in the
Apple platform plugins. This commit unifies the implementations, error
handling and progress reporting.
Assisted-by: claude
Added:
Modified:
lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp
index b0bbdff12ca98..8a1cb715111d5 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp
@@ -15,7 +15,6 @@
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/Progress.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Host/PseudoTerminal.h"
#include "lldb/Target/Process.h"
@@ -282,24 +281,21 @@ std::vector<ArchSpec> PlatformAppleSimulator::GetSupportedArchitectures(
return result;
}
-static llvm::StringRef GetXcodeSDKDir(std::string preferred,
- std::string secondary) {
- llvm::StringRef sdk;
- auto get_sdk = [&](std::string sdk) -> llvm::StringRef {
- Progress progress("Looking for Xcode SDK", sdk);
+static std::string GetXcodeSDKDir(std::string preferred,
+ std::string secondary) {
+ auto get_sdk = [&](std::string sdk) -> std::string {
auto sdk_path_or_err =
- HostInfo::GetSDKRoot(HostInfo::SDKOptions{XcodeSDK(std::move(sdk))});
+ PlatformDarwin::ResolveXcodeSDK(XcodeSDK(std::move(sdk)));
if (!sdk_path_or_err) {
- Debugger::ReportError("Error while searching for Xcode SDK: " +
- toString(sdk_path_or_err.takeError()));
+ Debugger::ReportError(toString(sdk_path_or_err.takeError()));
return {};
}
- return *sdk_path_or_err;
+ return sdk_path_or_err->GetPath();
};
- sdk = get_sdk(preferred);
+ std::string sdk = get_sdk(std::move(preferred));
if (sdk.empty())
- sdk = get_sdk(secondary);
+ sdk = get_sdk(std::move(secondary));
return sdk;
}
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h
index 77d2a3b4e1cce..2c40a2ac9a39c 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h
@@ -120,7 +120,7 @@ class PlatformAppleSimulator : public PlatformDarwin {
std::string m_sdk_name_primary;
std::string m_sdk_name_secondary;
bool m_have_searched_for_sdk = false;
- llvm::StringRef m_sdk;
+ std::string m_sdk;
XcodeSDK::Type m_sdk_type;
void LoadCoreSimulator();
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index 4749c20369d3f..3cf6aba1bece6 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -1110,39 +1110,25 @@ ResolveSDKPathFromDebugInfo(lldb_private::Target *target) {
ModuleSP exe_module_sp = target->GetExecutableModule();
if (!exe_module_sp)
- return llvm::createStringError("failed to get module from target");
+ return llvm::createStringError("could not get module from target");
SymbolFile *sym_file = exe_module_sp->GetSymbolFile();
if (!sym_file)
- return llvm::createStringError("failed to get symbol file from executable");
+ return llvm::createStringError("could not get symbol file from executable");
if (sym_file->GetNumCompileUnits() == 0)
return llvm::createStringError(
- "Failed to resolve SDK for target: executable's symbol file has no "
+ "could not resolve SDK for target: executable's symbol file has no "
"compile units");
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);
- merged_sdk.Merge(cu_sdk);
- }
- }
+ for (unsigned i = 0; i < sym_file->GetNumCompileUnits(); ++i)
+ if (auto cu_sp = sym_file->GetCompileUnitAtIndex(i))
+ merged_sdk.Merge(sym_file->ParseXcodeSDK(*cu_sp));
// TODO: The result of this loop is almost equivalent to deriving the SDK
// from the target triple, which would be a lot cheaper.
- FileSpec sdk_path = merged_sdk.GetSysroot();
- if (FileSystem::Instance().Exists(sdk_path)) {
- return sdk_path;
- }
- Progress progress("Looking for Xcode SDK", merged_sdk.GetString().str());
- auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{merged_sdk});
- if (!path_or_err)
- return llvm::createStringError(
- llvm::formatv("Failed to resolve SDK path: {0}",
- llvm::toString(path_or_err.takeError())));
-
- return FileSpec(*path_or_err);
+ return PlatformDarwin::ResolveXcodeSDK(std::move(merged_sdk));
}
void PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(
@@ -1506,30 +1492,32 @@ PlatformDarwin::GetSDKPathFromDebugInfo(Module &module) {
return std::pair{std::move(merged_sdk), found_mismatch};
}
+llvm::Expected<FileSpec> PlatformDarwin::ResolveXcodeSDK(XcodeSDK sdk) {
+ if (FileSpec sysroot = sdk.GetSysroot();
+ FileSystem::Instance().Exists(sysroot))
+ return sysroot;
+
+ Progress progress("Looking for Xcode SDK", sdk.GetString().str());
+ auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ if (!path_or_err)
+ return llvm::joinErrors(llvm::createStringError(llvm::formatv(
+ "could not find SDK '{0}'", sdk.GetString())),
+ path_or_err.takeError());
+ return FileSpec(*path_or_err);
+}
+
llvm::Expected<std::string>
PlatformDarwin::ResolveSDKPathFromDebugInfo(Module &module) {
auto sdk_or_err = GetSDKPathFromDebugInfo(module);
if (!sdk_or_err)
- 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);
+ return llvm::joinErrors(
+ llvm::createStringError("could not parse SDK path from debug-info"),
+ sdk_or_err.takeError());
- if (FileSystem::Instance().Exists(sdk.GetSysroot()))
- return sdk.GetSysroot().GetPath();
-
- Progress progress("Looking for Xcode SDK", sdk.GetString().str());
- auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ auto path_or_err = ResolveXcodeSDK(std::move(sdk_or_err->first));
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())));
-
- return path_or_err->str();
+ return path_or_err.takeError();
+ return path_or_err->GetPath();
}
llvm::Expected<XcodeSDK>
@@ -1550,23 +1538,14 @@ llvm::Expected<std::string>
PlatformDarwin::ResolveSDKPathFromDebugInfo(CompileUnit &unit) {
auto sdk_or_err = GetSDKPathFromDebugInfo(unit);
if (!sdk_or_err)
- 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);
+ return llvm::joinErrors(
+ llvm::createStringError("could not parse SDK path from debug-info"),
+ sdk_or_err.takeError());
- Progress progress("Looking for Xcode SDK", sdk.GetString().str());
- auto path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ auto path_or_err = ResolveXcodeSDK(std::move(*sdk_or_err));
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())));
-
- return path_or_err->str();
+ return path_or_err.takeError();
+ return path_or_err->GetPath();
}
llvm::Expected<FileSpecList>
@@ -1579,8 +1558,7 @@ PlatformDarwin::GetSafeAutoLoadPaths(const Target &target) const {
info.type = sdk_type;
XcodeSDK sdk(info);
- Progress progress("Looking for Xcode SDK", sdk.GetString().str());
- auto sdk_root_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ auto sdk_root_or_err = ResolveXcodeSDK(sdk);
if (!sdk_root_or_err) {
LLDB_LOG_ERROR(log, sdk_root_or_err.takeError(),
"Failed to resolve SDK root for triple '{1}': {0}",
@@ -1589,15 +1567,14 @@ PlatformDarwin::GetSafeAutoLoadPaths(const Target &target) const {
// Fall back to any macOS SDK.
sdk = XcodeSDK::GetAnyMacOS();
LLDB_LOG(log, "Falling back to SDK '{0}'", sdk.GetString());
- progress.Increment(1, sdk.GetString().str());
- sdk_root_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ sdk_root_or_err = ResolveXcodeSDK(sdk);
}
if (!sdk_root_or_err)
return sdk_root_or_err.takeError();
// $SDKROOT/usr/share/lldb is an auto-loadable path.
- llvm::SmallString<256> resolved(*sdk_root_or_err);
+ llvm::SmallString<256> resolved(sdk_root_or_err->GetPath());
llvm::sys::path::append(resolved, "usr", "share", "lldb");
FileSpecList fspecs;
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
index f3c176f09cb68..7c10216bb8b2e 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -135,6 +135,9 @@ class PlatformDarwin : public PlatformPOSIX {
llvm::Expected<std::string>
ResolveSDKPathFromDebugInfo(CompileUnit &unit) override;
+ /// Resolve an XcodeSDK to an on-disk path under a Progress event.
+ static llvm::Expected<FileSpec> ResolveXcodeSDK(XcodeSDK sdk);
+
/// Helper function for \c LocateExecutableScriptingResources
/// which gathers FileSpecs for executable scripts (currently
/// just Python) from a .dSYM Python directory.
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
index 6f1f88e04ee4b..991ccedcb650d 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -23,7 +23,6 @@
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/Progress.h"
#include "lldb/Host/Config.h"
#include "lldb/Host/Host.h"
#include "lldb/Host/HostInfo.h"
@@ -128,20 +127,15 @@ ConstString PlatformMacOSX::GetSDKDirectory(lldb_private::Target &target) {
}
// Use the default SDK as a fallback.
- XcodeSDK sdk = XcodeSDK::GetAnyMacOS();
- Progress progress("Looking for Xcode SDK", sdk.GetString().str());
- auto sdk_path_or_err = HostInfo::GetSDKRoot(HostInfo::SDKOptions{sdk});
+ auto sdk_path_or_err =
+ PlatformDarwin::ResolveXcodeSDK(XcodeSDK::GetAnyMacOS());
if (!sdk_path_or_err) {
- Debugger::ReportError("Error while searching for Xcode SDK: " +
- toString(sdk_path_or_err.takeError()));
+ Debugger::ReportError(toString(sdk_path_or_err.takeError()));
return {};
}
- FileSpec fspec(*sdk_path_or_err);
- if (fspec) {
- if (FileSystem::Instance().Exists(fspec))
- return ConstString(fspec.GetPath());
- }
+ if (FileSystem::Instance().Exists(*sdk_path_or_err))
+ return ConstString(sdk_path_or_err->GetPath());
return {};
}
More information about the lldb-commits
mailing list