Types that came from a Clang module are nested in DW_TAG_module tags in DWARF. This patch recreates the Clang module hierarchy in LLDB and 1;95;0csets the owning module information accordingly. My primary motivation is to facilitate looking up per-module APINotes for individual declarations, but this likely also has other applications. This reapplies the previously reverted commit, but without support for ClassTemplateSpecializations, which I'm going to look into separately. rdar://problem/59634380 Differential Revision: https://reviews.llvm.org/D75488
64 lines
2.3 KiB
C++
64 lines
2.3 KiB
C++
//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H
|
|
#define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H
|
|
|
|
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
|
|
#include "clang/Basic/Module.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
class ClangExternalASTSourceCallbacks : public clang::ExternalASTSource {
|
|
/// LLVM RTTI support.
|
|
static char ID;
|
|
|
|
public:
|
|
/// LLVM RTTI support.
|
|
bool isA(const void *ClassID) const override { return ClassID == &ID; }
|
|
static bool classof(const clang::ExternalASTSource *s) { return s->isA(&ID); }
|
|
|
|
ClangExternalASTSourceCallbacks(TypeSystemClang &ast) : m_ast(ast) {}
|
|
|
|
void FindExternalLexicalDecls(
|
|
const clang::DeclContext *DC,
|
|
llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
|
|
llvm::SmallVectorImpl<clang::Decl *> &Result) override;
|
|
|
|
void CompleteType(clang::TagDecl *tag_decl) override;
|
|
|
|
void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
|
|
|
|
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;
|
|
|
|
TypeSystemClang &GetTypeSystem() const { return m_ast; }
|
|
|
|
/// Module-related methods.
|
|
/// \{
|
|
llvm::Optional<clang::ASTSourceDescriptor>
|
|
getSourceDescriptor(unsigned ID) override;
|
|
clang::Module *getModule(unsigned ID) override;
|
|
OptionalClangModuleID RegisterModule(clang::Module *module);
|
|
OptionalClangModuleID GetIDForModule(clang::Module *module);
|
|
/// \}
|
|
private:
|
|
TypeSystemClang &m_ast;
|
|
std::vector<clang::Module *> m_modules;
|
|
llvm::DenseMap<clang::Module *, unsigned> m_ids;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H
|