Symtab.h revision 296b06d325413723f5aac5988eed977b278a7807
1//===-- Symtab.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 11#ifndef liblldb_Symtab_h_ 12#define liblldb_Symtab_h_ 13 14#include <vector> 15 16#include "lldb/lldb-private.h" 17#include "lldb/Core/UniqueCStringMap.h" 18#include "lldb/Host/Mutex.h" 19#include "lldb/Symbol/Symbol.h" 20 21namespace lldb_private { 22 23class Symtab 24{ 25public: 26 typedef std::vector<uint32_t> IndexCollection; 27 typedef UniqueCStringMap<uint32_t> NameToIndexMap; 28 29 typedef enum Debug { 30 eDebugNo, // Not a debug symbol 31 eDebugYes, // A debug symbol 32 eDebugAny 33 } Debug; 34 35 typedef enum Visibility { 36 eVisibilityAny, 37 eVisibilityExtern, 38 eVisibilityPrivate 39 } Visibility; 40 41 Symtab(ObjectFile *objfile); 42 ~Symtab(); 43 44 void Reserve (size_t count); 45 Symbol * Resize (size_t count); 46 uint32_t AddSymbol(const Symbol& symbol); 47 size_t GetNumSymbols() const; 48 void Dump(Stream *s, Target *target, SortOrder sort_type); 49 void Dump(Stream *s, Target *target, std::vector<uint32_t>& indexes) const; 50 uint32_t GetIndexForSymbol (const Symbol *symbol) const; 51 Mutex & GetMutex () 52 { 53 return m_mutex; 54 } 55 Symbol * FindSymbolByID (lldb::user_id_t uid) const; 56 Symbol * SymbolAtIndex (size_t idx); 57 const Symbol * SymbolAtIndex (size_t idx) const; 58 Symbol * FindSymbolWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, uint32_t &start_idx); 59 uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; 60 uint32_t AppendSymbolIndexesWithTypeAndFlagsValue (lldb::SymbolType symbol_type, uint32_t flags_value, std::vector<uint32_t>& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; 61 uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; 62 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, std::vector<uint32_t>& matches); 63 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches); 64 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, std::vector<uint32_t>& matches); 65 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches); 66 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes); 67 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& indexes); 68 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, std::vector<uint32_t>& symbol_indexes); 69 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes); 70 size_t FindAllSymbolsMatchingRexExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes); 71 Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility); 72 Symbol * FindSymbolWithFileAddress (lldb::addr_t file_addr); 73 Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr, const uint32_t* indexes, uint32_t num_indexes); 74 Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr); 75 size_t FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list); 76 size_t CalculateSymbolSize (Symbol *symbol); 77 78 void SortSymbolIndexesByValue (std::vector<uint32_t>& indexes, bool remove_duplicates) const; 79 80 static void DumpSymbolHeader (Stream *s); 81 82 83 void Finalize () 84 { 85 // Shrink to fit the symbols so we don't waste memory 86 if (m_symbols.capacity() > m_symbols.size()) 87 { 88 collection new_symbols (m_symbols.begin(), m_symbols.end()); 89 m_symbols.swap (new_symbols); 90 } 91 } 92 93 void AppendSymbolNamesToMap (const IndexCollection &indexes, 94 bool add_demangled, 95 bool add_mangled, 96 NameToIndexMap &name_to_index_map) const; 97 98protected: 99 typedef std::vector<Symbol> collection; 100 typedef collection::iterator iterator; 101 typedef collection::const_iterator const_iterator; 102 103 void InitNameIndexes (); 104 void InitAddressIndexes (); 105 106 ObjectFile * m_objfile; 107 collection m_symbols; 108 std::vector<uint32_t> m_addr_indexes; 109 UniqueCStringMap<uint32_t> m_name_to_index; 110 UniqueCStringMap<uint32_t> m_basename_to_index; 111 UniqueCStringMap<uint32_t> m_method_to_index; 112 UniqueCStringMap<uint32_t> m_selector_to_index; 113 mutable Mutex m_mutex; // Provide thread safety for this symbol table 114 bool m_addr_indexes_computed:1, 115 m_name_indexes_computed:1; 116private: 117 118 bool 119 CheckSymbolAtIndex (size_t idx, Debug symbol_debug_type, Visibility symbol_visibility) const 120 { 121 switch (symbol_debug_type) 122 { 123 case eDebugNo: 124 if (m_symbols[idx].IsDebug() == true) 125 return false; 126 break; 127 128 case eDebugYes: 129 if (m_symbols[idx].IsDebug() == false) 130 return false; 131 break; 132 133 case eDebugAny: 134 break; 135 } 136 137 switch (symbol_visibility) 138 { 139 case eVisibilityAny: 140 return true; 141 142 case eVisibilityExtern: 143 return m_symbols[idx].IsExternal(); 144 145 case eVisibilityPrivate: 146 return !m_symbols[idx].IsExternal(); 147 } 148 return false; 149 } 150 151 void 152 SymbolIndicesToSymbolContextList (std::vector<uint32_t> &symbol_indexes, 153 SymbolContextList &sc_list); 154 155 DISALLOW_COPY_AND_ASSIGN (Symtab); 156}; 157 158} // namespace lldb_private 159 160#endif // liblldb_Symtab_h_ 161