SymbolVendor.h revision 314564
1//===-- SymbolVendor.h ------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_SymbolVendor_h_ 11#define liblldb_SymbolVendor_h_ 12 13#include <vector> 14 15#include "lldb/Core/ModuleChild.h" 16#include "lldb/Core/PluginInterface.h" 17#include "lldb/Symbol/TypeList.h" 18#include "lldb/Symbol/TypeMap.h" 19#include "lldb/lldb-private.h" 20#include "llvm/ADT/DenseSet.h" 21 22namespace lldb_private { 23 24//---------------------------------------------------------------------- 25// The symbol vendor class is designed to abstract the process of 26// searching for debug information for a given module. Platforms can 27// subclass this class and provide extra ways to find debug information. 28// Examples would be a subclass that would allow for locating a stand 29// alone debug file, parsing debug maps, or runtime data in the object 30// files. A symbol vendor can use multiple sources (SymbolFile 31// objects) to provide the information and only parse as deep as needed 32// in order to provide the information that is requested. 33//---------------------------------------------------------------------- 34class SymbolVendor : public ModuleChild, public PluginInterface { 35public: 36 static SymbolVendor *FindPlugin(const lldb::ModuleSP &module_sp, 37 Stream *feedback_strm); 38 39 //------------------------------------------------------------------ 40 // Constructors and Destructors 41 //------------------------------------------------------------------ 42 SymbolVendor(const lldb::ModuleSP &module_sp); 43 44 ~SymbolVendor() override; 45 46 void AddSymbolFileRepresentation(const lldb::ObjectFileSP &objfile_sp); 47 48 virtual void Dump(Stream *s); 49 50 virtual lldb::LanguageType ParseCompileUnitLanguage(const SymbolContext &sc); 51 52 virtual size_t ParseCompileUnitFunctions(const SymbolContext &sc); 53 54 virtual bool ParseCompileUnitLineTable(const SymbolContext &sc); 55 56 virtual bool ParseCompileUnitDebugMacros(const SymbolContext &sc); 57 58 virtual bool ParseCompileUnitSupportFiles(const SymbolContext &sc, 59 FileSpecList &support_files); 60 61 virtual bool ParseCompileUnitIsOptimized(const SymbolContext &sc); 62 63 virtual bool ParseImportedModules(const SymbolContext &sc, 64 std::vector<ConstString> &imported_modules); 65 66 virtual size_t ParseFunctionBlocks(const SymbolContext &sc); 67 68 virtual size_t ParseTypes(const SymbolContext &sc); 69 70 virtual size_t ParseVariablesForContext(const SymbolContext &sc); 71 72 virtual Type *ResolveTypeUID(lldb::user_id_t type_uid); 73 74 virtual uint32_t ResolveSymbolContext(const Address &so_addr, 75 uint32_t resolve_scope, 76 SymbolContext &sc); 77 78 virtual uint32_t ResolveSymbolContext(const FileSpec &file_spec, 79 uint32_t line, bool check_inlines, 80 uint32_t resolve_scope, 81 SymbolContextList &sc_list); 82 83 virtual size_t FindGlobalVariables(const ConstString &name, 84 const CompilerDeclContext *parent_decl_ctx, 85 bool append, size_t max_matches, 86 VariableList &variables); 87 88 virtual size_t FindGlobalVariables(const RegularExpression ®ex, 89 bool append, size_t max_matches, 90 VariableList &variables); 91 92 virtual size_t FindFunctions(const ConstString &name, 93 const CompilerDeclContext *parent_decl_ctx, 94 uint32_t name_type_mask, bool include_inlines, 95 bool append, SymbolContextList &sc_list); 96 97 virtual size_t FindFunctions(const RegularExpression ®ex, 98 bool include_inlines, bool append, 99 SymbolContextList &sc_list); 100 101 virtual size_t 102 FindTypes(const SymbolContext &sc, const ConstString &name, 103 const CompilerDeclContext *parent_decl_ctx, bool append, 104 size_t max_matches, 105 llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, 106 TypeMap &types); 107 108 virtual size_t FindTypes(const std::vector<CompilerContext> &context, 109 bool append, TypeMap &types); 110 111 virtual CompilerDeclContext 112 FindNamespace(const SymbolContext &sc, const ConstString &name, 113 const CompilerDeclContext *parent_decl_ctx); 114 115 virtual size_t GetNumCompileUnits(); 116 117 virtual bool SetCompileUnitAtIndex(size_t cu_idx, 118 const lldb::CompUnitSP &cu_sp); 119 120 virtual lldb::CompUnitSP GetCompileUnitAtIndex(size_t idx); 121 122 TypeList &GetTypeList() { return m_type_list; } 123 124 const TypeList &GetTypeList() const { return m_type_list; } 125 126 virtual size_t GetTypes(SymbolContextScope *sc_scope, uint32_t type_mask, 127 TypeList &type_list); 128 129 SymbolFile *GetSymbolFile() { return m_sym_file_ap.get(); } 130 131 FileSpec GetMainFileSpec() const; 132 133 // Get module unified section list symbol table. 134 virtual Symtab *GetSymtab(); 135 136 // Clear module unified section list symbol table. 137 virtual void ClearSymtab(); 138 139 //------------------------------------------------------------------ 140 /// Notify the SymbolVendor that the file addresses in the Sections 141 /// for this module have been changed. 142 //------------------------------------------------------------------ 143 virtual void SectionFileAddressesChanged(); 144 145 //------------------------------------------------------------------ 146 // PluginInterface protocol 147 //------------------------------------------------------------------ 148 ConstString GetPluginName() override; 149 150 uint32_t GetPluginVersion() override; 151 152protected: 153 //------------------------------------------------------------------ 154 // Classes that inherit from SymbolVendor can see and modify these 155 //------------------------------------------------------------------ 156 typedef std::vector<lldb::CompUnitSP> CompileUnits; 157 typedef CompileUnits::iterator CompileUnitIter; 158 typedef CompileUnits::const_iterator CompileUnitConstIter; 159 160 TypeList m_type_list; // Uniqued types for all parsers owned by this module 161 CompileUnits m_compile_units; // The current compile units 162 lldb::ObjectFileSP m_objfile_sp; // Keep a reference to the object file in 163 // case it isn't the same as the module 164 // object file (debug symbols in a separate 165 // file) 166 std::unique_ptr<SymbolFile> m_sym_file_ap; // A single symbol file. Subclasses 167 // can add more of these if needed. 168 169private: 170 //------------------------------------------------------------------ 171 // For SymbolVendor only 172 //------------------------------------------------------------------ 173 DISALLOW_COPY_AND_ASSIGN(SymbolVendor); 174}; 175 176} // namespace lldb_private 177 178#endif // liblldb_SymbolVendor_h_ 179