You shouldn't have to do any of this. There should be a 1 to 1 mapping between 
a Module and a SymbolVendor which has a single SymbolFile. My guess is that you 
should just return:

kAllAbilities

for SymbolFilePDB::CalculateAbilities (). Try that and let me know how this 
goes. These abilities are bit fields and it becomes hard to compare the 
abilities returned from a symbol file if they don't match. 

To make sure you understand: for a given module, we should attempt to find a 
SymbolVendor/SymbolFile 1 time. We will iterate through all SymbolFile plugins 
and pick the one with the best abilities. SymbolFileSymtab might be returning a 
mask of things it can return that are greater than the one returned from 
SymbolFilePDB. So if you return kAllAbilities from 
SymbolFilePDB::CalculateAbilities() it will ensure that SymbolFilePDB is picked 
(make sure no one else is returning this) and your Module should have the same 
SymbolVendor/SymbolFile for the life of the lldb_private::Module. If that isn't 
happening that is a bug that you will need to fix. DWARF creates a single 
instance.

No need to do any fancy caching to any other work around.

Greg

> On Feb 29, 2016, at 1:26 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> I'm running into what I think is the final issue.  My SymbolFilePDB plugin 
> creates created many many times.  Specifically, every single call to 
> SymbolVendor::FindPlugin(module) will cause a brand new instance of 
> SymbolFilePDB to get created.  This effectively kills any caching I've got 
> going on, and causes the PDB to get parsed numerous times, but worse is an 
> actual bug since I have to be able to persist certain values across calls to 
> a plugin for the same executable.
> 
> Any thoughts how to solve this?  In this particular case that's failing, I'm 
> calling SymbolVendor::FindPlugin(module) to get the initial SymbolFile 
> plugin, then parsing some things, then calling I'm calling 
> LineTable::FindLineEntryByAddress().  This tries to grab the support files, 
> but it does so against a brand new instance of SymbolFilePDB, and it's 
> impossible for me to do the lookup this way, I need the same SymbolFilePDB 
> pointer that I created originally.
> 
> On Mon, Feb 29, 2016 at 10:40 AM Zachary Turner <ztur...@google.com> wrote:
> Thanks!  I think I've got a handle on it.  I'll upload another patch this 
> week hopefully.
> 
> On Mon, Feb 29, 2016 at 10:30 AM Greg Clayton <clayb...@gmail.com> wrote:
> 
> > On Feb 26, 2016, at 3:33 PM, Zachary Turner <ztur...@google.com> wrote:
> >
> > Ok, so back to check_inlines.  I realized after I hit send that the 
> > explanation I had written out is exactly what I thought I had to do for 
> > check_inlines == true.
> >
> > I guess a concrete example would make it clearer.  If I have this code:
> >
> > // foo.cpp
> > #include "foo.h"
> >
> > int main(int argc, char **argv) { return 0; }
> >
> >
> > And I run this C++ code:
> >
> > // After this, sc_list should have 1 entry.
> > ResolveSymbolContext("foo.h", 0, true, eSymbolContextCompUnit, sc_list);
> >
> 
> 1 entry yes.
> 
> > // After this, sc_list should have how many entries?  1 or 0?
> > ResolveSymbolContext("foo.h", 0, false, eSymbolContextCompUnit, sc_list);
> 
> 0 entries unless you actually have a compile unit for "foo.h" where "foo.h" 
> _is_ the main compile unit file.
> 
> > how many entries are in sc_list after the second call?  If it's still 1, 
> > then what is the difference with the first case?
> >
> > Is the only difference what I put into the line tables?  In the 'true' 
> > case, I fill out the line tables with all the contributions from foo.h, but 
> > in the 'false' case I don't?  But both still return the same number of 
> > entries in sc_list?
> 
> No. You fill in a SymbolContext for each line entry that matches. If 
> check_inlines is true, you through the line table for your compile unit 
> (where "foo.cpp" is your compile unit's main source file) and search for all 
> line entries that match regardless of if "foo.h" == compile unit file 
> ("foo.cpp"). If check_inlines is false, then you _only_ look through the line 
> table if the file matches your compile unit file (in this case "foo.h" != 
> "foo.cpp" so you wouldn't look at _any_ line entries in "foo.cpp".
> 
> > (Sorry this is so confusing, I'm planning to document this process as I go 
> > so that the next person that comes along will be able to have all this 
> > information up front)
> 
> This option should almost be removed and we should assume "check_inlines == 
> true" all the time. It can save time sometimes, but the user really always 
> wants "check_inlines == true".
> 
> Greg
> 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to