1 //===-- Symtab.h ------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #ifndef liblldb_Symtab_h_
12 #define liblldb_Symtab_h_
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"
22 namespace lldb_private {
27 typedef std::vector<uint32_t> IndexCollection;
28 typedef UniqueCStringMap<uint32_t> NameToIndexMap;
31 eDebugNo, // Not a debug symbol
32 eDebugYes, // A debug symbol
36 typedef enum Visibility {
42 Symtab(ObjectFile *objfile);
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 SectionFileAddressesChanged ();
50 void Dump(Stream *s, Target *target, SortOrder sort_type);
51 void Dump(Stream *s, Target *target, std::vector<uint32_t>& indexes) const;
52 uint32_t GetIndexForSymbol (const Symbol *symbol) const;
57 Symbol * FindSymbolByID (lldb::user_id_t uid) const;
58 Symbol * SymbolAtIndex (size_t idx);
59 const Symbol * SymbolAtIndex (size_t idx) const;
60 Symbol * FindSymbolWithType (lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, uint32_t &start_idx);
61 //----------------------------------------------------------------------
62 /// Get the parent symbol for the given symbol.
64 /// Many symbols in symbol tables are scoped by other symbols that
65 /// contain one or more symbol. This function will look for such a
66 /// containing symbol and return it if there is one.
67 //----------------------------------------------------------------------
68 const Symbol * GetParent (Symbol *symbol) const;
69 uint32_t AppendSymbolIndexesWithType (lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes, uint32_t start_idx = 0, uint32_t end_index = UINT32_MAX) const;
70 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;
71 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;
72 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, std::vector<uint32_t>& matches);
73 uint32_t AppendSymbolIndexesWithName (const ConstString& symbol_name, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches);
74 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, std::vector<uint32_t>& matches);
75 uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& matches);
76 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector<uint32_t>& indexes);
77 uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& indexes);
78 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, std::vector<uint32_t>& symbol_indexes);
79 size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes);
80 size_t FindAllSymbolsMatchingRexExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes);
81 Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility);
82 Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr, const uint32_t* indexes, uint32_t num_indexes);
83 Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr);
84 void ForEachSymbolContainingFileAddress(lldb::addr_t file_addr, std::function<bool(Symbol *)> const &callback);
85 size_t FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list);
86 void CalculateSymbolSizes ();
88 void SortSymbolIndexesByValue (std::vector<uint32_t>& indexes, bool remove_duplicates) const;
90 static void DumpSymbolHeader (Stream *s);
95 // Shrink to fit the symbols so we don't waste memory
96 if (m_symbols.capacity() > m_symbols.size())
98 collection new_symbols (m_symbols.begin(), m_symbols.end());
99 m_symbols.swap (new_symbols);
103 void AppendSymbolNamesToMap (const IndexCollection &indexes,
106 NameToIndexMap &name_to_index_map) const;
108 ObjectFile * GetObjectFile()
113 typedef std::vector<Symbol> collection;
114 typedef collection::iterator iterator;
115 typedef collection::const_iterator const_iterator;
116 typedef RangeDataVector<lldb::addr_t, lldb::addr_t, uint32_t> FileRangeToIndexMap;
117 void InitNameIndexes ();
118 void InitAddressIndexes ();
120 ObjectFile * m_objfile;
121 collection m_symbols;
122 FileRangeToIndexMap m_file_addr_to_index;
123 UniqueCStringMap<uint32_t> m_name_to_index;
124 UniqueCStringMap<uint32_t> m_basename_to_index;
125 UniqueCStringMap<uint32_t> m_method_to_index;
126 UniqueCStringMap<uint32_t> m_selector_to_index;
127 mutable Mutex m_mutex; // Provide thread safety for this symbol table
128 bool m_file_addr_to_index_computed:1,
129 m_name_indexes_computed:1;
133 CheckSymbolAtIndex (size_t idx, Debug symbol_debug_type, Visibility symbol_visibility) const
135 switch (symbol_debug_type)
138 if (m_symbols[idx].IsDebug() == true)
143 if (m_symbols[idx].IsDebug() == false)
151 switch (symbol_visibility)
156 case eVisibilityExtern:
157 return m_symbols[idx].IsExternal();
159 case eVisibilityPrivate:
160 return !m_symbols[idx].IsExternal();
166 SymbolIndicesToSymbolContextList (std::vector<uint32_t> &symbol_indexes,
167 SymbolContextList &sc_list);
169 DISALLOW_COPY_AND_ASSIGN (Symtab);
172 } // namespace lldb_private
174 #endif // liblldb_Symtab_h_