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