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