xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.h (revision dda2819751e49c83612958492e38917049128b41)
1061da546Spatrick //===-- PDBASTParser.h ------------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9*dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
10*dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
11061da546Spatrick 
12061da546Spatrick #include "lldb/lldb-forward.h"
13061da546Spatrick 
14*dda28197Spatrick #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
15061da546Spatrick 
16061da546Spatrick class SymbolFilePDB;
17061da546Spatrick 
18061da546Spatrick namespace clang {
19061da546Spatrick class CharUnits;
20061da546Spatrick class CXXRecordDecl;
21061da546Spatrick class FieldDecl;
22061da546Spatrick class RecordDecl;
23061da546Spatrick } // namespace clang
24061da546Spatrick 
25061da546Spatrick namespace lldb_private {
26*dda28197Spatrick class TypeSystemClang;
27061da546Spatrick class CompilerType;
28061da546Spatrick } // namespace lldb_private
29061da546Spatrick 
30061da546Spatrick namespace llvm {
31061da546Spatrick namespace pdb {
32061da546Spatrick template <typename ChildType> class ConcreteSymbolEnumerator;
33061da546Spatrick 
34061da546Spatrick class PDBSymbol;
35061da546Spatrick class PDBSymbolData;
36061da546Spatrick class PDBSymbolFunc;
37061da546Spatrick class PDBSymbolTypeBaseClass;
38061da546Spatrick class PDBSymbolTypeBuiltin;
39061da546Spatrick class PDBSymbolTypeUDT;
40061da546Spatrick } // namespace pdb
41061da546Spatrick } // namespace llvm
42061da546Spatrick 
43061da546Spatrick class PDBASTParser {
44061da546Spatrick public:
45*dda28197Spatrick   PDBASTParser(lldb_private::TypeSystemClang &ast);
46061da546Spatrick   ~PDBASTParser();
47061da546Spatrick 
48061da546Spatrick   lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type);
49061da546Spatrick   bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type);
50061da546Spatrick 
51061da546Spatrick   clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol);
52061da546Spatrick 
53061da546Spatrick   clang::DeclContext *
54061da546Spatrick   GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol);
55061da546Spatrick   clang::DeclContext *
56061da546Spatrick   GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol);
57061da546Spatrick 
58061da546Spatrick   void ParseDeclsForDeclContext(const clang::DeclContext *decl_context);
59061da546Spatrick 
60061da546Spatrick   clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent,
61061da546Spatrick                                           llvm::StringRef name);
62061da546Spatrick 
GetClangASTImporter()63061da546Spatrick   lldb_private::ClangASTImporter &GetClangASTImporter() {
64061da546Spatrick     return m_ast_importer;
65061da546Spatrick   }
66061da546Spatrick 
67061da546Spatrick private:
68061da546Spatrick   typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
69061da546Spatrick       CXXRecordDeclToUidMap;
70061da546Spatrick   typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
71061da546Spatrick   typedef std::set<clang::NamespaceDecl *> NamespacesSet;
72061da546Spatrick   typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
73061da546Spatrick       ParentToNamespacesMap;
74061da546Spatrick   typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
75061da546Spatrick       DeclContextToUidMap;
76061da546Spatrick   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
77061da546Spatrick       PDBDataSymbolEnumerator;
78061da546Spatrick   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
79061da546Spatrick       PDBBaseClassSymbolEnumerator;
80061da546Spatrick   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
81061da546Spatrick       PDBFuncSymbolEnumerator;
82061da546Spatrick 
83061da546Spatrick   bool AddEnumValue(lldb_private::CompilerType enum_type,
84061da546Spatrick                     const llvm::pdb::PDBSymbolData &data);
85061da546Spatrick   bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
86061da546Spatrick                            lldb_private::CompilerType &compiler_type,
87061da546Spatrick                            llvm::pdb::PDBSymbolTypeUDT &udt);
88061da546Spatrick   void
89061da546Spatrick   AddRecordMembers(lldb_private::SymbolFile &symbol_file,
90061da546Spatrick                    lldb_private::CompilerType &record_type,
91061da546Spatrick                    PDBDataSymbolEnumerator &members_enum,
92061da546Spatrick                    lldb_private::ClangASTImporter::LayoutInfo &layout_info);
93061da546Spatrick   void
94061da546Spatrick   AddRecordBases(lldb_private::SymbolFile &symbol_file,
95061da546Spatrick                  lldb_private::CompilerType &record_type, int record_kind,
96061da546Spatrick                  PDBBaseClassSymbolEnumerator &bases_enum,
97061da546Spatrick                  lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
98061da546Spatrick   void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
99061da546Spatrick                         lldb_private::CompilerType &record_type,
100061da546Spatrick                         PDBFuncSymbolEnumerator &methods_enum);
101061da546Spatrick   clang::CXXMethodDecl *
102061da546Spatrick   AddRecordMethod(lldb_private::SymbolFile &symbol_file,
103061da546Spatrick                   lldb_private::CompilerType &record_type,
104061da546Spatrick                   const llvm::pdb::PDBSymbolFunc &method) const;
105061da546Spatrick 
106*dda28197Spatrick   lldb_private::TypeSystemClang &m_ast;
107061da546Spatrick   lldb_private::ClangASTImporter m_ast_importer;
108061da546Spatrick 
109061da546Spatrick   CXXRecordDeclToUidMap m_forward_decl_to_uid;
110061da546Spatrick   UidToDeclMap m_uid_to_decl;
111061da546Spatrick   ParentToNamespacesMap m_parent_to_namespaces;
112061da546Spatrick   NamespacesSet m_namespaces;
113061da546Spatrick   DeclContextToUidMap m_decl_context_to_uid;
114061da546Spatrick };
115061da546Spatrick 
116*dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
117