xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
10b57cec5SDimitry Andric //===-- SymbolFilePDB.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 
95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H
105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/Core/UniqueCStringMap.h"
130b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h"
140b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h"
150b57cec5SDimitry Andric #include "lldb/Utility/UserID.h"
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
180b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBSession.h"
190b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDB.h"
200b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
21bdd1243dSDimitry Andric #include <optional>
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric class PDBASTParser;
240b57cec5SDimitry Andric 
2581ad6265SDimitry Andric class SymbolFilePDB : public lldb_private::SymbolFileCommon {
26480093f4SDimitry Andric   /// LLVM RTTI support.
27480093f4SDimitry Andric   static char ID;
28480093f4SDimitry Andric 
290b57cec5SDimitry Andric public:
30480093f4SDimitry Andric   /// LLVM RTTI support.
31480093f4SDimitry Andric   /// \{
isA(const void * ClassID)32480093f4SDimitry Andric   bool isA(const void *ClassID) const override {
3381ad6265SDimitry Andric     return ClassID == &ID || SymbolFileCommon::isA(ClassID);
34480093f4SDimitry Andric   }
classof(const SymbolFile * obj)35480093f4SDimitry Andric   static bool classof(const SymbolFile *obj) { return obj->isA(&ID); }
36480093f4SDimitry Andric   /// \}
37480093f4SDimitry Andric 
380b57cec5SDimitry Andric   // Static Functions
390b57cec5SDimitry Andric   static void Initialize();
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   static void Terminate();
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric   static void DebuggerInitialize(lldb_private::Debugger &debugger);
440b57cec5SDimitry Andric 
GetPluginNameStatic()45349cc55cSDimitry Andric   static llvm::StringRef GetPluginNameStatic() { return "pdb"; }
460b57cec5SDimitry Andric 
47349cc55cSDimitry Andric   static llvm::StringRef GetPluginDescriptionStatic();
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   static lldb_private::SymbolFile *
509dba64beSDimitry Andric   CreateInstance(lldb::ObjectFileSP objfile_sp);
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric   // Constructors and Destructors
539dba64beSDimitry Andric   SymbolFilePDB(lldb::ObjectFileSP objfile_sp);
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   ~SymbolFilePDB() override;
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   uint32_t CalculateAbilities() override;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   void InitializeObject() override;
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric   // Compile Unit function calls
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   lldb::LanguageType
640b57cec5SDimitry Andric   ParseLanguage(lldb_private::CompileUnit &comp_unit) override;
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric   size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override;
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override;
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override;
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit,
73*1db9f3b2SDimitry Andric                          lldb_private::SupportFileList &support_files) override;
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric   size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override;
760b57cec5SDimitry Andric 
770b57cec5SDimitry Andric   bool ParseImportedModules(
780b57cec5SDimitry Andric       const lldb_private::SymbolContext &sc,
790b57cec5SDimitry Andric       std::vector<lldb_private::SourceModule> &imported_modules) override;
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric   size_t ParseBlocksRecursive(lldb_private::Function &func) override;
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   size_t
840b57cec5SDimitry Andric   ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric   lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
87bdd1243dSDimitry Andric   std::optional<ArrayInfo> GetDynamicArrayInfoForUID(
880b57cec5SDimitry Andric       lldb::user_id_t type_uid,
890b57cec5SDimitry Andric       const lldb_private::ExecutionContext *exe_ctx) override;
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   bool CompleteType(lldb_private::CompilerType &compiler_type) override;
920b57cec5SDimitry Andric 
930b57cec5SDimitry Andric   lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   lldb_private::CompilerDeclContext
960b57cec5SDimitry Andric   GetDeclContextForUID(lldb::user_id_t uid) override;
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric   lldb_private::CompilerDeclContext
990b57cec5SDimitry Andric   GetDeclContextContainingUID(lldb::user_id_t uid) override;
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric   void
1020b57cec5SDimitry Andric   ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric   uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr,
1050b57cec5SDimitry Andric                                 lldb::SymbolContextItem resolve_scope,
1060b57cec5SDimitry Andric                                 lldb_private::SymbolContext &sc) override;
1070b57cec5SDimitry Andric 
108fe6060f1SDimitry Andric   uint32_t ResolveSymbolContext(
109fe6060f1SDimitry Andric       const lldb_private::SourceLocationSpec &src_location_spec,
1100b57cec5SDimitry Andric       lldb::SymbolContextItem resolve_scope,
1110b57cec5SDimitry Andric       lldb_private::SymbolContextList &sc_list) override;
1120b57cec5SDimitry Andric 
1139dba64beSDimitry Andric   void
1140b57cec5SDimitry Andric   FindGlobalVariables(lldb_private::ConstString name,
1155ffd83dbSDimitry Andric                       const lldb_private::CompilerDeclContext &parent_decl_ctx,
1160b57cec5SDimitry Andric                       uint32_t max_matches,
1170b57cec5SDimitry Andric                       lldb_private::VariableList &variables) override;
1180b57cec5SDimitry Andric 
1199dba64beSDimitry Andric   void FindGlobalVariables(const lldb_private::RegularExpression &regex,
1200b57cec5SDimitry Andric                            uint32_t max_matches,
1210b57cec5SDimitry Andric                            lldb_private::VariableList &variables) override;
1220b57cec5SDimitry Andric 
123bdd1243dSDimitry Andric   void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info,
1245ffd83dbSDimitry Andric                      const lldb_private::CompilerDeclContext &parent_decl_ctx,
1259dba64beSDimitry Andric                      bool include_inlines,
1269dba64beSDimitry Andric                      lldb_private::SymbolContextList &sc_list) override;
1270b57cec5SDimitry Andric 
1289dba64beSDimitry Andric   void FindFunctions(const lldb_private::RegularExpression &regex,
1299dba64beSDimitry Andric                      bool include_inlines,
1300b57cec5SDimitry Andric                      lldb_private::SymbolContextList &sc_list) override;
1310b57cec5SDimitry Andric 
1320b57cec5SDimitry Andric   void GetMangledNamesForFunction(
1330b57cec5SDimitry Andric       const std::string &scope_qualified_name,
1340b57cec5SDimitry Andric       std::vector<lldb_private::ConstString> &mangled_names) override;
1350b57cec5SDimitry Andric 
1360b57cec5SDimitry Andric   void AddSymbols(lldb_private::Symtab &symtab) override;
1375f757f3fSDimitry Andric   void FindTypes(const lldb_private::TypeQuery &match,
1385f757f3fSDimitry Andric                  lldb_private::TypeResults &results) override;
1390b57cec5SDimitry Andric   void FindTypesByRegex(const lldb_private::RegularExpression &regex,
1400b57cec5SDimitry Andric                         uint32_t max_matches, lldb_private::TypeMap &types);
1410b57cec5SDimitry Andric 
1429dba64beSDimitry Andric   void GetTypes(lldb_private::SymbolContextScope *sc_scope,
1430b57cec5SDimitry Andric                 lldb::TypeClass type_mask,
1440b57cec5SDimitry Andric                 lldb_private::TypeList &type_list) override;
1450b57cec5SDimitry Andric 
146bdd1243dSDimitry Andric   llvm::Expected<lldb::TypeSystemSP>
1470b57cec5SDimitry Andric   GetTypeSystemForLanguage(lldb::LanguageType language) override;
1480b57cec5SDimitry Andric 
14906c3fb27SDimitry Andric   lldb_private::CompilerDeclContext
15006c3fb27SDimitry Andric   FindNamespace(lldb_private::ConstString name,
15106c3fb27SDimitry Andric                 const lldb_private::CompilerDeclContext &parent_decl_ctx,
15206c3fb27SDimitry Andric                 bool only_root_namespaces) override;
1530b57cec5SDimitry Andric 
GetPluginName()154349cc55cSDimitry Andric   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
1550b57cec5SDimitry Andric 
1560b57cec5SDimitry Andric   llvm::pdb::IPDBSession &GetPDBSession();
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   const llvm::pdb::IPDBSession &GetPDBSession() const;
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric   void DumpClangAST(lldb_private::Stream &s) override;
1610b57cec5SDimitry Andric 
1620b57cec5SDimitry Andric private:
1630b57cec5SDimitry Andric   struct SecContribInfo {
1640b57cec5SDimitry Andric     uint32_t Offset;
1650b57cec5SDimitry Andric     uint32_t Size;
1660b57cec5SDimitry Andric     uint32_t CompilandId;
1670b57cec5SDimitry Andric   };
1680b57cec5SDimitry Andric   using SecContribsMap = std::map<uint32_t, std::vector<SecContribInfo>>;
1690b57cec5SDimitry Andric 
1709dba64beSDimitry Andric   uint32_t CalculateNumCompileUnits() override;
1719dba64beSDimitry Andric 
1729dba64beSDimitry Andric   lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
1739dba64beSDimitry Andric 
1740b57cec5SDimitry Andric   lldb::CompUnitSP ParseCompileUnitForUID(uint32_t id,
1750b57cec5SDimitry Andric                                           uint32_t index = UINT32_MAX);
1760b57cec5SDimitry Andric 
1770b57cec5SDimitry Andric   bool ParseCompileUnitLineTable(lldb_private::CompileUnit &comp_unit,
1780b57cec5SDimitry Andric                                  uint32_t match_line);
1790b57cec5SDimitry Andric 
1800b57cec5SDimitry Andric   void BuildSupportFileIdToSupportFileIndexMap(
1810b57cec5SDimitry Andric       const llvm::pdb::PDBSymbolCompiland &pdb_compiland,
1820b57cec5SDimitry Andric       llvm::DenseMap<uint32_t, uint32_t> &index_map) const;
1830b57cec5SDimitry Andric 
1840b57cec5SDimitry Andric   void FindTypesByName(llvm::StringRef name,
1855ffd83dbSDimitry Andric                        const lldb_private::CompilerDeclContext &parent_decl_ctx,
1860b57cec5SDimitry Andric                        uint32_t max_matches, lldb_private::TypeMap &types);
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric   std::string GetMangledForPDBData(const llvm::pdb::PDBSymbolData &pdb_data);
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric   lldb::VariableSP
1910b57cec5SDimitry Andric   ParseVariableForPDBData(const lldb_private::SymbolContext &sc,
1920b57cec5SDimitry Andric                           const llvm::pdb::PDBSymbolData &pdb_data);
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric   size_t ParseVariables(const lldb_private::SymbolContext &sc,
1950b57cec5SDimitry Andric                         const llvm::pdb::PDBSymbol &pdb_data,
1960b57cec5SDimitry Andric                         lldb_private::VariableList *variable_list = nullptr);
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric   lldb::CompUnitSP
1990b57cec5SDimitry Andric   GetCompileUnitContainsAddress(const lldb_private::Address &so_addr);
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric   typedef std::vector<lldb_private::Type *> TypeCollection;
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric   void GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol,
2040b57cec5SDimitry Andric                             uint32_t type_mask,
2050b57cec5SDimitry Andric                             TypeCollection &type_collection);
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric   lldb_private::Function *
2080b57cec5SDimitry Andric   ParseCompileUnitFunctionForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func,
2090b57cec5SDimitry Andric                                      lldb_private::CompileUnit &comp_unit);
2100b57cec5SDimitry Andric 
2110b57cec5SDimitry Andric   void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland,
2120b57cec5SDimitry Andric                            uint32_t &index);
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric   PDBASTParser *GetPDBAstParser();
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric   std::unique_ptr<llvm::pdb::PDBSymbolCompiland>
2170b57cec5SDimitry Andric   GetPDBCompilandByUID(uint32_t uid);
2180b57cec5SDimitry Andric 
2190b57cec5SDimitry Andric   lldb_private::Mangled
2200b57cec5SDimitry Andric   GetMangledForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func);
2210b57cec5SDimitry Andric 
2220b57cec5SDimitry Andric   bool ResolveFunction(const llvm::pdb::PDBSymbolFunc &pdb_func,
2230b57cec5SDimitry Andric                        bool include_inlines,
2240b57cec5SDimitry Andric                        lldb_private::SymbolContextList &sc_list);
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric   bool ResolveFunction(uint32_t uid, bool include_inlines,
2270b57cec5SDimitry Andric                        lldb_private::SymbolContextList &sc_list);
2280b57cec5SDimitry Andric 
2290b57cec5SDimitry Andric   void CacheFunctionNames();
2300b57cec5SDimitry Andric 
2310b57cec5SDimitry Andric   bool DeclContextMatchesThisSymbolFile(
2325ffd83dbSDimitry Andric       const lldb_private::CompilerDeclContext &decl_ctx);
2330b57cec5SDimitry Andric 
2340b57cec5SDimitry Andric   uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data);
2350b57cec5SDimitry Andric 
2360b57cec5SDimitry Andric   llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units;
2370b57cec5SDimitry Andric   llvm::DenseMap<uint32_t, lldb::TypeSP> m_types;
2380b57cec5SDimitry Andric   llvm::DenseMap<uint32_t, lldb::VariableSP> m_variables;
2390b57cec5SDimitry Andric   llvm::DenseMap<uint64_t, std::string> m_public_names;
2400b57cec5SDimitry Andric 
2410b57cec5SDimitry Andric   SecContribsMap m_sec_contribs;
2420b57cec5SDimitry Andric 
2430b57cec5SDimitry Andric   std::vector<lldb::TypeSP> m_builtin_types;
2440b57cec5SDimitry Andric   std::unique_ptr<llvm::pdb::IPDBSession> m_session_up;
2450b57cec5SDimitry Andric   std::unique_ptr<llvm::pdb::PDBSymbolExe> m_global_scope_up;
2460b57cec5SDimitry Andric 
2470b57cec5SDimitry Andric   lldb_private::UniqueCStringMap<uint32_t> m_func_full_names;
2480b57cec5SDimitry Andric   lldb_private::UniqueCStringMap<uint32_t> m_func_base_names;
2490b57cec5SDimitry Andric   lldb_private::UniqueCStringMap<uint32_t> m_func_method_names;
2500b57cec5SDimitry Andric };
2510b57cec5SDimitry Andric 
2525ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H
253