I talked with Greg about this before I posted the suggestion below, and having 
the LineEntry contain both mapped and unmapped FileSpec's was his suggestion... 
 But who knows what changes of heart a weekend might bring.

Jim

> On May 9, 2016, at 9:43 AM, Ted Woodward <ted.woodw...@codeaurora.org> wrote:
> 
> I'll defer to Greg on remapping FileSpecs in SymbolContexts - he's the one 
> who added it, in r168845:
> 
> commit 214d2a327feb2e5987d093c2b63c457ffbd1d677
> Author: Greg Clayton <gclay...@apple.com>
> Date:   Thu Nov 29 00:53:06 2012 +0000
> 
>    <rdar://problem/12445557>
> 
>    Make stack frames fix up their line table entries when the target has 
> source remappings. Also rearranged how the m_sc.target_sp was filled in so it 
> can be used during the StackFrame::GetSymbolContext(...) function.
> 
> 
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?r1=168845&r2=168844&pathrev=168845
> 
> --
> Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
> Linux Foundation Collaborative Project
> 
> 
> -----Original Message-----
> From: jing...@apple.com [mailto:jing...@apple.com] 
> Sent: Friday, May 06, 2016 6:01 PM
> To: Ted Woodward <ted.woodw...@codeaurora.org>
> Cc: LLDB <lldb-dev@lists.llvm.org>
> Subject: Re: [lldb-dev] Bug with ThreadPlanStepRange::InRange, symbol context 
> and target.source-map setting
> 
> Another alternative would be to make the LineEntry hold both the remapped & 
> original file spec, and add an API to get the "original FileSpec".  Then 
> anybody who is holding onto a line entry or file spec derived therefrom will 
> know to compare the original file spec, since the remapped one is unreliable. 
>  Probably should move the remapping to the LineEntry 
> (LineEntry::ApplyFileMappings(Target &target) so it is clear who is in charge 
> of this.  
> 
> Note, you absolutely should never use SourceMaps to remap FileSpecs that are 
> in the module's debug information, since these modules are shared among all 
> the Debugger's, and the Debuggers could have different SourceMaps.  So by 
> putting this explicitly in the LineEntry - which is not something we use to 
> store line information, it's just something we cons up to hand out when 
> requested - it might make that requirement clearer.
> 
> Jim
> 
> 
>> On May 6, 2016, at 3:49 PM, Jim Ingham via lldb-dev 
>> <lldb-dev@lists.llvm.org> wrote:
>> 
>> Why are we remapping the FileSpecs in SymbolContext's we are handing out?  
>> That seems to me a bad idea.  It means that every time I want to do a 
>> FileSpec compare between the LineEntry FileSpec's that I get at from stack 
>> frames at two different times, I have to remember to re-apply the SourceMap 
>> to the file spec I've stored away before doing the compare.  After all, the 
>> user might have changed the source map and thus the file spec we are handing 
>> out.  That seems very error prone.  And we can't handle that in the FileSpec 
>> "==" operator because FileSpec's don't have Targets, so they have no way of 
>> getting to the map.  
>> 
>> Wouldn't it be better to use the source maps when we print filenames and 
>> look for actual source files, and leave the symbol context FileSpec's in 
>> some canonical form we know won't change over time?
>> 
>> Jim
>> 
>> 
>>> On May 6, 2016, at 3:05 PM, Ted Woodward <ted.woodw...@codeaurora.org> 
>>> wrote:
>>> 
>>> Symbols are being remapped. StackFrame::GetSymbolContext does this:
>>> 
>>>                  m_sc.line_entry = sc.line_entry;
>>>                  if (m_sc.target_sp)
>>>                  {
>>>                      // Be sure to apply and file remappings to our file 
>>> and line
>>>                      // entries when handing out a line entry
>>>                      FileSpec new_file_spec;
>>>                      if (m_sc.target_sp->GetSourcePathMap().FindFile 
>>> (m_sc.line_entry.file, new_file_spec))
>>>                          m_sc.line_entry.file = new_file_spec;
>>>                  }
>>> 
>>> This code gets called if the StackFrame ctor is called with the 
>>> SymbolContext = nullptr, but this is skipped if the SymbolContext is valid. 
>>> All new StackFrames in StackFrameList are done with a null SC, except for 
>>> an inlined frame. In that case, StackFrameList::GetFramesUpTo calls 
>>> SymbolContext::GetParentOfInlinedScope, which sets the SC, and 
>>> GetFramesUpTo does not remap it like StackFrame::GetSymbolContext does. 
>>> Then it creates a new StackFrame with the SC.
>>> 
>>> Adding this before the new StackFrame fixes the issue:
>>>                  if (target_sp)
>>>                  {
>>>                      // Be sure to apply and file remappings to our file 
>>> and line
>>>                      // entries when handing out a line entry
>>>                      FileSpec new_file_spec;
>>>                      if 
>>> (target_sp->GetSourcePathMap().FindFile(next_frame_sc.line_entry.file, 
>>> new_file_spec))
>>>                          next_frame_sc.line_entry.file = new_file_spec;
>>>                  }
>>> 
>>> I've put up a patch on Phabricator with Jim as reviewer.
>>> 
>>> --
>>> Qualcomm Innovation Center, Inc.
>>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
>>> Linux Foundation Collaborative Project
>>> 
>>> 
>>> -----Original Message-----
>>> From: jing...@apple.com [mailto:jing...@apple.com] 
>>> Sent: Friday, May 06, 2016 2:41 PM
>>> To: Ted Woodward <ted.woodw...@codeaurora.org>
>>> Cc: LLDB <lldb-dev@lists.llvm.org>
>>> Subject: Re: [lldb-dev] Bug with ThreadPlanStepRange::InRange, symbol 
>>> context and target.source-map setting
>>> 
>>> 
>>>> On May 6, 2016, at 11:22 AM, Ted Woodward via lldb-dev 
>>>> <lldb-dev@lists.llvm.org> wrote:
>>>> 
>>>> I’m stepping over the first line of a libcxx test (source 
>>>> https://llvm.org/svn/llvm-project/libcxx/trunk/test/std/thread/thread.condition/thread.condition.condvar/wait.pass.cpp
>>>>  ). The first line has an inlined function call. I expect lldb to step 
>>>> over the breakpoint, run to the end of the range that sets up the inlined 
>>>> function call, run through the inlined function call, then run to the end 
>>>> of the line. Instead, it runs to the inlined call, then stops.
>>>> 
>>>> I’m running lldb on Windows, debugging a Hexagon application that was 
>>>> built on Linux. I’m using the target.source-map setting to let me see 
>>>> source.
>>>> 
>>>> The problem is in ThreadPlanStepRange::InRange. It checks to see if we’re 
>>>> still on the same line by comparing the filename in the Stepping Plan’s 
>>>> line entry to the filename in the current frame’s line entry. 
>>>> m_addr_context.line_entry.file has been normalized by the value in 
>>>> target.source-map, but new_context.line_entry.file hasn’t, so they’re not 
>>>> the same, even though they should be.
>>>> 
>>>>      SymbolContext 
>>>> new_context(frame->GetSymbolContext(eSymbolContextEverything));
>>>>      if (m_addr_context.line_entry.IsValid() && 
>>>> new_context.line_entry.IsValid())
>>>>      {
>>>>          if (m_addr_context.line_entry.file == new_context.line_entry.file)
>>>>          {
>>>> 
>>>> 
>>>> Either both should use target.source-map, or neither should.  How do I run 
>>>> new_context.line_entry.file through the target.source-map normalization?
>>> 
>>> 
>>> 
>>> It doesn't seem right to me that when symbols are handed out they have the 
>>> source map applied to their file spec's.  After all, then you could get 
>>> into problems like: somebody started a step so we recorded m_addr_context.  
>>> Then their step was interrupted (say by hitting a breakpoint) and the user 
>>> added a source mapping.  Then we stop in a frame from the same module, and 
>>> now the SymbolContext that the step plan stored (m_addr_context) has a 
>>> different path than the one in the frame when we get to it.  Checking every 
>>> time you compared file specs seems very error prone, we shouldn't do it 
>>> that way.  I guess if the FileSpec == handled this it would be odd but not 
>>> too bad.  But that seems like it would result in a lot of unnecessary work. 
>>>  I think it would be better to only do source map path conversion when 
>>> sources are looked up, and maybe when paths are printed.  For symbols we 
>>> should stick to what the debug info says.
>>> 
>>> Jim
>>> 
>>> 
>>>> 
>>>> Ted
>>>> 
>>>> --
>>>> Qualcomm Innovation Center, Inc.
>>>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a 
>>>> Linux Foundation Collaborative Project
>>>> 
>>>> _______________________________________________
>>>> lldb-dev mailing list
>>>> lldb-dev@lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>> 
>>> 
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 
> 

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

Reply via email to