[lldb-dev] enumerating the SBTypes from an SBModule

Greg Clayton gclayton at apple.com
Mon Jun 17 18:14:29 PDT 2013


On Jun 17, 2013, at 6:04 PM, Sebastien Metrot <meeloo at gmail.com> wrote:

> 
> On Jun 17, 2013, at 20:16 , Greg Clayton <gclayton at apple.com> wrote:
> 
>> Types are parsed lazily in modules so you will only get what types have been parsed up to the time you make the function call. My issue with trying to enumerate types in a module are:
>> 1 - it isn't always easy to ask a large DWARF object "get me the number of unique types you contain". Often DWARF has duplicate type info that we realize can be coalesced when we parse a type.
>> 2 - it is hard to force each symbol file parser to support "get type at index"
>> 
> 
> 
> Watching the result I got made me realise that (some obscure duplicates).
> 
> 
>> The best we can probably do is to add a
>> 
>> SBTypeList
>> SBModule::GetAllTypes()
>> 
>> Then lldb_private::SymbolVendor and lldb_private::SymboFile would need to have a new virtual functions added to them:
>> 
>> 
>> virtual size_t
>> lldb_private::SymbolVendor::GetAllTypes(lldb_private::TypeList &type_list);
>> 
>> virtual size_t
>> lldb_private::SymboFile::GetAllTypes(lldb_private::TypeList &type_list);
>> 
> 
> Ok. Adding new method was the easy part :-).
> 
>> 
>> Then each symbol file parser would be responsible for parsing all types and returning a uniqued type list.
>> 
>> As for the performance issue you solved with your std::vector, I would change this patch to do the following:
>> 
>> 1 - modify lldb_private::TypeListImpl to have a new Append function that takes a "const lldb_private::TypeList &type_list". You then might need to add a function to lldb_private::TypeList like:
>> 
>> void
>> lldb_private::TypeList (std::function <bool(lldb::TypeSP &type_sp)> const &callback);
>> 
>> We use this trick in the "BreakpointSiteList::ForEach" to provide an efficient way to iterate over a collection. An example of using a lambda function to iterate over the breakpoint site list can be seen in Process::DisableAllBreakpointSites(). The bool return value for the callback function indicates whether to continue iterating over the list.
>> 
> 
> I did that but don't I need to change SBTypeList to add some way to construct it from an existing TypeListImpl (or to access its TypeListImpl member? Or at least make SBModule a friend of SBTypeList?
> 
>> The trickiest part of this will be the SymbolFileDWARF::GetAllTypes(). If you need help with this let me know.
>> 
> 
> Ok, indeed that's the scary part for a newbie. What is the best place to look in order to get some ideas of how to implement that?

Send a patch with this function hollowed out and I will fill it in for you.

> 
> Many thanks for your very helpful answers again!
> 
> S.
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev




More information about the lldb-dev mailing list