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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits