ClangExternalASTSourceCallbacks.h revision 81a96aa6242f7b559770f5dc62316253cb8cb0d4
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 28namespace lldb_private { 29 30class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon 31{ 32public: 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 158protected: 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_ 172