xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h (revision e25152834cdf3b353892835a4f3b157e066a8ed4)
10b57cec5SDimitry Andric //===-- PDBASTParser.h ------------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
9*5ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
10*5ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/lldb-forward.h"
130b57cec5SDimitry Andric 
14*5ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric class SymbolFilePDB;
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric namespace clang {
190b57cec5SDimitry Andric class CharUnits;
200b57cec5SDimitry Andric class CXXRecordDecl;
210b57cec5SDimitry Andric class FieldDecl;
220b57cec5SDimitry Andric class RecordDecl;
230b57cec5SDimitry Andric } // namespace clang
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric namespace lldb_private {
26*5ffd83dbSDimitry Andric class TypeSystemClang;
270b57cec5SDimitry Andric class CompilerType;
280b57cec5SDimitry Andric } // namespace lldb_private
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric namespace llvm {
310b57cec5SDimitry Andric namespace pdb {
320b57cec5SDimitry Andric template <typename ChildType> class ConcreteSymbolEnumerator;
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric class PDBSymbol;
350b57cec5SDimitry Andric class PDBSymbolData;
360b57cec5SDimitry Andric class PDBSymbolFunc;
370b57cec5SDimitry Andric class PDBSymbolTypeBaseClass;
380b57cec5SDimitry Andric class PDBSymbolTypeBuiltin;
390b57cec5SDimitry Andric class PDBSymbolTypeUDT;
400b57cec5SDimitry Andric } // namespace pdb
410b57cec5SDimitry Andric } // namespace llvm
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric class PDBASTParser {
440b57cec5SDimitry Andric public:
45*5ffd83dbSDimitry Andric   PDBASTParser(lldb_private::TypeSystemClang &ast);
460b57cec5SDimitry Andric   ~PDBASTParser();
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type);
490b57cec5SDimitry Andric   bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type);
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric   clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol);
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric   clang::DeclContext *
540b57cec5SDimitry Andric   GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol);
550b57cec5SDimitry Andric   clang::DeclContext *
560b57cec5SDimitry Andric   GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol);
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric   void ParseDeclsForDeclContext(const clang::DeclContext *decl_context);
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent,
610b57cec5SDimitry Andric                                           llvm::StringRef name);
620b57cec5SDimitry Andric 
GetClangASTImporter()630b57cec5SDimitry Andric   lldb_private::ClangASTImporter &GetClangASTImporter() {
640b57cec5SDimitry Andric     return m_ast_importer;
650b57cec5SDimitry Andric   }
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric private:
680b57cec5SDimitry Andric   typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
690b57cec5SDimitry Andric       CXXRecordDeclToUidMap;
700b57cec5SDimitry Andric   typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
710b57cec5SDimitry Andric   typedef std::set<clang::NamespaceDecl *> NamespacesSet;
720b57cec5SDimitry Andric   typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
730b57cec5SDimitry Andric       ParentToNamespacesMap;
740b57cec5SDimitry Andric   typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
750b57cec5SDimitry Andric       DeclContextToUidMap;
760b57cec5SDimitry Andric   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
770b57cec5SDimitry Andric       PDBDataSymbolEnumerator;
780b57cec5SDimitry Andric   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
790b57cec5SDimitry Andric       PDBBaseClassSymbolEnumerator;
800b57cec5SDimitry Andric   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
810b57cec5SDimitry Andric       PDBFuncSymbolEnumerator;
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   bool AddEnumValue(lldb_private::CompilerType enum_type,
840b57cec5SDimitry Andric                     const llvm::pdb::PDBSymbolData &data);
850b57cec5SDimitry Andric   bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
860b57cec5SDimitry Andric                            lldb_private::CompilerType &compiler_type,
870b57cec5SDimitry Andric                            llvm::pdb::PDBSymbolTypeUDT &udt);
880b57cec5SDimitry Andric   void
890b57cec5SDimitry Andric   AddRecordMembers(lldb_private::SymbolFile &symbol_file,
900b57cec5SDimitry Andric                    lldb_private::CompilerType &record_type,
910b57cec5SDimitry Andric                    PDBDataSymbolEnumerator &members_enum,
920b57cec5SDimitry Andric                    lldb_private::ClangASTImporter::LayoutInfo &layout_info);
930b57cec5SDimitry Andric   void
940b57cec5SDimitry Andric   AddRecordBases(lldb_private::SymbolFile &symbol_file,
950b57cec5SDimitry Andric                  lldb_private::CompilerType &record_type, int record_kind,
960b57cec5SDimitry Andric                  PDBBaseClassSymbolEnumerator &bases_enum,
970b57cec5SDimitry Andric                  lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
980b57cec5SDimitry Andric   void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
990b57cec5SDimitry Andric                         lldb_private::CompilerType &record_type,
1000b57cec5SDimitry Andric                         PDBFuncSymbolEnumerator &methods_enum);
1010b57cec5SDimitry Andric   clang::CXXMethodDecl *
1020b57cec5SDimitry Andric   AddRecordMethod(lldb_private::SymbolFile &symbol_file,
1030b57cec5SDimitry Andric                   lldb_private::CompilerType &record_type,
1040b57cec5SDimitry Andric                   const llvm::pdb::PDBSymbolFunc &method) const;
1050b57cec5SDimitry Andric 
106*5ffd83dbSDimitry Andric   lldb_private::TypeSystemClang &m_ast;
1070b57cec5SDimitry Andric   lldb_private::ClangASTImporter m_ast_importer;
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric   CXXRecordDeclToUidMap m_forward_decl_to_uid;
1100b57cec5SDimitry Andric   UidToDeclMap m_uid_to_decl;
1110b57cec5SDimitry Andric   ParentToNamespacesMap m_parent_to_namespaces;
1120b57cec5SDimitry Andric   NamespacesSet m_namespaces;
1130b57cec5SDimitry Andric   DeclContextToUidMap m_decl_context_to_uid;
1140b57cec5SDimitry Andric };
1150b57cec5SDimitry Andric 
116*5ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
117