From: Jim Ingham Date: Wed, 3 Feb 2016 00:07:23 +0000 (+0000) Subject: The compiler may use "line number 0" to indicate compiler generated goo that it can't X-Git-Tag: llvmorg-3.9.0-rc1~15266 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=39f7353a60e930a304880508e2af116c6f90ec7d;p=platform%2Fupstream%2Fllvm.git 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. llvm-svn: 259611 --- diff --git a/lldb/include/lldb/Symbol/Function.h b/lldb/include/lldb/Symbol/Function.h index cd2df9b..9892d62 100644 --- a/lldb/include/lldb/Symbol/Function.h +++ b/lldb/include/lldb/Symbol/Function.h @@ -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 (); diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp index 33cc0c4..598af27 100644 --- a/lldb/source/Symbol/Function.cpp +++ b/lldb/source/Symbol/Function.cpp @@ -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