[Lldb-commits] [lldb] r259611 - The compiler may use "line number 0" to indicate compiler generated goo that it can't

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 2 16:14:52 PST 2016


Shouldn't it be possible to force clang to generate code like this?  If so
couldn't you write a test for this by stepping over a function call which
has this kind of code in it?

On Tue, Feb 2, 2016 at 4:11 PM Jim Ingham via lldb-commits <
lldb-commits at lists.llvm.org> wrote:

> Author: jingham
> Date: Tue Feb  2 18:07:23 2016
> New Revision: 259611
>
> URL: http://llvm.org/viewvc/llvm-project?rev=259611&view=rev
> Log:
> The compiler may use "line number 0" to indicate compiler generated goo
> that it can't
> track a source for.  When we are pushing breakpoints and stepping past
> function prologues,
> also push past code from line 0 immediately following the prologue end.
>
> <rdar://problem/23730696>
>
> Modified:
>     lldb/trunk/include/lldb/Symbol/Function.h
>     lldb/trunk/source/Symbol/Function.cpp
>
> Modified: lldb/trunk/include/lldb/Symbol/Function.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Function.h?rev=259611&r1=259610&r2=259611&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/Function.h (original)
> +++ lldb/trunk/include/lldb/Symbol/Function.h Tue Feb  2 18:07:23 2016
> @@ -574,6 +574,14 @@ public:
>      CompilerType
>      GetCompilerType ();
>
> +    //------------------------------------------------------------------
> +    /// Get the size of the prologue instructions for this function.  The
> "prologue"
> +    /// instructions include any instructions given line number 0
> immediately following
> +    /// the prologue end.
> +    ///
> +    /// @return
> +    ///     The size of the prologue.
> +    //------------------------------------------------------------------
>      uint32_t
>      GetPrologueByteSize ();
>
>
> Modified: lldb/trunk/source/Symbol/Function.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Function.cpp?rev=259611&r1=259610&r2=259611&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/Function.cpp (original)
> +++ lldb/trunk/source/Symbol/Function.cpp Tue Feb  2 18:07:23 2016
> @@ -570,6 +570,8 @@ Function::GetPrologueByteSize ()
>      {
>          m_flags.Set(flagsCalculatedPrologueSize);
>          LineTable* line_table = m_comp_unit->GetLineTable ();
> +        uint32_t prologue_end_line_idx = 0;
> +
>          if (line_table)
>          {
>              LineEntry first_line_entry;
> @@ -578,9 +580,12 @@ Function::GetPrologueByteSize ()
>              {
>                  // Make sure the first line entry isn't already the end
> of the prologue
>                  addr_t prologue_end_file_addr = LLDB_INVALID_ADDRESS;
> +                addr_t line_zero_end_file_addr = LLDB_INVALID_ADDRESS;
> +
>                  if (first_line_entry.is_prologue_end)
>                  {
>                      prologue_end_file_addr =
> first_line_entry.range.GetBaseAddress().GetFileAddress();
> +                    prologue_end_line_idx = first_line_entry_idx;
>                  }
>                  else
>                  {
> @@ -595,6 +600,7 @@ Function::GetPrologueByteSize ()
>                              if (line_entry.is_prologue_end)
>                              {
>                                  prologue_end_file_addr =
> line_entry.range.GetBaseAddress().GetFileAddress();
> +                                prologue_end_line_idx = idx;
>                                  break;
>                              }
>                          }
> @@ -607,7 +613,7 @@ Function::GetPrologueByteSize ()
>                  {
>                      // Check the first few instructions and look for one
> that has
>                      // a line number that's different than the first
> entry.
> -                    const uint32_t last_line_entry_idx =
> first_line_entry_idx + 6;
> +                    uint32_t last_line_entry_idx = first_line_entry_idx +
> 6;
>                      for (uint32_t idx = first_line_entry_idx + 1; idx <
> last_line_entry_idx; ++idx)
>                      {
>                          LineEntry line_entry;
> @@ -616,6 +622,7 @@ Function::GetPrologueByteSize ()
>                              if (line_entry.line != first_line_entry.line)
>                              {
>                                  prologue_end_file_addr =
> line_entry.range.GetBaseAddress().GetFileAddress();
> +                                prologue_end_line_idx = idx;
>                                  break;
>                              }
>                          }
> @@ -624,10 +631,37 @@ Function::GetPrologueByteSize ()
>                      if (prologue_end_file_addr == LLDB_INVALID_ADDRESS)
>                      {
>                          prologue_end_file_addr =
> first_line_entry.range.GetBaseAddress().GetFileAddress() +
> first_line_entry.range.GetByteSize();
> +                        prologue_end_line_idx = first_line_entry_idx;
>                      }
>                  }
> +
>                  const addr_t func_start_file_addr =
> m_range.GetBaseAddress().GetFileAddress();
>                  const addr_t func_end_file_addr = func_start_file_addr +
> m_range.GetByteSize();
> +
> +                // Now calculate the offset to pass the subsequent line 0
> entries.
> +                uint32_t first_non_zero_line = prologue_end_line_idx;
> +                while (1)
> +                {
> +                    LineEntry line_entry;
> +                    if
> (line_table->GetLineEntryAtIndex(first_non_zero_line, line_entry))
> +                    {
> +                        if (line_entry.line != 0)
> +                            break;
> +                    }
> +                    if
> (line_entry.range.GetBaseAddress().GetFileAddress() >= func_end_file_addr)
> +                        break;
> +
> +                    first_non_zero_line++;
> +                }
> +
> +                if (first_non_zero_line > prologue_end_line_idx)
> +                {
> +                    LineEntry first_non_zero_entry;
> +                    if
> (line_table->GetLineEntryAtIndex(first_non_zero_line, first_non_zero_entry))
> +                    {
> +                        line_zero_end_file_addr =
> first_non_zero_entry.range.GetBaseAddress().GetFileAddress();
> +                    }
> +                }
>
>                  // Verify that this prologue end file address in the
> function's
>                  // address range just to be sure
> @@ -635,10 +669,16 @@ Function::GetPrologueByteSize ()
>                  {
>                      m_prologue_byte_size = prologue_end_file_addr -
> func_start_file_addr;
>                  }
> +
> +                if (prologue_end_file_addr < line_zero_end_file_addr &&
> line_zero_end_file_addr < func_end_file_addr)
> +                {
> +                    m_prologue_byte_size += line_zero_end_file_addr -
> prologue_end_file_addr;
> +                }
>              }
>          }
>      }
> -    return m_prologue_byte_size;
> +
> +        return m_prologue_byte_size;
>  }
>
>  lldb::LanguageType
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160203/0c0dd45f/attachment-0001.html>


More information about the lldb-commits mailing list