]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / include / lldb / Symbol / ClangExternalASTSourceCallbacks.h
1 //===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
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
9 #ifndef liblldb_ClangExternalASTSourceCallbacks_h_
10 #define liblldb_ClangExternalASTSourceCallbacks_h_
11
12 #include <stdint.h>
13
14 #include "clang/AST/CharUnits.h"
15 #include "llvm/ADT/DenseMap.h"
16
17 #include "lldb/Core/ClangForward.h"
18 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
19 #include "lldb/Symbol/CompilerType.h"
20 #include "lldb/lldb-enumerations.h"
21
22 namespace lldb_private {
23
24 class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon {
25 public:
26   typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
27   typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
28                                                     clang::ObjCInterfaceDecl *);
29   typedef void (*FindExternalVisibleDeclsByNameCallback)(
30       void *baton, const clang::DeclContext *DC, clang::DeclarationName Name,
31       llvm::SmallVectorImpl<clang::NamedDecl *> *results);
32   typedef bool (*LayoutRecordTypeCallback)(
33       void *baton, const clang::RecordDecl *Record, uint64_t &Size,
34       uint64_t &Alignment,
35       llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
36       llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
37           &BaseOffsets,
38       llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
39           &VirtualBaseOffsets);
40
41   ClangExternalASTSourceCallbacks(
42       CompleteTagDeclCallback tag_decl_callback,
43       CompleteObjCInterfaceDeclCallback objc_decl_callback,
44       FindExternalVisibleDeclsByNameCallback find_by_name_callback,
45       LayoutRecordTypeCallback layout_record_type_callback,
46       void *callback_baton)
47       : m_callback_tag_decl(tag_decl_callback),
48         m_callback_objc_decl(objc_decl_callback),
49         m_callback_find_by_name(find_by_name_callback),
50         m_callback_layout_record_type(layout_record_type_callback),
51         m_callback_baton(callback_baton) {}
52
53   // clang::ExternalASTSource
54
55   clang::Decl *GetExternalDecl(uint32_t ID) override {
56     // This method only needs to be implemented if the AST source ever passes
57     // back decl sets as VisibleDeclaration objects.
58     return nullptr;
59   }
60
61   clang::Stmt *GetExternalDeclStmt(uint64_t Offset) override {
62     // This operation is meant to be used via a LazyOffsetPtr.  It only needs
63     // to be implemented if the AST source uses methods like
64     // FunctionDecl::setLazyBody when building decls.
65     return nullptr;
66   }
67
68   clang::Selector GetExternalSelector(uint32_t ID) override {
69     // This operation only needs to be implemented if the AST source returns
70     // non-zero for GetNumKnownSelectors().
71     return clang::Selector();
72   }
73
74   uint32_t GetNumExternalSelectors() override { return 0; }
75
76   clang::CXXBaseSpecifier *
77   GetExternalCXXBaseSpecifiers(uint64_t Offset) override {
78     return nullptr;
79   }
80
81   virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {}
82
83   void FindExternalLexicalDecls(
84       const clang::DeclContext *DC,
85       llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
86       llvm::SmallVectorImpl<clang::Decl *> &Result) override;
87
88   bool
89   FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx,
90                                  clang::DeclarationName decl_name) override;
91
92   void CompleteType(clang::TagDecl *tag_decl) override;
93
94   void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
95
96   bool layoutRecordType(
97       const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
98       llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
99       llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
100           &BaseOffsets,
101       llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
102           &VirtualBaseOffsets) override;
103
104   void SetExternalSourceCallbacks(
105       CompleteTagDeclCallback tag_decl_callback,
106       CompleteObjCInterfaceDeclCallback objc_decl_callback,
107       FindExternalVisibleDeclsByNameCallback find_by_name_callback,
108       LayoutRecordTypeCallback layout_record_type_callback,
109       void *callback_baton) {
110     m_callback_tag_decl = tag_decl_callback;
111     m_callback_objc_decl = objc_decl_callback;
112     m_callback_find_by_name = find_by_name_callback;
113     m_callback_layout_record_type = layout_record_type_callback;
114     m_callback_baton = callback_baton;
115   }
116
117   void RemoveExternalSourceCallbacks(void *callback_baton) {
118     if (callback_baton == m_callback_baton) {
119       m_callback_tag_decl = nullptr;
120       m_callback_objc_decl = nullptr;
121       m_callback_find_by_name = nullptr;
122       m_callback_layout_record_type = nullptr;
123     }
124   }
125
126 protected:
127   // Classes that inherit from ClangExternalASTSourceCallbacks can see and
128   // modify these
129   CompleteTagDeclCallback m_callback_tag_decl;
130   CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
131   FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
132   LayoutRecordTypeCallback m_callback_layout_record_type;
133   void *m_callback_baton;
134 };
135
136 } // namespace lldb_private
137
138 #endif // liblldb_ClangExternalASTSourceCallbacks_h_