From: Tom Tromey Date: Thu, 6 Apr 2017 22:38:56 +0000 (-0600) Subject: Change find_pcs_for_symtab_line to return a std::vector X-Git-Tag: gdb-8.0-release~126 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=67d89901506da74d00a482b7560237dce404b41c;p=external%2Fbinutils.git 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 * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aecbcaa..7ca7982 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2017-04-12 Tom Tromey + * 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 + * tracepoint.c (actions_command): Update. * python/python.c (python_command, python_interactive_command): Update. diff --git a/gdb/linespec.c b/gdb/linespec.c index 41b82d7..bccabaf 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -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 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); } } diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index 8d17aab..13daa3d 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -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 &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 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. diff --git a/gdb/symtab.c b/gdb/symtab.c index cc2f400..20ef76d 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -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 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 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; } diff --git a/gdb/symtab.h b/gdb/symtab.h index d8c665c..341deca 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -20,7 +20,7 @@ #if !defined (SYMTAB_H) #define SYMTAB_H 1 -#include "vec.h" +#include #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 callback); -VEC (CORE_ADDR) *find_pcs_for_symtab_line (struct symtab *symtab, int line, - struct linetable_entry **best_entry); +std::vector 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