You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.1 KiB
117 lines
4.1 KiB
4 months ago
|
//===-- PDBASTParser.h ------------------------------------------*- C++ -*-===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
|
||
|
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
|
||
|
|
||
|
#include "lldb/lldb-forward.h"
|
||
|
|
||
|
#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
|
||
|
|
||
|
class SymbolFilePDB;
|
||
|
|
||
|
namespace clang {
|
||
|
class CharUnits;
|
||
|
class CXXRecordDecl;
|
||
|
class FieldDecl;
|
||
|
class RecordDecl;
|
||
|
} // namespace clang
|
||
|
|
||
|
namespace lldb_private {
|
||
|
class TypeSystemClang;
|
||
|
class CompilerType;
|
||
|
} // namespace lldb_private
|
||
|
|
||
|
namespace llvm {
|
||
|
namespace pdb {
|
||
|
template <typename ChildType> class ConcreteSymbolEnumerator;
|
||
|
|
||
|
class PDBSymbol;
|
||
|
class PDBSymbolData;
|
||
|
class PDBSymbolFunc;
|
||
|
class PDBSymbolTypeBaseClass;
|
||
|
class PDBSymbolTypeBuiltin;
|
||
|
class PDBSymbolTypeUDT;
|
||
|
} // namespace pdb
|
||
|
} // namespace llvm
|
||
|
|
||
|
class PDBASTParser {
|
||
|
public:
|
||
|
PDBASTParser(lldb_private::TypeSystemClang &ast);
|
||
|
~PDBASTParser();
|
||
|
|
||
|
lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type);
|
||
|
bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type);
|
||
|
|
||
|
clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol);
|
||
|
|
||
|
clang::DeclContext *
|
||
|
GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol);
|
||
|
clang::DeclContext *
|
||
|
GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol);
|
||
|
|
||
|
void ParseDeclsForDeclContext(const clang::DeclContext *decl_context);
|
||
|
|
||
|
clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent,
|
||
|
llvm::StringRef name);
|
||
|
|
||
|
lldb_private::ClangASTImporter &GetClangASTImporter() {
|
||
|
return m_ast_importer;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
|
||
|
CXXRecordDeclToUidMap;
|
||
|
typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
|
||
|
typedef std::set<clang::NamespaceDecl *> NamespacesSet;
|
||
|
typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
|
||
|
ParentToNamespacesMap;
|
||
|
typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
|
||
|
DeclContextToUidMap;
|
||
|
typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
|
||
|
PDBDataSymbolEnumerator;
|
||
|
typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
|
||
|
PDBBaseClassSymbolEnumerator;
|
||
|
typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
|
||
|
PDBFuncSymbolEnumerator;
|
||
|
|
||
|
bool AddEnumValue(lldb_private::CompilerType enum_type,
|
||
|
const llvm::pdb::PDBSymbolData &data);
|
||
|
bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
|
||
|
lldb_private::CompilerType &compiler_type,
|
||
|
llvm::pdb::PDBSymbolTypeUDT &udt);
|
||
|
void
|
||
|
AddRecordMembers(lldb_private::SymbolFile &symbol_file,
|
||
|
lldb_private::CompilerType &record_type,
|
||
|
PDBDataSymbolEnumerator &members_enum,
|
||
|
lldb_private::ClangASTImporter::LayoutInfo &layout_info);
|
||
|
void
|
||
|
AddRecordBases(lldb_private::SymbolFile &symbol_file,
|
||
|
lldb_private::CompilerType &record_type, int record_kind,
|
||
|
PDBBaseClassSymbolEnumerator &bases_enum,
|
||
|
lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
|
||
|
void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
|
||
|
lldb_private::CompilerType &record_type,
|
||
|
PDBFuncSymbolEnumerator &methods_enum);
|
||
|
clang::CXXMethodDecl *
|
||
|
AddRecordMethod(lldb_private::SymbolFile &symbol_file,
|
||
|
lldb_private::CompilerType &record_type,
|
||
|
const llvm::pdb::PDBSymbolFunc &method) const;
|
||
|
|
||
|
lldb_private::TypeSystemClang &m_ast;
|
||
|
lldb_private::ClangASTImporter m_ast_importer;
|
||
|
|
||
|
CXXRecordDeclToUidMap m_forward_decl_to_uid;
|
||
|
UidToDeclMap m_uid_to_decl;
|
||
|
ParentToNamespacesMap m_parent_to_namespaces;
|
||
|
NamespacesSet m_namespaces;
|
||
|
DeclContextToUidMap m_decl_context_to_uid;
|
||
|
};
|
||
|
|
||
|
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
|