Skip to content

Commit

Permalink
Reland "[lldb][ClangExpressionParser] Set BuiltinHeadersInSystemModul…
Browse files Browse the repository at this point in the history
…es depending on SDK version (llvm#102309)" (llvm#102497)

Depends on llvm#102488

This reverts commit
llvm@cf56e26.

The original change was reverted because it was causing linker failures
in the unit-tests:
```
Undefined symbols for architecture arm64:
  "lldb_private::PlatformDarwin::GetSDKPathFromDebugInfo(lldb_private::Module&)",
referenced from:
      lldb_private::ClangExpressionParser::ClangExpressionParser(lldb_private::ExecutionContextScope*,
lldb_private::Expression&, bool,
std::__1::vector<std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char>>,
std::__1::allocator<std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char>>>>,
std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char>>) in
liblldbPluginExpressionParserClang.a[11](ClangExpressionParser.cpp.o)
ld: symbol(s) not found for architecture arm64
c++: error: linker command failed with exit code 1 (use -v to see
invocation)
```

The relanded version differs only in the fact that we now use the
generic `Platform` abstraction to get to `GetSDKPathFromDebugInfo`.
  • Loading branch information
Michael137 authored Aug 9, 2024
1 parent 4bb1396 commit 3fffa6d
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 3 deletions.
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) {
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) {
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,13 @@ static void SetupImportStdModuleLangOpts(CompilerInstance &compiler) {
lang_opts.GNUMode = true;
lang_opts.GNUKeywords = true;
lang_opts.CPlusPlus11 = true;
lang_opts.BuiltinHeadersInSystemModules = true;

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;
Expand Down Expand Up @@ -659,7 +714,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,
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

0 comments on commit 3fffa6d

Please sign in to comment.