xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1061da546Spatrick //===-- PdbAstBuilder.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 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H
11061da546Spatrick 
12061da546Spatrick #include "llvm/ADT/DenseMap.h"
13061da546Spatrick #include "llvm/ADT/StringRef.h"
14*f6aab3d8Srobert #include "llvm/Support/Threading.h"
15061da546Spatrick 
16dda28197Spatrick #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
17061da546Spatrick 
18061da546Spatrick #include "PdbIndex.h"
19061da546Spatrick #include "PdbSymUid.h"
20*f6aab3d8Srobert #include <optional>
21061da546Spatrick 
22061da546Spatrick namespace clang {
23061da546Spatrick class TagDecl;
24061da546Spatrick class DeclContext;
25061da546Spatrick class Decl;
26061da546Spatrick class QualType;
27061da546Spatrick class FunctionDecl;
28061da546Spatrick class NamespaceDecl;
29061da546Spatrick } // namespace clang
30061da546Spatrick 
31061da546Spatrick namespace llvm {
32061da546Spatrick namespace codeview {
33061da546Spatrick class ProcSym;
34061da546Spatrick }
35061da546Spatrick } // namespace llvm
36061da546Spatrick 
37061da546Spatrick namespace lldb_private {
38061da546Spatrick class ClangASTImporter;
39061da546Spatrick class ObjectFile;
40061da546Spatrick 
41061da546Spatrick namespace npdb {
42061da546Spatrick class PdbIndex;
43061da546Spatrick struct VariableInfo;
44061da546Spatrick 
45061da546Spatrick struct DeclStatus {
46061da546Spatrick   DeclStatus() = default;
DeclStatusDeclStatus47061da546Spatrick   DeclStatus(lldb::user_id_t uid, bool resolved)
48061da546Spatrick       : uid(uid), resolved(resolved) {}
49061da546Spatrick   lldb::user_id_t uid = 0;
50061da546Spatrick   bool resolved = false;
51061da546Spatrick };
52061da546Spatrick 
53061da546Spatrick class PdbAstBuilder {
54061da546Spatrick public:
55061da546Spatrick   // Constructors and Destructors
56*f6aab3d8Srobert   PdbAstBuilder(TypeSystemClang &clang);
57061da546Spatrick 
58061da546Spatrick   lldb_private::CompilerDeclContext GetTranslationUnitDecl();
59061da546Spatrick 
60*f6aab3d8Srobert   std::optional<lldb_private::CompilerDecl>
61061da546Spatrick   GetOrCreateDeclForUid(PdbSymUid uid);
62061da546Spatrick   clang::DeclContext *GetOrCreateDeclContextForUid(PdbSymUid uid);
63061da546Spatrick   clang::DeclContext *GetParentDeclContext(PdbSymUid uid);
64061da546Spatrick 
65061da546Spatrick   clang::FunctionDecl *GetOrCreateFunctionDecl(PdbCompilandSymId func_id);
66*f6aab3d8Srobert   clang::FunctionDecl *
67*f6aab3d8Srobert   GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id);
68061da546Spatrick   clang::BlockDecl *GetOrCreateBlockDecl(PdbCompilandSymId block_id);
69061da546Spatrick   clang::VarDecl *GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
70061da546Spatrick                                           PdbCompilandSymId var_id);
71061da546Spatrick   clang::VarDecl *GetOrCreateVariableDecl(PdbGlobalSymId var_id);
72061da546Spatrick   clang::TypedefNameDecl *GetOrCreateTypedefDecl(PdbGlobalSymId id);
73061da546Spatrick   void ParseDeclsForContext(clang::DeclContext &context);
74061da546Spatrick 
75061da546Spatrick   clang::QualType GetBasicType(lldb::BasicType type);
76061da546Spatrick   clang::QualType GetOrCreateType(PdbTypeSymId type);
77061da546Spatrick 
78061da546Spatrick   bool CompleteTagDecl(clang::TagDecl &tag);
79061da546Spatrick   bool CompleteType(clang::QualType qt);
80061da546Spatrick 
81061da546Spatrick   CompilerDecl ToCompilerDecl(clang::Decl &decl);
82061da546Spatrick   CompilerType ToCompilerType(clang::QualType qt);
83061da546Spatrick   CompilerDeclContext ToCompilerDeclContext(clang::DeclContext &context);
84061da546Spatrick   clang::Decl *FromCompilerDecl(CompilerDecl decl);
85061da546Spatrick   clang::DeclContext *FromCompilerDeclContext(CompilerDeclContext context);
86061da546Spatrick 
clang()87dda28197Spatrick   TypeSystemClang &clang() { return m_clang; }
GetClangASTImporter()88*f6aab3d8Srobert   ClangASTImporter &GetClangASTImporter() { return m_importer; }
89061da546Spatrick 
90061da546Spatrick   void Dump(Stream &stream);
91061da546Spatrick 
92061da546Spatrick private:
93061da546Spatrick   clang::Decl *TryGetDecl(PdbSymUid uid) const;
94061da546Spatrick 
95061da546Spatrick   using TypeIndex = llvm::codeview::TypeIndex;
96061da546Spatrick 
97061da546Spatrick   clang::QualType
98061da546Spatrick   CreatePointerType(const llvm::codeview::PointerRecord &pointer);
99061da546Spatrick   clang::QualType
100061da546Spatrick   CreateModifierType(const llvm::codeview::ModifierRecord &modifier);
101061da546Spatrick   clang::QualType CreateArrayType(const llvm::codeview::ArrayRecord &array);
102061da546Spatrick   clang::QualType CreateRecordType(PdbTypeSymId id,
103061da546Spatrick                                    const llvm::codeview::TagRecord &record);
104061da546Spatrick   clang::QualType CreateEnumType(PdbTypeSymId id,
105061da546Spatrick                                  const llvm::codeview::EnumRecord &record);
106061da546Spatrick   clang::QualType
107061da546Spatrick   CreateFunctionType(TypeIndex args_type_idx, TypeIndex return_type_idx,
108061da546Spatrick                      llvm::codeview::CallingConvention calling_convention);
109061da546Spatrick   clang::QualType CreateType(PdbTypeSymId type);
110061da546Spatrick 
111061da546Spatrick   void CreateFunctionParameters(PdbCompilandSymId func_id,
112061da546Spatrick                                 clang::FunctionDecl &function_decl,
113061da546Spatrick                                 uint32_t param_count);
114061da546Spatrick   clang::Decl *GetOrCreateSymbolForId(PdbCompilandSymId id);
115061da546Spatrick   clang::VarDecl *CreateVariableDecl(PdbSymUid uid,
116061da546Spatrick                                      llvm::codeview::CVSymbol sym,
117061da546Spatrick                                      clang::DeclContext &scope);
118061da546Spatrick   clang::NamespaceDecl *GetOrCreateNamespaceDecl(const char *name,
119061da546Spatrick                                                  clang::DeclContext &context);
120*f6aab3d8Srobert   clang::FunctionDecl *CreateFunctionDeclFromId(PdbTypeSymId func_tid,
121*f6aab3d8Srobert                                                 PdbCompilandSymId func_sid);
122*f6aab3d8Srobert   clang::FunctionDecl *
123*f6aab3d8Srobert   CreateFunctionDecl(PdbCompilandSymId func_id, llvm::StringRef func_name,
124*f6aab3d8Srobert                      TypeIndex func_ti, CompilerType func_ct,
125*f6aab3d8Srobert                      uint32_t param_count, clang::StorageClass func_storage,
126*f6aab3d8Srobert                      bool is_inline, clang::DeclContext *parent);
127*f6aab3d8Srobert   void ParseNamespace(clang::DeclContext &parent);
128*f6aab3d8Srobert   void ParseAllTypes();
129*f6aab3d8Srobert   void ParseAllFunctionsAndNonLocalVars();
130061da546Spatrick   void ParseDeclsForSimpleContext(clang::DeclContext &context);
131061da546Spatrick   void ParseBlockChildren(PdbCompilandSymId block_id);
132061da546Spatrick 
133061da546Spatrick   std::pair<clang::DeclContext *, std::string>
134061da546Spatrick   CreateDeclInfoForType(const llvm::codeview::TagRecord &record, TypeIndex ti);
135061da546Spatrick   std::pair<clang::DeclContext *, std::string>
136061da546Spatrick   CreateDeclInfoForUndecoratedName(llvm::StringRef uname);
137061da546Spatrick   clang::QualType CreateSimpleType(TypeIndex ti);
138061da546Spatrick 
139dda28197Spatrick   TypeSystemClang &m_clang;
140061da546Spatrick 
141061da546Spatrick   ClangASTImporter m_importer;
142*f6aab3d8Srobert   llvm::once_flag m_parse_functions_and_non_local_vars;
143*f6aab3d8Srobert   llvm::once_flag m_parse_all_types;
144061da546Spatrick   llvm::DenseMap<clang::Decl *, DeclStatus> m_decl_to_status;
145061da546Spatrick   llvm::DenseMap<lldb::user_id_t, clang::Decl *> m_uid_to_decl;
146061da546Spatrick   llvm::DenseMap<lldb::user_id_t, clang::QualType> m_uid_to_type;
147*f6aab3d8Srobert 
148*f6aab3d8Srobert   // From class/struct's opaque_compiler_type_t to a set containing the pairs of
149*f6aab3d8Srobert   // method's name and CompilerType.
150*f6aab3d8Srobert   llvm::DenseMap<lldb::opaque_compiler_type_t,
151*f6aab3d8Srobert                  llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>>
152*f6aab3d8Srobert       m_cxx_record_map;
153*f6aab3d8Srobert   llvm::DenseSet<clang::NamespaceDecl *> m_parsed_namespaces;
154061da546Spatrick };
155061da546Spatrick 
156061da546Spatrick } // namespace npdb
157061da546Spatrick } // namespace lldb_private
158061da546Spatrick 
159dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H
160