LLDB mainline
ClangExternalASTSourceCallbacks.cpp
Go to the documentation of this file.
1//===-- ClangExternalASTSourceCallbacks.cpp -------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11
12#include "clang/AST/Decl.h"
13#include "clang/AST/DeclObjC.h"
14#include "clang/Basic/Module.h"
15#include <optional>
16
17using namespace lldb_private;
18
20
21void ClangExternalASTSourceCallbacks::CompleteType(clang::TagDecl *tag_decl) {
22 m_ast.CompleteTagDecl(tag_decl);
23}
24
26 clang::ObjCInterfaceDecl *objc_decl) {
28}
29
31 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
32 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
33 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
34 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
35 &VirtualBaseOffsets) {
36 return m_ast.LayoutRecordType(Record, Size, Alignment, FieldOffsets,
37 BaseOffsets, VirtualBaseOffsets);
38}
39
41 const clang::DeclContext *decl_ctx,
42 llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
44 if (decl_ctx) {
45 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(
46 const_cast<clang::DeclContext *>(decl_ctx));
47 if (tag_decl)
48 CompleteType(tag_decl);
49 }
50}
51
53 const clang::DeclContext *DC, clang::DeclarationName Name) {
54 llvm::SmallVector<clang::NamedDecl *, 4> decls;
55 // Objective-C methods are not added into the LookupPtr when they originate
56 // from an external source. SetExternalVisibleDeclsForName() adds them.
57 if (auto *oid = llvm::dyn_cast<clang::ObjCInterfaceDecl>(DC)) {
58 clang::ObjCContainerDecl::method_range noload_methods(oid->noload_decls());
59 for (auto *omd : noload_methods)
60 if (omd->getDeclName() == Name)
61 decls.push_back(omd);
62 }
63 return !SetExternalVisibleDeclsForName(DC, Name, decls).empty();
64}
65
68 m_modules.push_back(module);
69 unsigned id = m_modules.size();
70 m_ids.insert({module, id});
71 return OptionalClangModuleID(id);
72}
73
74std::optional<clang::ASTSourceDescriptor>
76 if (clang::Module *module = getModule(id))
77 return {*module};
78 return {};
79}
80
81clang::Module *ClangExternalASTSourceCallbacks::getModule(unsigned id) {
82 if (id && id <= m_modules.size())
83 return m_modules[id - 1];
84 return nullptr;
85}
86
89 return OptionalClangModuleID(m_ids[module]);
90}
bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, clang::DeclarationName Name) override
OptionalClangModuleID RegisterModule(clang::Module *module)
std::optional< clang::ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Module-related methods.
OptionalClangModuleID GetIDForModule(clang::Module *module)
bool layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap< const clang::FieldDecl *, uint64_t > &FieldOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &BaseOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &VirtualBaseOffsets) override
void FindExternalLexicalDecls(const clang::DeclContext *DC, llvm::function_ref< bool(clang::Decl::Kind)> IsKindWeWant, llvm::SmallVectorImpl< clang::Decl * > &Result) override
llvm::DenseMap< clang::Module *, unsigned > m_ids
void CompleteTagDecl(clang::TagDecl *)
bool LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, llvm::DenseMap< const clang::FieldDecl *, uint64_t > &field_offsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &base_offsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &vbase_offsets)
void CompleteObjCInterfaceDecl(clang::ObjCInterfaceDecl *)
A class that represents a running process on the host machine.