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/RangeMap.h" 18 #include "lldb/Core/UniqueCStringMap.h" 19 #include "lldb/Host/Mutex.h" 20 #include "lldb/Symbol/Symbol.h" 21 22 namespace lldb_private { 23 24 class Symtab 25 { 26 public: 27 typedef std::vector<uint32_t> IndexCollection; 28 typedef UniqueCStringMap<uint32_t> NameToIndexMap; 29 30 typedef enum Debug { 31 eDebugNo, // Not a debug symbol 32 eDebugYes, // A debug symbol 33 eDebugAny 34 } Debug; 35 36 typedef enum Visibility { 37 eVisibilityAny, 38 eVisibilityExtern, 39 eVisibilityPrivate 40 } Visibility; 41 42 Symtab(ObjectFile *objfile); 43 ~Symtab(); 44 45 void Reserve (size_t count); 46 Symbol * Resize (size_t count); 47 uint32_t AddSymbol(const Symbol& symbol); 48 size_t GetNumSymbols() const; 49 void Dump(Stream *s, Target *target, SortOrder sort_type); 50 void Dump(Stream *s, Target *target, std::vector<uint32_t>& indexes) const; 51 uint32_t GetIndexForSymbol (const Symbol *symbol) const; 52 Mutex & GetMutex () 53 { 54 return m_mutex; 55 } 56 Symbol * FindSymbolByID (lldb::user_id_t uid) const; 57 Symbol * SymbolAtIndex (size_t idx); 58 const Symbol * SymbolAtIndex (size_t idx) const; 59 Symbol * FindSymbolWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, uint32_t &start_idx); 60 uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; 61 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; 62 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; 63 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, std::vector<uint32_t>& matches); 64 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches); 65 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, std::vector<uint32_t>& matches); 66 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches); 67 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes); 68 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& indexes); 69 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, std::vector<uint32_t>& symbol_indexes); 70 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes); 71 size_t FindAllSymbolsMatchingRexExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes); 72 Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility); 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 void CalculateSymbolSizes (); 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 98 protected: 99 typedef std::vector<Symbol> collection; 100 typedef collection::iterator iterator; 101 typedef collection::const_iterator const_iterator; 102 typedef RangeDataVector<lldb::addr_t, lldb::addr_t, uint32_t> FileRangeToIndexMap; 103 void InitNameIndexes (); 104 void InitAddressIndexes (); 105 106 ObjectFile * m_objfile; 107 collection m_symbols; 108 FileRangeToIndexMap m_file_addr_to_index; 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_file_addr_to_index_computed:1, 115 m_name_indexes_computed:1; 116 private: 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