10b57cec5SDimitry Andric //===-- SymbolFileNativePDB.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_NATIVEPDB_SYMBOLFILENATIVEPDB_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H 110b57cec5SDimitry Andric 1204eeddc0SDimitry Andric #include "lldb/Symbol/LineTable.h" 130b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h" 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 160b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/CVRecord.h" 170b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 180b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBTypes.h" 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric #include "CompileUnitIndex.h" 210b57cec5SDimitry Andric #include "PdbIndex.h" 22bdd1243dSDimitry Andric #include "PdbAstBuilder.h" 23bdd1243dSDimitry Andric #include <optional> 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace clang { 260b57cec5SDimitry Andric class TagDecl; 270b57cec5SDimitry Andric } 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric namespace llvm { 300b57cec5SDimitry Andric namespace codeview { 310b57cec5SDimitry Andric class ClassRecord; 320b57cec5SDimitry Andric class EnumRecord; 330b57cec5SDimitry Andric class ModifierRecord; 340b57cec5SDimitry Andric class PointerRecord; 350b57cec5SDimitry Andric struct UnionRecord; 360b57cec5SDimitry Andric } // namespace codeview 370b57cec5SDimitry Andric } // namespace llvm 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric namespace lldb_private { 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric namespace npdb { 420b57cec5SDimitry Andric 4381ad6265SDimitry Andric class SymbolFileNativePDB : public SymbolFileCommon { 440b57cec5SDimitry Andric friend class UdtRecordCompleter; 450b57cec5SDimitry Andric 46480093f4SDimitry Andric /// LLVM RTTI support. 47480093f4SDimitry Andric static char ID; 48480093f4SDimitry Andric 490b57cec5SDimitry Andric public: 50480093f4SDimitry Andric /// LLVM RTTI support. 51480093f4SDimitry Andric /// \{ 52480093f4SDimitry Andric bool isA(const void *ClassID) const override { 5381ad6265SDimitry Andric return ClassID == &ID || SymbolFileCommon::isA(ClassID); 54480093f4SDimitry Andric } 55480093f4SDimitry Andric static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 56480093f4SDimitry Andric /// \} 57480093f4SDimitry Andric 580b57cec5SDimitry Andric // Static Functions 590b57cec5SDimitry Andric static void Initialize(); 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric static void Terminate(); 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric static void DebuggerInitialize(Debugger &debugger); 640b57cec5SDimitry Andric 65349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "native-pdb"; } 660b57cec5SDimitry Andric 67349cc55cSDimitry Andric static llvm::StringRef GetPluginDescriptionStatic(); 680b57cec5SDimitry Andric 699dba64beSDimitry Andric static SymbolFile *CreateInstance(lldb::ObjectFileSP objfile_sp); 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric // Constructors and Destructors 729dba64beSDimitry Andric SymbolFileNativePDB(lldb::ObjectFileSP objfile_sp); 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric ~SymbolFileNativePDB() override; 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric uint32_t CalculateAbilities() override; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric void InitializeObject() override; 790b57cec5SDimitry Andric 80*0fca6ea1SDimitry Andric uint64_t GetDebugInfoSize(bool load_all_debug_info = false) override; 81349cc55cSDimitry Andric 820b57cec5SDimitry Andric // Compile Unit function calls 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric void 850b57cec5SDimitry Andric ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override; 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric lldb::LanguageType 880b57cec5SDimitry Andric ParseLanguage(lldb_private::CompileUnit &comp_unit) override; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override; 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit, 971db9f3b2SDimitry Andric SupportFileList &support_files) override; 980b57cec5SDimitry Andric size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric bool ParseImportedModules( 1010b57cec5SDimitry Andric const SymbolContext &sc, 1020b57cec5SDimitry Andric std::vector<lldb_private::SourceModule> &imported_modules) override; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric size_t ParseBlocksRecursive(Function &func) override; 1050b57cec5SDimitry Andric 1069dba64beSDimitry Andric void FindGlobalVariables(ConstString name, 1075ffd83dbSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1080b57cec5SDimitry Andric uint32_t max_matches, 1090b57cec5SDimitry Andric VariableList &variables) override; 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric size_t ParseVariablesForContext(const SymbolContext &sc) override; 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric void AddSymbols(Symtab &symtab) override; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; 1160b57cec5SDimitry Andric CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override; 1170b57cec5SDimitry Andric CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override; 1180b57cec5SDimitry Andric Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 119bdd1243dSDimitry Andric std::optional<ArrayInfo> GetDynamicArrayInfoForUID( 1200b57cec5SDimitry Andric lldb::user_id_t type_uid, 1210b57cec5SDimitry Andric const lldb_private::ExecutionContext *exe_ctx) override; 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric bool CompleteType(CompilerType &compiler_type) override; 1240b57cec5SDimitry Andric uint32_t ResolveSymbolContext(const Address &so_addr, 1250b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1260b57cec5SDimitry Andric SymbolContext &sc) override; 127fe6060f1SDimitry Andric uint32_t ResolveSymbolContext(const SourceLocationSpec &src_location_spec, 1280b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1290b57cec5SDimitry Andric SymbolContextList &sc_list) override; 1300b57cec5SDimitry Andric 1319dba64beSDimitry Andric void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, 1320b57cec5SDimitry Andric TypeList &type_list) override; 1330b57cec5SDimitry Andric 134bdd1243dSDimitry Andric void FindFunctions(const Module::LookupInfo &lookup_info, 1355ffd83dbSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1369dba64beSDimitry Andric bool include_inlines, SymbolContextList &sc_list) override; 1379dba64beSDimitry Andric 1389dba64beSDimitry Andric void FindFunctions(const RegularExpression ®ex, bool include_inlines, 1390b57cec5SDimitry Andric SymbolContextList &sc_list) override; 1400b57cec5SDimitry Andric 141bdd1243dSDimitry Andric std::optional<PdbCompilandSymId> FindSymbolScope(PdbCompilandSymId id); 142bdd1243dSDimitry Andric 1435f757f3fSDimitry Andric void FindTypes(const lldb_private::TypeQuery &match, 1445f757f3fSDimitry Andric lldb_private::TypeResults &results) override; 1450b57cec5SDimitry Andric 146bdd1243dSDimitry Andric llvm::Expected<lldb::TypeSystemSP> 1479dba64beSDimitry Andric GetTypeSystemForLanguage(lldb::LanguageType language) override; 1480b57cec5SDimitry Andric 14906c3fb27SDimitry Andric CompilerDeclContext FindNamespace(ConstString name, 15006c3fb27SDimitry Andric const CompilerDeclContext &parent_decl_ctx, 15106c3fb27SDimitry Andric bool only_root_namespaces) override; 1520b57cec5SDimitry Andric 153349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric llvm::pdb::PDBFile &GetPDBFile() { return m_index->pdb(); } 1560b57cec5SDimitry Andric const llvm::pdb::PDBFile &GetPDBFile() const { return m_index->pdb(); } 1570b57cec5SDimitry Andric 158bdd1243dSDimitry Andric PdbIndex &GetIndex() { return *m_index; }; 159bdd1243dSDimitry Andric 1600b57cec5SDimitry Andric void DumpClangAST(Stream &s) override; 1610b57cec5SDimitry Andric 162bdd1243dSDimitry Andric std::optional<llvm::codeview::TypeIndex> 163bdd1243dSDimitry Andric GetParentType(llvm::codeview::TypeIndex ti); 164bdd1243dSDimitry Andric 1650b57cec5SDimitry Andric private: 16604eeddc0SDimitry Andric struct LineTableEntryComparator { 16704eeddc0SDimitry Andric bool operator()(const lldb_private::LineTable::Entry &lhs, 16804eeddc0SDimitry Andric const lldb_private::LineTable::Entry &rhs) const { 16904eeddc0SDimitry Andric return lhs.file_addr < rhs.file_addr; 17004eeddc0SDimitry Andric } 17104eeddc0SDimitry Andric }; 17204eeddc0SDimitry Andric 17304eeddc0SDimitry Andric // From address range relative to function base to source line number. 17404eeddc0SDimitry Andric using RangeSourceLineVector = 17504eeddc0SDimitry Andric lldb_private::RangeDataVector<uint32_t, uint32_t, int32_t>; 17604eeddc0SDimitry Andric // InlineSite contains information in a S_INLINESITE record. 17704eeddc0SDimitry Andric struct InlineSite { 17804eeddc0SDimitry Andric PdbCompilandSymId parent_id; 17904eeddc0SDimitry Andric std::shared_ptr<InlineFunctionInfo> inline_function_info; 18004eeddc0SDimitry Andric RangeSourceLineVector ranges; 18104eeddc0SDimitry Andric std::vector<lldb_private::LineTable::Entry> line_entries; 18204eeddc0SDimitry Andric InlineSite(PdbCompilandSymId parent_id) : parent_id(parent_id){}; 18304eeddc0SDimitry Andric }; 18404eeddc0SDimitry Andric 185bdd1243dSDimitry Andric void BuildParentMap(); 186bdd1243dSDimitry Andric 1879dba64beSDimitry Andric uint32_t CalculateNumCompileUnits() override; 1880b57cec5SDimitry Andric 1899dba64beSDimitry Andric lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 1909dba64beSDimitry Andric 1919dba64beSDimitry Andric void FindTypesByName(llvm::StringRef name, uint32_t max_matches, 1920b57cec5SDimitry Andric TypeMap &types); 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric lldb::TypeSP CreateModifierType(PdbTypeSymId type_id, 1950b57cec5SDimitry Andric const llvm::codeview::ModifierRecord &mr, 1960b57cec5SDimitry Andric CompilerType ct); 1970b57cec5SDimitry Andric lldb::TypeSP CreatePointerType(PdbTypeSymId type_id, 1980b57cec5SDimitry Andric const llvm::codeview::PointerRecord &pr, 1990b57cec5SDimitry Andric CompilerType ct); 2000b57cec5SDimitry Andric lldb::TypeSP CreateSimpleType(llvm::codeview::TypeIndex ti, CompilerType ct); 2010b57cec5SDimitry Andric lldb::TypeSP CreateTagType(PdbTypeSymId type_id, 2020b57cec5SDimitry Andric const llvm::codeview::ClassRecord &cr, 2030b57cec5SDimitry Andric CompilerType ct); 2040b57cec5SDimitry Andric lldb::TypeSP CreateTagType(PdbTypeSymId type_id, 2050b57cec5SDimitry Andric const llvm::codeview::EnumRecord &er, 2060b57cec5SDimitry Andric CompilerType ct); 2070b57cec5SDimitry Andric lldb::TypeSP CreateTagType(PdbTypeSymId type_id, 2080b57cec5SDimitry Andric const llvm::codeview::UnionRecord &ur, 2090b57cec5SDimitry Andric CompilerType ct); 2100b57cec5SDimitry Andric lldb::TypeSP CreateArrayType(PdbTypeSymId type_id, 2110b57cec5SDimitry Andric const llvm::codeview::ArrayRecord &ar, 2120b57cec5SDimitry Andric CompilerType ct); 2130b57cec5SDimitry Andric lldb::TypeSP CreateFunctionType(PdbTypeSymId type_id, 2140b57cec5SDimitry Andric const llvm::codeview::MemberFunctionRecord &pr, 2150b57cec5SDimitry Andric CompilerType ct); 2160b57cec5SDimitry Andric lldb::TypeSP CreateProcedureType(PdbTypeSymId type_id, 2170b57cec5SDimitry Andric const llvm::codeview::ProcedureRecord &pr, 2180b57cec5SDimitry Andric CompilerType ct); 2190b57cec5SDimitry Andric lldb::TypeSP CreateClassStructUnion(PdbTypeSymId type_id, 2200b57cec5SDimitry Andric const llvm::codeview::TagRecord &record, 2210b57cec5SDimitry Andric size_t size, CompilerType ct); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric lldb::FunctionSP GetOrCreateFunction(PdbCompilandSymId func_id, 2240b57cec5SDimitry Andric CompileUnit &comp_unit); 2250b57cec5SDimitry Andric lldb::CompUnitSP GetOrCreateCompileUnit(const CompilandIndexItem &cci); 2260b57cec5SDimitry Andric lldb::TypeSP GetOrCreateType(PdbTypeSymId type_id); 2270b57cec5SDimitry Andric lldb::TypeSP GetOrCreateType(llvm::codeview::TypeIndex ti); 2280b57cec5SDimitry Andric lldb::VariableSP GetOrCreateGlobalVariable(PdbGlobalSymId var_id); 2290b57cec5SDimitry Andric Block &GetOrCreateBlock(PdbCompilandSymId block_id); 2300b57cec5SDimitry Andric lldb::VariableSP GetOrCreateLocalVariable(PdbCompilandSymId scope_id, 2310b57cec5SDimitry Andric PdbCompilandSymId var_id, 2320b57cec5SDimitry Andric bool is_param); 2330b57cec5SDimitry Andric lldb::TypeSP GetOrCreateTypedef(PdbGlobalSymId id); 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric lldb::FunctionSP CreateFunction(PdbCompilandSymId func_id, 2360b57cec5SDimitry Andric CompileUnit &comp_unit); 2370b57cec5SDimitry Andric Block &CreateBlock(PdbCompilandSymId block_id); 2380b57cec5SDimitry Andric lldb::VariableSP CreateLocalVariable(PdbCompilandSymId scope_id, 2390b57cec5SDimitry Andric PdbCompilandSymId var_id, bool is_param); 2400b57cec5SDimitry Andric lldb::TypeSP CreateTypedef(PdbGlobalSymId id); 2410b57cec5SDimitry Andric lldb::CompUnitSP CreateCompileUnit(const CompilandIndexItem &cci); 2420b57cec5SDimitry Andric lldb::TypeSP CreateType(PdbTypeSymId type_id, CompilerType ct); 2430b57cec5SDimitry Andric lldb::TypeSP CreateAndCacheType(PdbTypeSymId type_id); 2440b57cec5SDimitry Andric lldb::VariableSP CreateGlobalVariable(PdbGlobalSymId var_id); 2450b57cec5SDimitry Andric lldb::VariableSP CreateConstantSymbol(PdbGlobalSymId var_id, 2460b57cec5SDimitry Andric const llvm::codeview::CVSymbol &cvs); 2470b57cec5SDimitry Andric size_t ParseVariablesForCompileUnit(CompileUnit &comp_unit, 2480b57cec5SDimitry Andric VariableList &variables); 2490b57cec5SDimitry Andric size_t ParseVariablesForBlock(PdbCompilandSymId block_id); 2500b57cec5SDimitry Andric 25104eeddc0SDimitry Andric llvm::Expected<uint32_t> GetFileIndex(const CompilandIndexItem &cii, 25204eeddc0SDimitry Andric uint32_t file_id); 25304eeddc0SDimitry Andric 25404eeddc0SDimitry Andric size_t ParseSymbolArrayInScope( 25504eeddc0SDimitry Andric PdbCompilandSymId parent, 25604eeddc0SDimitry Andric llvm::function_ref<bool(llvm::codeview::SymbolKind, PdbCompilandSymId)> 25704eeddc0SDimitry Andric fn); 25804eeddc0SDimitry Andric 25904eeddc0SDimitry Andric void ParseInlineSite(PdbCompilandSymId inline_site_id, Address func_addr); 26004eeddc0SDimitry Andric 2610b57cec5SDimitry Andric llvm::BumpPtrAllocator m_allocator; 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andric lldb::addr_t m_obj_load_address = 0; 2640b57cec5SDimitry Andric bool m_done_full_type_scan = false; 265bdd1243dSDimitry Andric // UID for anonymous union and anonymous struct as they don't have entities in 266bdd1243dSDimitry Andric // pdb debug info. 267bdd1243dSDimitry Andric lldb::user_id_t anonymous_id = LLDB_INVALID_UID - 1; 2680b57cec5SDimitry Andric 269e8d8bef9SDimitry Andric std::unique_ptr<llvm::pdb::PDBFile> m_file_up; 2700b57cec5SDimitry Andric std::unique_ptr<PdbIndex> m_index; 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::VariableSP> m_global_vars; 2730b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::VariableSP> m_local_variables; 2740b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::BlockSP> m_blocks; 2750b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::FunctionSP> m_functions; 2760b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::CompUnitSP> m_compilands; 2770b57cec5SDimitry Andric llvm::DenseMap<lldb::user_id_t, lldb::TypeSP> m_types; 27804eeddc0SDimitry Andric llvm::DenseMap<lldb::user_id_t, std::shared_ptr<InlineSite>> m_inline_sites; 279bdd1243dSDimitry Andric llvm::DenseMap<llvm::codeview::TypeIndex, llvm::codeview::TypeIndex> 280bdd1243dSDimitry Andric m_parent_types; 2810b57cec5SDimitry Andric }; 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric } // namespace npdb 2840b57cec5SDimitry Andric } // namespace lldb_private 2850b57cec5SDimitry Andric 2865ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H 287