What is this fixing and how can we write a test for it? On Sat, Jan 23, 2016 at 2:40 AM Mohit K. Bhakkad via lldb-commits < lldb-commits@lists.llvm.org> wrote:
> Author: mohit.bhakkad > Date: Sat Jan 23 04:36:06 2016 > New Revision: 258621 > > URL: http://llvm.org/viewvc/llvm-project?rev=258621&view=rev > Log: > [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 > > Modified: > lldb/trunk/include/lldb/Core/RangeMap.h > lldb/trunk/include/lldb/Symbol/Symtab.h > lldb/trunk/source/Core/Module.cpp > lldb/trunk/source/Symbol/Symtab.cpp > > Modified: lldb/trunk/include/lldb/Core/RangeMap.h > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/RangeMap.h?rev=258621&r1=258620&r2=258621&view=diff > > ============================================================================== > --- lldb/trunk/include/lldb/Core/RangeMap.h (original) > +++ lldb/trunk/include/lldb/Core/RangeMap.h Sat Jan 23 04:36:06 2016 > @@ -1216,6 +1216,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) > > Modified: lldb/trunk/include/lldb/Symbol/Symtab.h > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=258621&r1=258620&r2=258621&view=diff > > ============================================================================== > --- lldb/trunk/include/lldb/Symbol/Symtab.h (original) > +++ lldb/trunk/include/lldb/Symbol/Symtab.h Sat Jan 23 04:36:06 2016 > @@ -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 (); > > > Modified: lldb/trunk/source/Core/Module.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=258621&r1=258620&r2=258621&view=diff > > ============================================================================== > --- lldb/trunk/source/Core/Module.cpp (original) > +++ lldb/trunk/source/Core/Module.cpp Sat Jan 23 04:36:06 2016 > @@ -559,7 +559,16 @@ Module::ResolveSymbolContextForAddress ( > 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)) > { > > Modified: lldb/trunk/source/Symbol/Symtab.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symtab.cpp?rev=258621&r1=258620&r2=258621&view=diff > > ============================================================================== > --- lldb/trunk/source/Symbol/Symtab.cpp (original) > +++ lldb/trunk/source/Symbol/Symtab.cpp Sat Jan 23 04:36:06 2016 > @@ -1074,6 +1074,26 @@ Symtab::FindSymbolContainingFileAddress > } > > 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) > { > // No need to protect this call using m_mutex all other method calls > are > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits