Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[lldb][ClangExpressionParser] Set BuiltinHeadersInSystemModules depending on SDK version #102309

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lldb/include/lldb/Utility/XcodeSDK.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ class XcodeSDK {
/// Whether LLDB feels confident importing Clang modules from this SDK.
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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "clang/AST/ExternalASTSource.h"
#include "clang/AST/PrettyPrinter.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/DarwinSDKInfo.h"
#include "clang/Basic/DiagnosticIDs.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/TargetInfo.h"
Expand Down Expand Up @@ -39,6 +40,7 @@
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/Support/CrashRecoveryContext.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/TargetSelect.h"

Expand Down Expand Up @@ -91,6 +93,8 @@
#include "lldb/Utility/StringList.h"

#include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
#include "Plugins/Platform/MacOSX/PlatformDarwin.h"
#include "lldb/Utility/XcodeSDK.h"

#include <cctype>
#include <memory>
Expand Down Expand Up @@ -279,6 +283,49 @@ class ClangDiagnosticManagerAdapter : public clang::DiagnosticConsumer {
std::string m_output;
};

/// 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) {
#ifndef __APPLE__
return false;
#else
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 sdk_or_err = PlatformDarwin::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());
#endif
}

static void SetupModuleHeaderPaths(CompilerInstance *compiler,
std::vector<std::string> include_directories,
lldb::TargetSP target_sp) {
Expand Down Expand Up @@ -561,7 +608,9 @@ static void SetupLangOpts(CompilerInstance &compiler,
lang_opts.NoBuiltin = true;
}

static void SetupImportStdModuleLangOpts(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.
Expand All @@ -578,7 +627,14 @@ static void SetupImportStdModuleLangOpts(CompilerInstance &compiler) {
lang_opts.GNUMode = true;
lang_opts.GNUKeywords = true;
lang_opts.CPlusPlus11 = true;
lang_opts.BuiltinHeadersInSystemModules = true;

auto supported_or_err = sdkSupportsBuiltinModules(target);
if (supported_or_err)
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;
Expand Down Expand Up @@ -659,7 +715,7 @@ ClangExpressionParser::ClangExpressionParser(
if (auto *clang_expr = dyn_cast<ClangUserExpression>(&m_expr);
clang_expr && clang_expr->DidImportCxxModules()) {
LLDB_LOG(log, "Adding lang options for importing C++ modules");
SetupImportStdModuleLangOpts(*m_compiler);
SetupImportStdModuleLangOpts(*m_compiler, *target_sp);
SetupModuleHeaderPaths(m_compiler.get(), m_include_directories, target_sp);
}

Expand Down
21 changes: 21 additions & 0 deletions lldb/source/Utility/XcodeSDK.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,27 @@ bool XcodeSDK::SupportsSwift() const {
}
}

bool XcodeSDK::SDKSupportsBuiltinModules(const llvm::Triple &target_triple,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function got changed in #102239

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I already accounted for the version check changes

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But you didn't pick up the environment check

Copy link
Member Author

@Michael137 Michael137 Aug 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think we really want to support this in/care about non-native environments tbh

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();
Expand Down
Loading