[Lldb-commits] [lldb] [lldb][Darwin] revert change to lang_opts.BuiltinHeadersInSystemModules (PR #145864)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Thu Jun 26 03:05:43 PDT 2025
https://github.com/charles-zablit created https://github.com/llvm/llvm-project/pull/145864
Revert the changes made in the following PRs as they are causing bot failures:
- https://github.com/llvm/llvm-project/pull/145744
- https://github.com/llvm/llvm-project/pull/144913
>From a540d68b0a882f0f05b0e78cf67457cdf462e51d Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Thu, 26 Jun 2025 11:03:44 +0100
Subject: [PATCH 1/2] Revert "[lldb][NFC] remove the
ResolveSDKPathFromDebugInfo method (#145744)"
This reverts commit 7381d816f31c2c2c46653c58220a88f632768b5e.
---
lldb/include/lldb/Target/Platform.h | 16 ++++++
.../Platform/MacOSX/PlatformDarwin.cpp | 57 ++++++++++---------
.../Plugins/Platform/MacOSX/PlatformDarwin.h | 3 +
.../SymbolFile/DWARF/XcodeSDKModuleTests.cpp | 6 ++
4 files changed, 56 insertions(+), 26 deletions(-)
diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h
index 1a05bdf54332f..35ffdabf907e7 100644
--- a/lldb/include/lldb/Target/Platform.h
+++ b/lldb/include/lldb/Target/Platform.h
@@ -458,6 +458,22 @@ class Platform : public PluginInterface {
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`).
+ ///
+ /// \param[in] module Module whose debug-info to parse for
+ /// which SDK it was compiled against.
+ ///
+ /// \returns If successful, returns the full path to an
+ /// Xcode SDK.
+ virtual llvm::Expected<std::string>
+ ResolveSDKPathFromDebugInfo(Module &module) {
+ return llvm::createStringError(
+ llvm::formatv("{0} not implemented for '{1}' platform.",
+ LLVM_PRETTY_FUNCTION, GetName()));
+ }
+
/// Search CU for the SDK path the CUs was compiled against.
///
/// \param[in] unit The CU
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index 461e9dcb7847f..262a7dc731713 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -1130,33 +1130,13 @@ void PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(
if (target) {
if (ModuleSP exe_module_sp = target->GetExecutableModule()) {
- SymbolFile *sym_file = exe_module_sp->GetSymbolFile();
- if (!sym_file)
- return;
-
- 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);
- }
- }
-
- // TODO: The result of this loop is almost equivalent to deriving the SDK
- // from the target triple, which would be a lot cheaper.
-
- if (FileSystem::Instance().Exists(merged_sdk.GetSysroot())) {
- sysroot_spec = merged_sdk.GetSysroot();
+ auto path_or_err = ResolveSDKPathFromDebugInfo(*exe_module_sp);
+ if (path_or_err) {
+ sysroot_spec = FileSpec(*path_or_err);
} else {
- auto path_or_err =
- HostInfo::GetSDKRoot(HostInfo::SDKOptions{merged_sdk});
- if (path_or_err) {
- sysroot_spec = FileSpec(*path_or_err);
- } else {
- LLDB_LOG_ERROR(GetLog(LLDBLog::Types | LLDBLog::Host),
- path_or_err.takeError(),
- "Failed to resolve SDK path: {0}");
- }
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Types | LLDBLog::Host),
+ path_or_err.takeError(),
+ "Failed to resolve SDK path: {0}");
}
}
}
@@ -1404,6 +1384,31 @@ PlatformDarwin::GetSDKPathFromDebugInfo(Module &module) {
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)
+ 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);
+
+ if (FileSystem::Instance().Exists(sdk.GetSysroot()))
+ return sdk.GetSysroot().GetPath();
+
+ 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())));
+
+ return path_or_err->str();
+}
+
llvm::Expected<XcodeSDK>
PlatformDarwin::GetSDKPathFromDebugInfo(CompileUnit &unit) {
ModuleSP module_sp = unit.CalculateSymbolContextModule();
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
index f8a9301002e0d..f8a62ceb958fe 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -120,6 +120,9 @@ class PlatformDarwin : public PlatformPOSIX {
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::string>
diff --git a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp
index e04183d85e5bd..50c37dcd4568e 100644
--- a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp
@@ -161,6 +161,9 @@ TEST_F(XcodeSDKModuleTests, TestSDKPathFromDebugInfo_InvalidSDKPath) {
auto platform_sp = Platform::GetHostPlatform();
ASSERT_TRUE(platform_sp);
+ auto path_or_err = platform_sp->ResolveSDKPathFromDebugInfo(*module);
+ EXPECT_FALSE(static_cast<bool>(path_or_err));
+ llvm::consumeError(path_or_err.takeError());
}
TEST_F(XcodeSDKModuleTests, TestSDKPathFromDebugInfo_No_DW_AT_APPLE_sdk) {
@@ -204,6 +207,9 @@ TEST_F(XcodeSDKModuleTests, TestSDKPathFromDebugInfo_No_DW_AT_APPLE_sdk) {
auto platform_sp = Platform::GetHostPlatform();
ASSERT_TRUE(platform_sp);
+ auto path_or_err = platform_sp->ResolveSDKPathFromDebugInfo(*module);
+ EXPECT_FALSE(static_cast<bool>(path_or_err));
+ llvm::consumeError(path_or_err.takeError());
}
TEST_P(SDKPathParsingMultiparamTests, TestSDKPathFromDebugInfo) {
>From 4ee304f4ce5d66f85355d14a7d3a8291460837e4 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Thu, 26 Jun 2025 11:03:54 +0100
Subject: [PATCH 2/2] Revert "[lldb][darwin] force
BuiltinHeadersInSystemModules to be always false (#144913)"
This reverts commit 487581b826a5339410aaf306eafedc7b806b25e3.
---
lldb/include/lldb/Utility/XcodeSDK.h | 13 +++++
.../Clang/ClangExpressionParser.cpp | 51 ++++++++++++++++++-
lldb/source/Utility/XcodeSDK.cpp | 21 ++++++++
3 files changed, 84 insertions(+), 1 deletion(-)
diff --git a/lldb/include/lldb/Utility/XcodeSDK.h b/lldb/include/lldb/Utility/XcodeSDK.h
index a1a0ec415b90e..ceb8abb8c502d 100644
--- a/lldb/include/lldb/Utility/XcodeSDK.h
+++ b/lldb/include/lldb/Utility/XcodeSDK.h
@@ -93,6 +93,19 @@ class XcodeSDK {
static bool SDKSupportsModules(Type type, llvm::VersionTuple version);
static bool SDKSupportsModules(Type desired_type, const FileSpec &sdk_path);
+ /// Returns true if the SDK for the specified triple supports
+ /// builtin modules in system headers.
+ ///
+ /// NOTE: should be kept in sync with sdkSupportsBuiltinModules in
+ /// Toolchains/Darwin.cpp
+ ///
+ /// FIXME: this function will be removed once LLDB's ClangExpressionParser
+ /// constructs the compiler instance through the driver/toolchain. See \ref
+ /// SetupImportStdModuleLangOpts
+ ///
+ static bool SDKSupportsBuiltinModules(const llvm::Triple &target_triple,
+ llvm::VersionTuple sdk_version);
+
/// Return the canonical SDK name, such as "macosx" for the macOS SDK.
static std::string GetCanonicalName(Info info);
/// Return the best-matching SDK type for a specific triple.
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
index ffc76e6e93498..7aa9cae5a5614 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
@@ -319,6 +319,49 @@ class ClangDiagnosticManagerAdapter : public clang::DiagnosticConsumer {
StringRef m_filename;
};
+/// Returns true if the SDK for the specified triple supports
+/// builtin modules in system headers. This is used to decide
+/// whether to pass -fbuiltin-headers-in-system-modules to
+/// the compiler instance when compiling the `std` module.
+static llvm::Expected<bool>
+sdkSupportsBuiltinModules(lldb_private::Target &target) {
+ auto arch_spec = target.GetArchitecture();
+ auto const &triple = arch_spec.GetTriple();
+ auto module_sp = target.GetExecutableModule();
+ if (!module_sp)
+ return llvm::createStringError("Executable module not found.");
+
+ // Get SDK path that the target was compiled against.
+ auto platform_sp = target.GetPlatform();
+ 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)});
+ if (!sdk_path_or_err)
+ return sdk_path_or_err.takeError();
+
+ auto VFS = FileSystem::Instance().GetVirtualFileSystem();
+ if (!VFS)
+ return llvm::createStringError("No virtual filesystem available.");
+
+ // Extract SDK version from the /path/to/some.sdk/SDKSettings.json
+ auto parsed_or_err = clang::parseDarwinSDKInfo(*VFS, *sdk_path_or_err);
+ if (!parsed_or_err)
+ return parsed_or_err.takeError();
+
+ auto maybe_sdk = *parsed_or_err;
+ if (!maybe_sdk)
+ return llvm::createStringError("Couldn't find Darwin SDK info.");
+
+ return XcodeSDK::SDKSupportsBuiltinModules(triple, maybe_sdk->getVersion());
+}
+
static void SetupModuleHeaderPaths(CompilerInstance *compiler,
std::vector<std::string> include_directories,
lldb::TargetSP target_sp) {
@@ -662,6 +705,7 @@ static void SetupLangOpts(CompilerInstance &compiler,
static void SetupImportStdModuleLangOpts(CompilerInstance &compiler,
lldb_private::Target &target) {
+ Log *log = GetLog(LLDBLog::Expressions);
LangOptions &lang_opts = compiler.getLangOpts();
lang_opts.Modules = true;
// We want to implicitly build modules.
@@ -679,7 +723,12 @@ static void SetupImportStdModuleLangOpts(CompilerInstance &compiler,
lang_opts.GNUKeywords = true;
lang_opts.CPlusPlus11 = true;
- lang_opts.BuiltinHeadersInSystemModules = false;
+ if (auto supported_or_err = sdkSupportsBuiltinModules(target))
+ lang_opts.BuiltinHeadersInSystemModules = !*supported_or_err;
+ else
+ LLDB_LOG_ERROR(log, supported_or_err.takeError(),
+ "Failed to determine BuiltinHeadersInSystemModules when "
+ "setting up import-std-module: {0}");
// The Darwin libc expects this macro to be set.
lang_opts.GNUCVersion = 40201;
diff --git a/lldb/source/Utility/XcodeSDK.cpp b/lldb/source/Utility/XcodeSDK.cpp
index eb2047e67c326..004b4717e315b 100644
--- a/lldb/source/Utility/XcodeSDK.cpp
+++ b/lldb/source/Utility/XcodeSDK.cpp
@@ -266,6 +266,27 @@ bool XcodeSDK::SupportsSwift() const {
}
}
+bool XcodeSDK::SDKSupportsBuiltinModules(const llvm::Triple &target_triple,
+ llvm::VersionTuple sdk_version) {
+ using namespace llvm;
+
+ switch (target_triple.getOS()) {
+ case Triple::OSType::MacOSX:
+ return sdk_version >= VersionTuple(15U);
+ case Triple::OSType::IOS:
+ return sdk_version >= VersionTuple(18U);
+ case Triple::OSType::TvOS:
+ return sdk_version >= VersionTuple(18U);
+ case Triple::OSType::WatchOS:
+ return sdk_version >= VersionTuple(11U);
+ case Triple::OSType::XROS:
+ return sdk_version >= VersionTuple(2U);
+ default:
+ // New SDKs support builtin modules from the start.
+ return true;
+ }
+}
+
bool XcodeSDK::SDKSupportsModules(XcodeSDK::Type desired_type,
const FileSpec &sdk_path) {
ConstString last_path_component = sdk_path.GetFilename();
More information about the lldb-commits
mailing list