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 ClangExternalASTSourceCallbacks(CompleteTagDeclCallback tag_decl_callback,CompleteObjCInterfaceDeclCallback objc_decl_callback,FindExternalVisibleDeclsByNameCallback find_by_name_callback,LayoutRecordTypeCallback layout_record_type_callback,void * callback_baton)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 GetExternalDecl(uint32_t ID)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 GetExternalDeclStmt(uint64_t Offset)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 GetExternalSelector(uint32_t ID)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 GetNumExternalSelectors()77 uint32_t GetNumExternalSelectors() override { return 0; } 78 79 clang::CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset)80 GetExternalCXXBaseSpecifiers(uint64_t Offset) override { 81 return nullptr; 82 } 83 MaterializeVisibleDecls(const clang::DeclContext * decl_ctx)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 SetExternalSourceCallbacks(CompleteTagDeclCallback tag_decl_callback,CompleteObjCInterfaceDeclCallback objc_decl_callback,FindExternalVisibleDeclsByNameCallback find_by_name_callback,LayoutRecordTypeCallback layout_record_type_callback,void * callback_baton)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 RemoveExternalSourceCallbacks(void * callback_baton)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_ 144