1d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===// 2d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// 3d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// The LLVM Compiler Infrastructure 4d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// 5d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// This file is distributed under the University of Illinois Open Source 6d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// License. See LICENSE.TXT for details. 7d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// 8d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//===----------------------------------------------------------------------===// 9d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 10d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#ifndef liblldb_ClangExternalASTSourceCallbacks_h_ 11d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#define liblldb_ClangExternalASTSourceCallbacks_h_ 12d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 13d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// C Includes 14d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// C++ Includes 15d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <string> 16d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <vector> 17d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <stdint.h> 18d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 19d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Other libraries and framework includes 203fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton#include "clang/AST/CharUnits.h" 21d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 22d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Project includes 23d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/lldb-enumerations.h" 24d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Core/ClangForward.h" 25d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Symbol/ClangASTType.h" 262fc7e8d0d392fe85f22d9c75212ebca4cbce547fSean Callanan#include "lldb/Symbol/ClangExternalASTSourceCommon.h" 27d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 28d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonnamespace lldb_private { 29d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 302fc7e8d0d392fe85f22d9c75212ebca4cbce547fSean Callananclass ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon 31d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton{ 32d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonpublic: 33d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 34d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); 35d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *); 36e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton typedef void (*FindExternalVisibleDeclsByNameCallback)(void *baton, const clang::DeclContext *DC, clang::DeclarationName Name, llvm::SmallVectorImpl <clang::NamedDecl *> *results); 373fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton typedef bool (*LayoutRecordTypeCallback)(void *baton, 383fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton const clang::RecordDecl *Record, 393fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &Size, 403fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &Alignment, 413fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets, 423fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets, 433fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets); 44d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 45d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, 46d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteObjCInterfaceDeclCallback objc_decl_callback, 47e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton FindExternalVisibleDeclsByNameCallback find_by_name_callback, 483fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton LayoutRecordTypeCallback layout_record_type_callback, 49d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton void *callback_baton) : 50d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_tag_decl (tag_decl_callback), 51d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_objc_decl (objc_decl_callback), 52e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton m_callback_find_by_name (find_by_name_callback), 533fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton m_callback_layout_record_type (layout_record_type_callback), 54d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_baton (callback_baton) 55d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 56d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 57e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 58d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton //------------------------------------------------------------------ 59d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // clang::ExternalASTSource 60d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton //------------------------------------------------------------------ 61d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 62d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual clang::Decl * 63d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton GetExternalDecl (uint32_t ID) 64d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 65d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // This method only needs to be implemented if the AST source ever 66d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // passes back decl sets as VisibleDeclaration objects. 67d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return 0; 68d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 69d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 70d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual clang::Stmt * 71d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton GetExternalDeclStmt (uint64_t Offset) 72d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 73d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // This operation is meant to be used via a LazyOffsetPtr. It only 74d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // needs to be implemented if the AST source uses methods like 75d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // FunctionDecl::setLazyBody when building decls. 76d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return 0; 77d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 78d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 79d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual clang::Selector 80d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton GetExternalSelector (uint32_t ID) 81d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 82d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // This operation only needs to be implemented if the AST source 83d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // returns non-zero for GetNumKnownSelectors(). 84d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return clang::Selector(); 85d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 86d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 87d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual uint32_t 88d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton GetNumExternalSelectors() 89d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 90d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return 0; 91d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 92d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 93d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual clang::CXXBaseSpecifier * 94d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton GetExternalCXXBaseSpecifiers(uint64_t Offset) 95d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 96d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return NULL; 97d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 98d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 99d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual void 100d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton MaterializeVisibleDecls (const clang::DeclContext *decl_ctx) 101d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 102d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton return; 103d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 104d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 1059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan virtual clang::ExternalLoadResult 106d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton FindExternalLexicalDecls (const clang::DeclContext *decl_ctx, 107d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton bool (*isKindWeWant)(clang::Decl::Kind), 108d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton llvm::SmallVectorImpl<clang::Decl*> &decls) 109d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 110d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // This is used to support iterating through an entire lexical context, 111d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // which isn't something the debugger should ever need to do. 1129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return clang::ELR_Failure; 113d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 114d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 11579e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan virtual bool 116d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx, 117d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton clang::DeclarationName decl_name); 118d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 119d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual void 120d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteType (clang::TagDecl *tag_decl); 121d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 122d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton virtual void 123d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteType (clang::ObjCInterfaceDecl *objc_decl); 1248f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 1258f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan bool 1268f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan layoutRecordType(const clang::RecordDecl *Record, 1278f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan uint64_t &Size, 1288f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan uint64_t &Alignment, 1298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets, 1308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets, 1318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets); 132d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton void 133d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, 134d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteObjCInterfaceDeclCallback objc_decl_callback, 135e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton FindExternalVisibleDeclsByNameCallback find_by_name_callback, 1363fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton LayoutRecordTypeCallback layout_record_type_callback, 137d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton void *callback_baton) 138d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 139d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_tag_decl = tag_decl_callback; 140d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_objc_decl = objc_decl_callback; 141e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton m_callback_find_by_name = find_by_name_callback; 1423fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton m_callback_layout_record_type = layout_record_type_callback; 143d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_baton = callback_baton; 144d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 145d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 146d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton void 147d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton RemoveExternalSourceCallbacks (void *callback_baton) 148d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 149d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton if (callback_baton == m_callback_baton) 150d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton { 151d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_tag_decl = NULL; 152d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton m_callback_objc_decl = NULL; 153e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton m_callback_find_by_name = NULL; 1543fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton m_callback_layout_record_type = NULL; 155d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 156d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton } 157d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 158d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonprotected: 159d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton //------------------------------------------------------------------ 160d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these 161d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton //------------------------------------------------------------------ 162d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteTagDeclCallback m_callback_tag_decl; 163d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton CompleteObjCInterfaceDeclCallback m_callback_objc_decl; 164e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton FindExternalVisibleDeclsByNameCallback m_callback_find_by_name; 1653fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton LayoutRecordTypeCallback m_callback_layout_record_type; 166d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton void * m_callback_baton; 167d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton}; 168d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 169d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton} // namespace lldb_private 170d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton 171d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif // liblldb_ClangExternalASTSourceCallbacks_h_ 172