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/lldb-private.h" 16 #include "lldb/Core/ModuleChild.h" 17 #include "lldb/Core/PluginInterface.h" 18 #include "lldb/Symbol/ClangNamespaceDecl.h" 19 #include "lldb/Symbol/TypeList.h" 20 21 22 namespace 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 //---------------------------------------------------------------------- 34 class SymbolVendor : 35 public ModuleChild, 36 public PluginInterface 37 { 38 public: 39 static SymbolVendor* 40 FindPlugin (const lldb::ModuleSP &module_sp, 41 Stream *feedback_strm); 42 43 //------------------------------------------------------------------ 44 // Constructors and Destructors 45 //------------------------------------------------------------------ 46 SymbolVendor(const lldb::ModuleSP &module_sp); 47 48 virtual 49 ~SymbolVendor(); 50 51 void 52 AddSymbolFileRepresentation(const lldb::ObjectFileSP &objfile_sp); 53 54 virtual void 55 Dump(Stream *s); 56 57 virtual lldb::LanguageType 58 ParseCompileUnitLanguage (const SymbolContext& sc); 59 60 virtual size_t 61 ParseCompileUnitFunctions (const SymbolContext& sc); 62 63 virtual bool 64 ParseCompileUnitLineTable (const SymbolContext& sc); 65 66 virtual bool 67 ParseCompileUnitSupportFiles (const SymbolContext& sc, 68 FileSpecList& support_files); 69 70 virtual size_t 71 ParseFunctionBlocks (const SymbolContext& sc); 72 73 virtual size_t 74 ParseTypes (const SymbolContext& sc); 75 76 virtual size_t 77 ParseVariablesForContext (const SymbolContext& sc); 78 79 virtual Type* 80 ResolveTypeUID(lldb::user_id_t type_uid); 81 82 virtual uint32_t 83 ResolveSymbolContext (const Address& so_addr, 84 uint32_t resolve_scope, 85 SymbolContext& sc); 86 87 virtual uint32_t 88 ResolveSymbolContext (const FileSpec& file_spec, 89 uint32_t line, 90 bool check_inlines, 91 uint32_t resolve_scope, 92 SymbolContextList& sc_list); 93 94 virtual size_t 95 FindGlobalVariables (const ConstString &name, 96 const ClangNamespaceDecl *namespace_decl, 97 bool append, 98 size_t max_matches, 99 VariableList& variables); 100 101 virtual size_t 102 FindGlobalVariables (const RegularExpression& regex, 103 bool append, 104 size_t max_matches, 105 VariableList& variables); 106 107 virtual size_t 108 FindFunctions (const ConstString &name, 109 const ClangNamespaceDecl *namespace_decl, 110 uint32_t name_type_mask, 111 bool include_inlines, 112 bool append, 113 SymbolContextList& sc_list); 114 115 virtual size_t 116 FindFunctions (const RegularExpression& regex, 117 bool include_inlines, 118 bool append, 119 SymbolContextList& sc_list); 120 121 virtual size_t 122 FindTypes (const SymbolContext& sc, 123 const ConstString &name, 124 const ClangNamespaceDecl *namespace_decl, 125 bool append, 126 size_t max_matches, 127 TypeList& types); 128 129 virtual ClangNamespaceDecl 130 FindNamespace (const SymbolContext& sc, 131 const ConstString &name, 132 const ClangNamespaceDecl *parent_namespace_decl); 133 134 virtual size_t 135 GetNumCompileUnits(); 136 137 virtual bool 138 SetCompileUnitAtIndex (size_t cu_idx, 139 const lldb::CompUnitSP &cu_sp); 140 141 virtual lldb::CompUnitSP 142 GetCompileUnitAtIndex(size_t idx); 143 144 TypeList& GetTypeList()145 GetTypeList() 146 { 147 return m_type_list; 148 } 149 150 const TypeList& GetTypeList()151 GetTypeList() const 152 { 153 return m_type_list; 154 } 155 156 virtual size_t 157 GetTypes (SymbolContextScope *sc_scope, 158 uint32_t type_mask, 159 TypeList &type_list); 160 161 SymbolFile * GetSymbolFile()162 GetSymbolFile() 163 { 164 return m_sym_file_ap.get(); 165 } 166 167 // Get module unified section list symbol table. 168 virtual Symtab * 169 GetSymtab (); 170 171 // Clear module unified section list symbol table. 172 virtual void 173 ClearSymtab (); 174 175 //------------------------------------------------------------------ 176 // PluginInterface protocol 177 //------------------------------------------------------------------ 178 virtual ConstString 179 GetPluginName(); 180 181 virtual uint32_t 182 GetPluginVersion(); 183 184 protected: 185 //------------------------------------------------------------------ 186 // Classes that inherit from SymbolVendor can see and modify these 187 //------------------------------------------------------------------ 188 typedef std::vector<lldb::CompUnitSP> CompileUnits; 189 typedef CompileUnits::iterator CompileUnitIter; 190 typedef CompileUnits::const_iterator CompileUnitConstIter; 191 192 TypeList m_type_list; // Uniqued types for all parsers owned by this module 193 CompileUnits m_compile_units; // The current compile units 194 lldb::ObjectFileSP m_objfile_sp; // Keep a reference to the object file in case it isn't the same as the module object file (debug symbols in a separate file) 195 std::unique_ptr<SymbolFile> m_sym_file_ap; // A single symbol file. Subclasses can add more of these if needed. 196 197 private: 198 //------------------------------------------------------------------ 199 // For SymbolVendor only 200 //------------------------------------------------------------------ 201 DISALLOW_COPY_AND_ASSIGN (SymbolVendor); 202 }; 203 204 205 } // namespace lldb_private 206 207 #endif // liblldb_SymbolVendor_h_ 208