std::vector<symtab_and_line> sals;
for (const auto &elt : ls->file_symtabs)
{
- std::vector<CORE_ADDR> pcs;
+ std::vector<const linetable_entry *> pcs;
/* The logic above should ensure this. */
gdb_assert (elt != NULL);
- program_space *pspace = elt->compunit ()->objfile ()->pspace ();
+ objfile *objfile = elt->compunit ()->objfile ();
+ program_space *pspace = objfile->pspace ();
set_current_program_space (pspace);
- pcs = find_pcs_for_symtab_line (elt, line, best_entry);
- for (CORE_ADDR pc : pcs)
+ pcs = find_linetable_entries_for_symtab_line (elt, line, best_entry);
+ for (auto linetable_entry : pcs)
{
symtab_and_line sal;
sal.pspace = pspace;
sal.symtab = elt;
sal.line = line;
sal.explicit_line = true;
- sal.pc = pc;
+ sal.pc = linetable_entry->pc (objfile);
sals.push_back (std::move (sal));
}
}
address. */
static PyObject *
-build_line_table_tuple_from_pcs (int line, const std::vector<CORE_ADDR> &pcs)
+build_line_table_tuple_from_entries
+ (const struct objfile *objfile,
+ const std::vector<const linetable_entry *> &entries)
{
int i;
- if (pcs.size () < 1)
+ if (entries.size () < 1)
Py_RETURN_NONE;
- gdbpy_ref<> tuple (PyTuple_New (pcs.size ()));
+ gdbpy_ref<> tuple (PyTuple_New (entries.size ()));
if (tuple == NULL)
return NULL;
- for (i = 0; i < pcs.size (); ++i)
+ for (i = 0; i < entries.size (); ++i)
{
- CORE_ADDR pc = pcs[i];
- gdbpy_ref<> obj (build_linetable_entry (line, pc));
+ auto entry = entries[i];
+ gdbpy_ref<> obj (build_linetable_entry
+ (entry->line, entry->pc (objfile)));
if (obj == NULL)
return NULL;
struct symtab *symtab;
gdb_py_longest py_line;
const linetable_entry *best_entry = nullptr;
- std::vector<CORE_ADDR> pcs;
+ std::vector<const linetable_entry*> entries;
LTPY_REQUIRE_VALID (self, symtab);
try
{
- pcs = find_pcs_for_symtab_line (symtab, py_line, &best_entry);
+ entries = find_linetable_entries_for_symtab_line (symtab, py_line,
+ &best_entry);
}
catch (const gdb_exception &except)
{
return gdbpy_handle_gdb_exception (nullptr, except);
}
- return build_line_table_tuple_from_pcs (py_line, pcs);
+ struct objfile *objfile = symtab->compunit ()->objfile ();
+ return build_line_table_tuple_from_entries (objfile, entries);
}
/* Implementation of gdb.LineTable.has_line (self, line) -> Boolean.
exactly match LINE. Returns an empty vector if there are no exact
matches, but updates BEST_ITEM in this case. */
-std::vector<CORE_ADDR>
-find_pcs_for_symtab_line (struct symtab *symtab, int line,
- const linetable_entry **best_item)
+std::vector<const linetable_entry *>
+find_linetable_entries_for_symtab_line (struct symtab *symtab, int line,
+ const linetable_entry **best_item)
{
int start = 0;
- std::vector<CORE_ADDR> result;
- struct objfile *objfile = symtab->compunit ()->objfile ();
+ std::vector<const linetable_entry *> result;
/* First, collect all the PCs that are at this line. */
while (1)
break;
}
- result.push_back (symtab->linetable ()->item[idx].pc (objfile));
+ result.push_back (&symtab->linetable ()->item[idx]);
start = idx + 1;
}
void iterate_over_symtabs (program_space *pspace, const char *name,
gdb::function_view<bool (symtab *)> callback);
-std::vector<CORE_ADDR> find_pcs_for_symtab_line
+std::vector<const linetable_entry *> find_linetable_entries_for_symtab_line
(struct symtab *symtab, int line, const linetable_entry **best_entry);
/* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS. The callback