Skip to content

Commit 4ee304f

Browse files
Revert "[lldb][darwin] force BuiltinHeadersInSystemModules to be always false (llvm#144913)"
This reverts commit 487581b.
1 parent a540d68 commit 4ee304f

File tree

3 files changed

+84
-1
lines changed

3 files changed

+84
-1
lines changed

lldb/include/lldb/Utility/XcodeSDK.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ class XcodeSDK {
9393
static bool SDKSupportsModules(Type type, llvm::VersionTuple version);
9494
static bool SDKSupportsModules(Type desired_type, const FileSpec &sdk_path);
9595

96+
/// Returns true if the SDK for the specified triple supports
97+
/// builtin modules in system headers.
98+
///
99+
/// NOTE: should be kept in sync with sdkSupportsBuiltinModules in
100+
/// Toolchains/Darwin.cpp
101+
///
102+
/// FIXME: this function will be removed once LLDB's ClangExpressionParser
103+
/// constructs the compiler instance through the driver/toolchain. See \ref
104+
/// SetupImportStdModuleLangOpts
105+
///
106+
static bool SDKSupportsBuiltinModules(const llvm::Triple &target_triple,
107+
llvm::VersionTuple sdk_version);
108+
96109
/// Return the canonical SDK name, such as "macosx" for the macOS SDK.
97110
static std::string GetCanonicalName(Info info);
98111
/// Return the best-matching SDK type for a specific triple.

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,49 @@ class ClangDiagnosticManagerAdapter : public clang::DiagnosticConsumer {
319319
StringRef m_filename;
320320
};
321321

322+
/// Returns true if the SDK for the specified triple supports
323+
/// builtin modules in system headers. This is used to decide
324+
/// whether to pass -fbuiltin-headers-in-system-modules to
325+
/// the compiler instance when compiling the `std` module.
326+
static llvm::Expected<bool>
327+
sdkSupportsBuiltinModules(lldb_private::Target &target) {
328+
auto arch_spec = target.GetArchitecture();
329+
auto const &triple = arch_spec.GetTriple();
330+
auto module_sp = target.GetExecutableModule();
331+
if (!module_sp)
332+
return llvm::createStringError("Executable module not found.");
333+
334+
// Get SDK path that the target was compiled against.
335+
auto platform_sp = target.GetPlatform();
336+
if (!platform_sp)
337+
return llvm::createStringError("No Platform plugin found on target.");
338+
339+
auto sdk_or_err = platform_sp->GetSDKPathFromDebugInfo(*module_sp);
340+
if (!sdk_or_err)
341+
return sdk_or_err.takeError();
342+
343+
// Use the SDK path from debug-info to find a local matching SDK directory.
344+
auto sdk_path_or_err =
345+
HostInfo::GetSDKRoot(HostInfo::SDKOptions{std::move(sdk_or_err->first)});
346+
if (!sdk_path_or_err)
347+
return sdk_path_or_err.takeError();
348+
349+
auto VFS = FileSystem::Instance().GetVirtualFileSystem();
350+
if (!VFS)
351+
return llvm::createStringError("No virtual filesystem available.");
352+
353+
// Extract SDK version from the /path/to/some.sdk/SDKSettings.json
354+
auto parsed_or_err = clang::parseDarwinSDKInfo(*VFS, *sdk_path_or_err);
355+
if (!parsed_or_err)
356+
return parsed_or_err.takeError();
357+
358+
auto maybe_sdk = *parsed_or_err;
359+
if (!maybe_sdk)
360+
return llvm::createStringError("Couldn't find Darwin SDK info.");
361+
362+
return XcodeSDK::SDKSupportsBuiltinModules(triple, maybe_sdk->getVersion());
363+
}
364+
322365
static void SetupModuleHeaderPaths(CompilerInstance *compiler,
323366
std::vector<std::string> include_directories,
324367
lldb::TargetSP target_sp) {
@@ -662,6 +705,7 @@ static void SetupLangOpts(CompilerInstance &compiler,
662705

663706
static void SetupImportStdModuleLangOpts(CompilerInstance &compiler,
664707
lldb_private::Target &target) {
708+
Log *log = GetLog(LLDBLog::Expressions);
665709
LangOptions &lang_opts = compiler.getLangOpts();
666710
lang_opts.Modules = true;
667711
// We want to implicitly build modules.
@@ -679,7 +723,12 @@ static void SetupImportStdModuleLangOpts(CompilerInstance &compiler,
679723
lang_opts.GNUKeywords = true;
680724
lang_opts.CPlusPlus11 = true;
681725

682-
lang_opts.BuiltinHeadersInSystemModules = false;
726+
if (auto supported_or_err = sdkSupportsBuiltinModules(target))
727+
lang_opts.BuiltinHeadersInSystemModules = !*supported_or_err;
728+
else
729+
LLDB_LOG_ERROR(log, supported_or_err.takeError(),
730+
"Failed to determine BuiltinHeadersInSystemModules when "
731+
"setting up import-std-module: {0}");
683732

684733
// The Darwin libc expects this macro to be set.
685734
lang_opts.GNUCVersion = 40201;

lldb/source/Utility/XcodeSDK.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,27 @@ bool XcodeSDK::SupportsSwift() const {
266266
}
267267
}
268268

269+
bool XcodeSDK::SDKSupportsBuiltinModules(const llvm::Triple &target_triple,
270+
llvm::VersionTuple sdk_version) {
271+
using namespace llvm;
272+
273+
switch (target_triple.getOS()) {
274+
case Triple::OSType::MacOSX:
275+
return sdk_version >= VersionTuple(15U);
276+
case Triple::OSType::IOS:
277+
return sdk_version >= VersionTuple(18U);
278+
case Triple::OSType::TvOS:
279+
return sdk_version >= VersionTuple(18U);
280+
case Triple::OSType::WatchOS:
281+
return sdk_version >= VersionTuple(11U);
282+
case Triple::OSType::XROS:
283+
return sdk_version >= VersionTuple(2U);
284+
default:
285+
// New SDKs support builtin modules from the start.
286+
return true;
287+
}
288+
}
289+
269290
bool XcodeSDK::SDKSupportsModules(XcodeSDK::Type desired_type,
270291
const FileSpec &sdk_path) {
271292
ConstString last_path_component = sdk_path.GetFilename();

0 commit comments

Comments
 (0)