Change find_pcs_for_symtab_line to return a std::vector

This changes find_pcs_for_symtab_line to return a std::vector.  This
allows the removal of some cleanups.

gdb/ChangeLog
2017-04-12  Tom Tromey  <tom@tromey.com>

	* symtab.h (find_pcs_for_symtab_line): Change return type.
	* symtab.c (find_pcs_for_symtab_line): Change return type.
	* python/py-linetable.c (build_line_table_tuple_from_pcs): Change
	type of "vec".  Update.
	(ltpy_get_pcs_for_line): Update.
	* linespec.c (decode_digits_ordinary): Update.
This commit is contained in:
Tom Tromey 2017-04-06 16:38:56 -06:00
parent 93921405a4
commit 67d8990150
5 changed files with 28 additions and 30 deletions

View File

@ -1,3 +1,12 @@
2017-04-12 Tom Tromey <tom@tromey.com>
* symtab.h (find_pcs_for_symtab_line): Change return type.
* symtab.c (find_pcs_for_symtab_line): Change return type.
* python/py-linetable.c (build_line_table_tuple_from_pcs): Change
type of "vec". Update.
(ltpy_get_pcs_for_line): Update.
* linespec.c (decode_digits_ordinary): Update.
2017-04-12 Tom Tromey <tom@tromey.com>
* tracepoint.c (actions_command): Update.

View File

@ -3469,9 +3469,7 @@ decode_digits_ordinary (struct linespec_state *self,
for (ix = 0; VEC_iterate (symtab_ptr, ls->file_symtabs, ix, elt); ++ix)
{
int i;
VEC (CORE_ADDR) *pcs;
CORE_ADDR pc;
std::vector<CORE_ADDR> pcs;
/* The logic above should ensure this. */
gdb_assert (elt != NULL);
@ -3479,7 +3477,7 @@ decode_digits_ordinary (struct linespec_state *self,
set_current_program_space (SYMTAB_PSPACE (elt));
pcs = find_pcs_for_symtab_line (elt, line, best_entry);
for (i = 0; VEC_iterate (CORE_ADDR, pcs, i, pc); ++i)
for (CORE_ADDR pc : pcs)
{
struct symtab_and_line sal;
@ -3490,8 +3488,6 @@ decode_digits_ordinary (struct linespec_state *self,
sal.pc = pc;
add_sal_to_sals_basic (sals, &sal);
}
VEC_free (CORE_ADDR, pcs);
}
}

View File

@ -115,30 +115,28 @@ build_linetable_entry (int line, CORE_ADDR address)
return (PyObject *) obj;
}
/* Internal helper function to build a Python Tuple from a GDB Vector.
/* Internal helper function to build a Python Tuple from a vector.
A line table entry can have multiple PCs for a given source line.
Construct a Tuple of all entries for the given source line, LINE
from the line table VEC. Construct one line table entry object per
from the line table PCS. Construct one line table entry object per
address. */
static PyObject *
build_line_table_tuple_from_pcs (int line, VEC (CORE_ADDR) *vec)
build_line_table_tuple_from_pcs (int line, const std::vector<CORE_ADDR> &pcs)
{
int vec_len = 0;
CORE_ADDR pc;
int i;
vec_len = VEC_length (CORE_ADDR, vec);
if (vec_len < 1)
if (pcs.size () < 1)
Py_RETURN_NONE;
gdbpy_ref<> tuple (PyTuple_New (vec_len));
gdbpy_ref<> tuple (PyTuple_New (pcs.size ()));
if (tuple == NULL)
return NULL;
for (i = 0; VEC_iterate (CORE_ADDR, vec, i, pc); ++i)
for (i = 0; i < pcs.size (); ++i)
{
CORE_ADDR pc = pcs[i];
gdbpy_ref<> obj (build_linetable_entry (line, pc));
if (obj == NULL)
@ -160,8 +158,7 @@ ltpy_get_pcs_for_line (PyObject *self, PyObject *args)
struct symtab *symtab;
gdb_py_longest py_line;
struct linetable_entry *best_entry = NULL;
VEC (CORE_ADDR) *pcs = NULL;
PyObject *tuple;
std::vector<CORE_ADDR> pcs;
LTPY_REQUIRE_VALID (self, symtab);
@ -178,10 +175,7 @@ ltpy_get_pcs_for_line (PyObject *self, PyObject *args)
}
END_CATCH
tuple = build_line_table_tuple_from_pcs (py_line, pcs);
VEC_free (CORE_ADDR, pcs);
return tuple;
return build_line_table_tuple_from_pcs (py_line, pcs);
}
/* Implementation of gdb.LineTable.has_line (self, line) -> Boolean.

View File

@ -3289,15 +3289,15 @@ done:
}
/* Given SYMTAB, returns all the PCs function in the symtab that
exactly match LINE. Returns NULL if there are no exact matches,
but updates BEST_ITEM in this case. */
exactly match LINE. Returns an empty vector if there are no exact
matches, but updates BEST_ITEM in this case. */
VEC (CORE_ADDR) *
std::vector<CORE_ADDR>
find_pcs_for_symtab_line (struct symtab *symtab, int line,
struct linetable_entry **best_item)
{
int start = 0;
VEC (CORE_ADDR) *result = NULL;
std::vector<CORE_ADDR> result;
/* First, collect all the PCs that are at this line. */
while (1)
@ -3320,8 +3320,7 @@ find_pcs_for_symtab_line (struct symtab *symtab, int line,
break;
}
VEC_safe_push (CORE_ADDR, result,
SYMTAB_LINETABLE (symtab)->item[idx].pc);
result.push_back (SYMTAB_LINETABLE (symtab)->item[idx].pc);
start = idx + 1;
}

View File

@ -20,7 +20,7 @@
#if !defined (SYMTAB_H)
#define SYMTAB_H 1
#include "vec.h"
#include <vector>
#include "gdb_vecs.h"
#include "gdbtypes.h"
#include "common/enum-flags.h"
@ -1618,8 +1618,8 @@ void iterate_over_symtabs (const char *name,
gdb::function_view<bool (symtab *)> callback);
VEC (CORE_ADDR) *find_pcs_for_symtab_line (struct symtab *symtab, int line,
struct linetable_entry **best_entry);
std::vector<CORE_ADDR> find_pcs_for_symtab_line
(struct symtab *symtab, int line, struct linetable_entry **best_entry);
/* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS. The callback
is called once per matching symbol SYM. The callback should return