diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h --- a/lldb/include/lldb/Symbol/CompileUnit.h +++ b/lldb/include/lldb/Symbol/CompileUnit.h @@ -381,14 +381,11 @@ /// A SymbolContext list class that will get any matching /// entries appended to. /// - /// \return - /// The number of new matches that were added to \a sc_list. - /// /// \see enum SymbolContext::Scope - uint32_t ResolveSymbolContext(const FileSpec &file_spec, uint32_t line, - bool check_inlines, bool exact, - lldb::SymbolContextItem resolve_scope, - SymbolContextList &sc_list); + void ResolveSymbolContext(const FileSpec &file_spec, uint32_t line, + bool check_inlines, bool exact, + lldb::SymbolContextItem resolve_scope, + SymbolContextList &sc_list); /// Get whether compiler optimizations were enabled for this compile unit /// diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp --- a/lldb/source/API/SBThread.cpp +++ b/lldb/source/API/SBThread.cpp @@ -914,9 +914,10 @@ const bool exact = false; SymbolContextList sc_list; - const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext( - step_file_spec, line, check_inlines, exact, eSymbolContextLineEntry, - sc_list); + frame_sc.comp_unit->ResolveSymbolContext(step_file_spec, line, + check_inlines, exact, + eSymbolContextLineEntry, sc_list); + const uint32_t num_matches = sc_list.GetSize(); if (num_matches > 0) { SymbolContext sc; for (uint32_t i = 0; i < num_matches; ++i) { diff --git a/lldb/source/Core/AddressResolverFileLine.cpp b/lldb/source/Core/AddressResolverFileLine.cpp --- a/lldb/source/Core/AddressResolverFileLine.cpp +++ b/lldb/source/Core/AddressResolverFileLine.cpp @@ -40,14 +40,13 @@ AddressResolverFileLine::SearchCallback(SearchFilter &filter, SymbolContext &context, Address *addr) { SymbolContextList sc_list; - uint32_t sc_list_size; CompileUnit *cu = context.comp_unit; Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); - sc_list_size = - cu->ResolveSymbolContext(m_file_spec, m_line_number, m_inlines, false, - eSymbolContextEverything, sc_list); + cu->ResolveSymbolContext(m_file_spec, m_line_number, m_inlines, false, + eSymbolContextEverything, sc_list); + uint32_t sc_list_size = sc_list.GetSize(); for (uint32_t i = 0; i < sc_list_size; i++) { SymbolContext sc; if (sc_list.GetContextAtIndex(i, sc)) { diff --git a/lldb/source/Symbol/CompileUnit.cpp b/lldb/source/Symbol/CompileUnit.cpp --- a/lldb/source/Symbol/CompileUnit.cpp +++ b/lldb/source/Symbol/CompileUnit.cpp @@ -244,11 +244,11 @@ return UINT32_MAX; } -uint32_t CompileUnit::ResolveSymbolContext(const FileSpec &file_spec, - uint32_t line, bool check_inlines, - bool exact, - SymbolContextItem resolve_scope, - SymbolContextList &sc_list) { +void CompileUnit::ResolveSymbolContext(const FileSpec &file_spec, + uint32_t line, bool check_inlines, + bool exact, + SymbolContextItem resolve_scope, + SymbolContextList &sc_list) { // First find all of the file indexes that match our "file_spec". If // "file_spec" has an empty directory, then only compare the basenames when // finding file indexes @@ -260,7 +260,7 @@ // If we are not looking for inlined functions and our file spec doesn't // match then we are done... if (!file_spec_matches_cu_file_spec && !check_inlines) - return 0; + return; uint32_t file_idx = GetSupportFiles().FindFileIndex(1, file_spec, true); @@ -271,84 +271,67 @@ const size_t num_file_indexes = file_indexes.size(); if (num_file_indexes == 0) - return 0; - - const uint32_t prev_size = sc_list.GetSize(); + return; SymbolContext sc(GetModule()); sc.comp_unit = this; - if (line != 0) { - LineTable *line_table = sc.comp_unit->GetLineTable(); - - if (line_table != nullptr) { - uint32_t found_line; - uint32_t line_idx; - - if (num_file_indexes == 1) { - // We only have a single support file that matches, so use the line - // table function that searches for a line entries that match a single - // support file index - LineEntry line_entry; - line_idx = line_table->FindLineEntryIndexByFileIndex( - 0, file_indexes.front(), line, exact, &line_entry); - - // If "exact == true", then "found_line" will be the same as "line". If - // "exact == false", the "found_line" will be the closest line entry - // with a line number greater than "line" and we will use this for our - // subsequent line exact matches below. - found_line = line_entry.line; - - while (line_idx != UINT32_MAX) { - // If they only asked for the line entry, then we're done, we can - // just copy that over. But if they wanted more than just the line - // number, fill it in. - if (resolve_scope == eSymbolContextLineEntry) { - sc.line_entry = line_entry; - } else { - line_entry.range.GetBaseAddress().CalculateSymbolContext( - &sc, resolve_scope); - } - - sc_list.Append(sc); - line_idx = line_table->FindLineEntryIndexByFileIndex( - line_idx + 1, file_indexes.front(), found_line, true, - &line_entry); - } - } else { - // We found multiple support files that match "file_spec" so use the - // line table function that searches for a line entries that match a - // multiple support file indexes. - LineEntry line_entry; - line_idx = line_table->FindLineEntryIndexByFileIndex( - 0, file_indexes, line, exact, &line_entry); - - // If "exact == true", then "found_line" will be the same as "line". If - // "exact == false", the "found_line" will be the closest line entry - // with a line number greater than "line" and we will use this for our - // subsequent line exact matches below. - found_line = line_entry.line; - - while (line_idx != UINT32_MAX) { - if (resolve_scope == eSymbolContextLineEntry) { - sc.line_entry = line_entry; - } else { - line_entry.range.GetBaseAddress().CalculateSymbolContext( - &sc, resolve_scope); - } - - sc_list.Append(sc); - line_idx = line_table->FindLineEntryIndexByFileIndex( - line_idx + 1, file_indexes, found_line, true, &line_entry); - } - } + if (line == 0) { + if (file_spec_matches_cu_file_spec && !check_inlines) { + // only append the context if we aren't looking for inline call sites by + // file and line and if the file spec matches that of the compile unit + sc_list.Append(sc); } - } else if (file_spec_matches_cu_file_spec && !check_inlines) { - // only append the context if we aren't looking for inline call sites by - // file and line and if the file spec matches that of the compile unit + return; + } + + LineTable *line_table = sc.comp_unit->GetLineTable(); + + if (line_table == nullptr) + return; + + uint32_t line_idx; + LineEntry line_entry; + + if (num_file_indexes == 1) { + // We only have a single support file that matches, so use the line + // table function that searches for a line entries that match a single + // support file index + line_idx = line_table->FindLineEntryIndexByFileIndex( + 0, file_indexes.front(), line, exact, &line_entry); + } else { + // We found multiple support files that match "file_spec" so use the + // line table function that searches for a line entries that match a + // multiple support file indexes. + line_idx = line_table->FindLineEntryIndexByFileIndex(0, file_indexes, line, + exact, &line_entry); + } + + // If "exact == true", then "found_line" will be the same as "line". If + // "exact == false", the "found_line" will be the closest line entry + // with a line number greater than "line" and we will use this for our + // subsequent line exact matches below. + uint32_t found_line = line_entry.line; + + while (line_idx != UINT32_MAX) { + // If they only asked for the line entry, then we're done, we can + // just copy that over. But if they wanted more than just the line + // number, fill it in. + if (resolve_scope == eSymbolContextLineEntry) { + sc.line_entry = line_entry; + } else { + line_entry.range.GetBaseAddress().CalculateSymbolContext(&sc, + resolve_scope); + } + sc_list.Append(sc); + if (num_file_indexes == 1) + line_idx = line_table->FindLineEntryIndexByFileIndex( + line_idx + 1, file_indexes.front(), found_line, true, &line_entry); + else + line_idx = line_table->FindLineEntryIndexByFileIndex( + line_idx + 1, file_indexes, found_line, true, &line_entry); } - return sc_list.GetSize() - prev_size; } bool CompileUnit::GetIsOptimized() {