<div dir="ltr"><div>Those are addresses.  Here's the situation I was encountering this on:</div><div><br></div><div>// foo.h</div><div>#include "bar.h"</div><div>inline int f(int n)</div><div>{</div><div>    return g(n) + 1;</div><div>}</div><div><br></div><div>// bar.h</div><div>inline int g(int n)</div><div>{</div><div>    return n+1;</div><div>}</div><div><br></div><div>// foo.cpp</div><div>#include "foo.h"</div><div>int main(int argc, char** argv)</div><div>{</div><div>    return f(argc);</div><div>}</div><div><br></div>PDB gives me back line numbers and address range grouped by file.  So I get all of foo.h's lines, all of bar.h's lines, and all of foo.cpp's lines.  In sorted form, the lines for g will appear inside the sequence of lines for f.  So that's how the situation was arising.<div><br></div><div>I'll upload a patch tomorrow morning, and along with it a test (which is how I found this to begin with).  If you look at the test you will see the exact source code and the line / address sequences that are generated.</div><div><br></div><div>I think I have everything working, and I wrote some test cases to validate my assumptions.  Which is good because every test was broken at first, so I wouldn't have been able to fix things without them.  They shoudl also help verify that my assumptions are correct to begin with, which hopefully makes reviewing easier.</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Feb 29, 2016 at 5:29 PM Greg Clayton <<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
> On Feb 29, 2016, at 5:09 PM, Zachary Turner <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>> wrote:<br>
><br>
> Suppose you've got two line sequences.<br>
><br>
> First sequence:<br>
> 4198512<br>
> 4198544<br>
> 4198547<br>
> 4198562<br>
><br>
> Second sequence:<br>
> 4198528<br>
> 4198531<br>
> 4198537<br>
> 4198552<br>
><br>
> These two line sequences overlap, and will not be inserted correctly into a LineTable.  This sounds like a bug to me, because as far as I can tell there is nothing preventing LineSequences being organized this way, but LineTable::InsertSequence assumes that this cannot happen.<br>
<br>
Are these addresses or line numbers? If PDB can has its line tables randomly ordered, you will need to read all line entries out of the PDB file first into one big collection of all line entries, and remember if any are line termination entries and then make sequences out of the large collection you end up with.<br>
<br>
We only expect to get one line entry for a given load address and I believe that is reasonable. The registration process for line entries is very DWARF centric right now, but I think that the end goal if having line table sequences in ascending order that have a single file and line for a given load address is a valid assumption.<br>
<br>
So it sounds like you just need to read all of your stuff into one large buffer and then figure out how you want to register those sequences so they make sense.<br>
<br>
In DWARF if you have a line tables like:<br>
<br>
0x1000: foo.c line 1<br>
0x1010: foo.c line 2<br>
0x1030: foo.c line 3<br>
0x1040: termination entry<br>
<br>
0x2000: foo.c line 11<br>
0x2010: foo.c line 12<br>
0x2020: foo.c line 13<br>
0x2050: termination entry<br>
<br>
These are both sequences that define address ranges and we always know the address range of each line entry because the last entry in a contiguous line sequence always has a last entry to define the size of the last valid (non termination entry) line entry.<br>
<br>
How does the PDB file format emit it line table entries? Would it be equivalent to the DWARF with no termination entries? Something like:<br>
<br>
0x1000: foo.c line 1<br>
0x1010: foo.c line 2<br>
0x1030: foo.c line 3<br>
<br>
0x2000: foo.c line 11<br>
0x2010: foo.c line 12<br>
0x2020: foo.c line 13<br>
<br>
If that is the case, how do you deal with large gaps like the gap between 0x1040 and 0x2000?<br>
<br>
And if I read what you are saying correctly you are saying your line tables might come out like:<br>
<br>
0x1000: foo.c line 1<br>
0x2000: foo.c line 11<br>
0x1010: foo.c line 2<br>
0x2010: foo.c line 12<br>
0x1030: foo.c line 3<br>
0x2020: foo.c line 13<br>
<br>
Questions:<br>
<br>
- Does PDB emit ranges for each line or just a single address?<br>
- Does PDB have termination entries for the equivalent of address 0x1040 and 0x2050?<br>
<br>
</blockquote></div>