//===-- Symtab.h ------------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_Symtab_h_ #define liblldb_Symtab_h_ #include #include "lldb/lldb-private.h" #include "lldb/Core/RangeMap.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/Host/Mutex.h" #include "lldb/Symbol/Symbol.h" namespace lldb_private { class Symtab { public: typedef std::vector IndexCollection; typedef UniqueCStringMap NameToIndexMap; typedef enum Debug { eDebugNo, // Not a debug symbol eDebugYes, // A debug symbol eDebugAny } Debug; typedef enum Visibility { eVisibilityAny, eVisibilityExtern, eVisibilityPrivate } Visibility; Symtab(ObjectFile *objfile); ~Symtab(); void Reserve (size_t count); Symbol * Resize (size_t count); uint32_t AddSymbol(const Symbol& symbol); size_t GetNumSymbols() const; void Dump(Stream *s, Target *target, SortOrder sort_type); void Dump(Stream *s, Target *target, std::vector& indexes) const; uint32_t GetIndexForSymbol (const Symbol *symbol) const; Mutex & GetMutex () { return m_mutex; } Symbol * FindSymbolByID (lldb::user_id_t uid) const; Symbol * SymbolAtIndex (size_t idx); const Symbol * SymbolAtIndex (size_t idx) const; Symbol * FindSymbolWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, uint32_t &start_idx); uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, std::vector& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; uint32_t AppendSymbolIndexesWithTypeAndFlagsValue (lldb::SymbolType symbol_type, uint32_t flags_value, std::vector& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& matches, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const; uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, std::vector& matches); uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& matches); uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, std::vector& matches); uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& matches); uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector& indexes); uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& indexes); size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, std::vector& symbol_indexes); size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes); size_t FindAllSymbolsMatchingRexExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes); Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility); Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr, const uint32_t* indexes, uint32_t num_indexes); Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr); size_t FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list); void CalculateSymbolSizes (); void SortSymbolIndexesByValue (std::vector& indexes, bool remove_duplicates) const; static void DumpSymbolHeader (Stream *s); void Finalize () { // Shrink to fit the symbols so we don't waste memory if (m_symbols.capacity() > m_symbols.size()) { collection new_symbols (m_symbols.begin(), m_symbols.end()); m_symbols.swap (new_symbols); } } void AppendSymbolNamesToMap (const IndexCollection &indexes, bool add_demangled, bool add_mangled, NameToIndexMap &name_to_index_map) const; protected: typedef std::vector collection; typedef collection::iterator iterator; typedef collection::const_iterator const_iterator; typedef RangeDataVector FileRangeToIndexMap; void InitNameIndexes (); void InitAddressIndexes (); ObjectFile * m_objfile; collection m_symbols; FileRangeToIndexMap m_file_addr_to_index; UniqueCStringMap m_name_to_index; UniqueCStringMap m_basename_to_index; UniqueCStringMap m_method_to_index; UniqueCStringMap m_selector_to_index; mutable Mutex m_mutex; // Provide thread safety for this symbol table bool m_file_addr_to_index_computed:1, m_name_indexes_computed:1; private: bool CheckSymbolAtIndex (size_t idx, Debug symbol_debug_type, Visibility symbol_visibility) const { switch (symbol_debug_type) { case eDebugNo: if (m_symbols[idx].IsDebug() == true) return false; break; case eDebugYes: if (m_symbols[idx].IsDebug() == false) return false; break; case eDebugAny: break; } switch (symbol_visibility) { case eVisibilityAny: return true; case eVisibilityExtern: return m_symbols[idx].IsExternal(); case eVisibilityPrivate: return !m_symbols[idx].IsExternal(); } return false; } void SymbolIndicesToSymbolContextList (std::vector &symbol_indexes, SymbolContextList &sc_list); DISALLOW_COPY_AND_ASSIGN (Symtab); }; } // namespace lldb_private #endif // liblldb_Symtab_h_