forked from OSchip/llvm-project
[LLDB] Consider only valid symbols while resolving by address
Reviewers: clayborg. Subscribers: jaydeep, bhushan, sagar, nitesh.jain, lldb-commits. Differential Revision: http://reviews.llvm.org/D16397 llvm-svn: 258621
This commit is contained in:
parent
dd5e9d2159
commit
0d9dd7df60
|
@ -1217,6 +1217,25 @@ namespace lldb_private {
|
|||
return UINT32_MAX;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
FindEntryIndexesThatContains (B addr, std::vector<uint32_t> &indexes) const
|
||||
{
|
||||
#ifdef ASSERT_RANGEMAP_ARE_SORTED
|
||||
assert (IsSorted());
|
||||
#endif
|
||||
|
||||
if (!m_entries.empty())
|
||||
{
|
||||
typename Collection::const_iterator pos;
|
||||
for(pos = m_entries.begin(); pos != m_entries.end(); pos++)
|
||||
{
|
||||
if (pos->Contains(addr))
|
||||
indexes.push_back (pos->data);
|
||||
}
|
||||
}
|
||||
return indexes.size() ;
|
||||
}
|
||||
|
||||
Entry *
|
||||
FindEntryThatContains (B addr)
|
||||
{
|
||||
|
|
|
@ -81,6 +81,7 @@ public:
|
|||
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);
|
||||
void ForEachSymbolContainingFileAddresss (lldb::addr_t file_addr, std::function <bool(Symbol *)> const &callback);
|
||||
size_t FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list);
|
||||
void CalculateSymbolSizes ();
|
||||
|
||||
|
|
|
@ -559,7 +559,16 @@ Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve
|
|||
Symtab *symtab = sym_vendor->GetSymtab();
|
||||
if (symtab && so_addr.IsSectionOffset())
|
||||
{
|
||||
sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
|
||||
Symbol *matching_symbol = nullptr;
|
||||
symtab->ForEachSymbolContainingFileAddresss (so_addr.GetFileAddress(), [&matching_symbol](Symbol *symbol) -> bool {
|
||||
if (symbol->GetType() != eSymbolTypeInvalid)
|
||||
{
|
||||
matching_symbol = symbol;
|
||||
return false; // Stop iterating
|
||||
}
|
||||
return true; // Keep iterating
|
||||
});
|
||||
sc.symbol = matching_symbol;
|
||||
if (!sc.symbol &&
|
||||
resolve_scope & eSymbolContextFunction && !(resolved_flags & eSymbolContextFunction))
|
||||
{
|
||||
|
|
|
@ -1073,6 +1073,26 @@ Symtab::FindSymbolContainingFileAddress (addr_t file_addr)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
Symtab::ForEachSymbolContainingFileAddresss (addr_t file_addr, std::function <bool(Symbol *)> const &callback)
|
||||
{
|
||||
Mutex::Locker locker (m_mutex);
|
||||
|
||||
if (!m_file_addr_to_index_computed)
|
||||
InitAddressIndexes();
|
||||
|
||||
std::vector<uint32_t> all_addr_indexes;
|
||||
|
||||
// Get all symbols with file_addr
|
||||
const size_t addr_match_count = m_file_addr_to_index.FindEntryIndexesThatContains(file_addr, all_addr_indexes);
|
||||
|
||||
for (size_t i=0; i<addr_match_count; ++i)
|
||||
{
|
||||
if (!callback(SymbolAtIndex(all_addr_indexes[i])))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Symtab::SymbolIndicesToSymbolContextList (std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue