Yes, comp unit equal, no function and symbol equal should be treated as 
equivalent.

However, your check would call two SymbolContexts equivalent that had different 
CompUnits but the same symbol.  I can’t see how that would happen in practice, 
but if it did something odd has gone on, and we probably should stop and let 
the user have a look.  So can you change this to add a check for symbol equal 
inside the “have a comp and it’s equal” instead?

Jim  


> On Nov 17, 2016, at 9:24 AM, Sam McCall <sammcc...@google.com> wrote:
> 
> sammccall created this revision.
> sammccall added a reviewer: jingham.
> sammccall added a subscriber: lldb-commits.
> 
> Fix step-over when SymbolContext.function is missing and symbol is present.
> 
> With targets from our build configuration,
> ThreadPlanStepOverRange::IsEquivalentContext fails to fire for relevant 
> frames,
> leading to ShouldStop() returning true prematurely.
> 
> The frame's SymbolContext, and m_addr_context have:
> 
> - comp_unit set and matching
> - function = nullptr
> - symbol set and matching (but this is never checked)
> 
> My naive guess is that the context should be equivalent in this case :-)
> 
> 
> https://reviews.llvm.org/D26804
> 
> Files:
>  source/Target/ThreadPlanStepOverRange.cpp
> 
> 
> Index: source/Target/ThreadPlanStepOverRange.cpp
> ===================================================================
> --- source/Target/ThreadPlanStepOverRange.cpp
> +++ source/Target/ThreadPlanStepOverRange.cpp
> @@ -106,22 +106,22 @@
>   // in so I left out the target check.  And sometimes the module comes in as
>   // the .o file from the
>   // inlined range, so I left that out too...
> -  if (m_addr_context.comp_unit) {
> -    if (m_addr_context.comp_unit == context.comp_unit) {
> -      if (m_addr_context.function &&
> -          m_addr_context.function == context.function) {
> -        // It is okay to return to a different block of a straight function, 
> we
> -        // only have to
> -        // be more careful if returning from one inlined block to another.
> -        if (m_addr_context.block->GetInlinedFunctionInfo() == nullptr &&
> -            context.block->GetInlinedFunctionInfo() == nullptr)
> -          return true;
> -
> -        if (m_addr_context.block && m_addr_context.block == context.block)
> -          return true;
> -      }
> +  if (m_addr_context.comp_unit &&
> +      m_addr_context.comp_unit == context.comp_unit) {
> +    if (m_addr_context.function &&
> +        m_addr_context.function == context.function) {
> +      // It is okay to return to a different block of a straight function, we
> +      // only have to
> +      // be more careful if returning from one inlined block to another.
> +      if (m_addr_context.block->GetInlinedFunctionInfo() == nullptr &&
> +          context.block->GetInlinedFunctionInfo() == nullptr)
> +        return true;
> +
> +      if (m_addr_context.block && m_addr_context.block == context.block)
> +        return true;
>     }
> -  } else if (m_addr_context.symbol && m_addr_context.symbol == 
> context.symbol) {
> +  }
> +  if (m_addr_context.symbol && m_addr_context.symbol == context.symbol) {
>     return true;
>   }
>   return false;
> 
> 
> <D26804.78374.patch>

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

Reply via email to