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