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