From patchwork Fri Aug 17 18:00:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 28957 Received: (qmail 42922 invoked by alias); 17 Aug 2018 18:00:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 42814 invoked by uid 89); 17 Aug 2018 18:00:44 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 17 Aug 2018 18:00:42 +0000 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C6F3CC0587D1; Fri, 17 Aug 2018 18:00:40 +0000 (UTC) Received: from theo.uglyboxes.com (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7FAE1600C3; Fri, 17 Aug 2018 18:00:40 +0000 (UTC) Subject: Re: [PATCH 4/9] Change `minimal_symbols' to std::vector in linespec.c structures To: Tom Tromey Cc: gdb-patches@sourceware.org References: <20180810232534.481-1-keiths@redhat.com> <20180810232534.481-5-keiths@redhat.com> <87tvo1t0bb.fsf@tromey.com> From: Keith Seitz Message-ID: <16508f0b-0525-e5b1-fe91-bd99931e0341@redhat.com> Date: Fri, 17 Aug 2018 11:00:40 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <87tvo1t0bb.fsf@tromey.com> X-IsSubscribed: yes On 08/11/2018 08:00 AM, Tom Tromey wrote: >>>>>> "Keith" == Keith Seitz writes: > > Keith> This patch converts linespec.c's linespec.label_symbols member from a > Keith> VEC to a std::vector. > > Keith> gdb/ChangeLog: > > Keith> * linespec.c (struct linespec) : Change type to > Keith> std::vector. Update all users. > Keith> (struct collect_info) : Likewise. > Keith> (find_method, find_function_symbols, find_linespec_symbols): Change > Keith> `minsyms' parameter to std::vector. Update all callers. > > Thank you. > > Keith> + qsort (ls->minimal_symbols->data (), ls->minimal_symbols->size (), > Keith> + sizeof (bound_minimal_symbol), compare_msymbols); > > I think this should be changed to use std::sort. > If I'm reading correctly, this is the only caller of compare_msymbols, > so this transform shouldn't be too hard to do. Done. New patch below. [This is the only change in this revision.] Keith Subject: [PATCH] Change `minimal_symbols' to std::vector in linespec.c structures This patch converts linespec.c's linespec.label_symbols member from a VEC to a std::vector. gdb/ChangeLog: * linespec.c (struct linespec) : Change type to std::vector. Update all users. (convert_linespec_to_sals): Use std::sort to sort minimal symbols. (struct collect_info) : Likewise. (compare_msymbols): Return bool. Change parameters to const bound_minimal_symbol references. (find_method, find_function_symbols, find_linespec_symbols): Change `minsyms' parameter to std::vector. Update all callers. --- gdb/ChangeLog | 11 +++++ gdb/linespec.c | 134 +++++++++++++++++++++++---------------------------------- 2 files changed, 65 insertions(+), 80 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 38c588e2c0..a94e1cdd68 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ YYYY-MM-DD Keith Seitz + * linespec.c (struct linespec) : Change type to + std::vector. Update all users. + (convert_linespec_to_sals): Use std::sort to sort minimal symbols. + (struct collect_info) : Likewise. + (compare_msymbols): Return bool. Change parameters to const + bound_minimal_symbol references. + (find_method, find_function_symbols, find_linespec_symbols): Change + `minsyms' parameter to std::vector. Update all callers. + +YYYY-MM-DD Keith Seitz + * linespec.c (struct linespec) : Change type to std::vector. Update all users. (find_label_symbols_in_block): Change `result' parameter to diff --git a/gdb/linespec.c b/gdb/linespec.c index 9c156f910d..e7e19cab67 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -116,7 +116,7 @@ struct linespec /* A list of matching function symbols and minimal symbols. Both lists may be NULL (or empty) if no matching symbols were found. */ std::vector *function_symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector *minimal_symbols; /* A structure of matching label symbols and the corresponding function symbol in which the label was found. Both may be NULL @@ -202,7 +202,7 @@ struct collect_info struct { std::vector *symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector *minimal_symbols; } result; /* Possibly add a symbol to the results. */ @@ -362,7 +362,7 @@ static void find_linespec_symbols (struct linespec_state *self, const char *name, symbol_name_match_type name_match_type, std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms); + std::vector *minsyms); static struct line_offset linespec_parse_variable (struct linespec_state *self, @@ -404,7 +404,8 @@ static int compare_symbols (const void *a, const void *b); static bool std_compare_symbols (const struct symbol *a, const struct symbol *b); -static int compare_msymbols (const void *a, const void *b); +static bool compare_msymbols (const bound_minimal_symbol &a, + const bound_minimal_symbol &b); /* Permitted quote characters for the parser. This is different from the completer's quote characters to allow backward compatibility with the @@ -1770,7 +1771,7 @@ linespec_parse_basic (linespec_parser *parser) linespec_token token; std::vector symbols; std::vector *labels; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector minimal_symbols; /* Get the next token. */ token = linespec_lexer_lex_one (parser); @@ -1873,11 +1874,13 @@ linespec_parse_basic (linespec_parser *parser) PARSER_EXPLICIT (parser)->func_name_match_type, &symbols, &minimal_symbols); - if (!symbols.empty () || minimal_symbols != NULL) + if (!symbols.empty () || !minimal_symbols.empty ()) { PARSER_RESULT (parser)->function_symbols = new std::vector (std::move (symbols)); - PARSER_RESULT (parser)->minimal_symbols = minimal_symbols; + PARSER_RESULT (parser)->minimal_symbols + = new std::vector + (std::move (minimal_symbols)); PARSER_EXPLICIT (parser)->function_name = name.release (); } else @@ -2283,20 +2286,16 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) const CORE_ADDR addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)); - bound_minimal_symbol_d *elem; - for (int m = 0; - VEC_iterate (bound_minimal_symbol_d, ls->minimal_symbols, - m, elem); - ++m) + for (const auto &elem : *ls->minimal_symbols) { - if (MSYMBOL_TYPE (elem->minsym) == mst_text_gnu_ifunc - || MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) + if (MSYMBOL_TYPE (elem.minsym) == mst_text_gnu_ifunc + || MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc) { - CORE_ADDR msym_addr = BMSYMBOL_VALUE_ADDRESS (*elem); - if (MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) + CORE_ADDR msym_addr = BMSYMBOL_VALUE_ADDRESS (elem); + if (MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc) { struct gdbarch *gdbarch - = get_objfile_arch (elem->objfile); + = get_objfile_arch (elem.objfile); msym_addr = (gdbarch_convert_from_func_ptr_addr (gdbarch, @@ -2327,20 +2326,15 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (ls->minimal_symbols != NULL) { /* Sort minimal symbols by program space, too */ - qsort (VEC_address (bound_minimal_symbol_d, ls->minimal_symbols), - VEC_length (bound_minimal_symbol_d, ls->minimal_symbols), - sizeof (bound_minimal_symbol_d), compare_msymbols); + std::sort (ls->minimal_symbols->begin (), + ls->minimal_symbols->end (), + compare_msymbols); - bound_minimal_symbol_d *elem; - - for (int i = 0; - VEC_iterate (bound_minimal_symbol_d, ls->minimal_symbols, - i, elem); - ++i) + for (const auto &elem : *ls->minimal_symbols) { - program_space *pspace = elem->objfile->pspace; + program_space *pspace = elem.objfile->pspace; set_current_program_space (pspace); - minsym_found (state, elem->objfile, elem->minsym, &sals); + minsym_found (state, elem.objfile, elem.minsym, &sals); } } } @@ -2389,7 +2383,7 @@ convert_explicit_location_to_linespec (struct linespec_state *self, { std::vector symbols; std::vector *labels; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector minimal_symbols; result->explicit_loc.func_name_match_type = fname_match_type; @@ -2420,14 +2414,15 @@ convert_explicit_location_to_linespec (struct linespec_state *self, function_name, fname_match_type, &symbols, &minimal_symbols); - if (symbols.empty () && minimal_symbols == NULL) + if (symbols.empty () && minimal_symbols.empty ()) symbol_not_found_error (function_name, result->explicit_loc.source_filename); result->explicit_loc.function_name = xstrdup (function_name); result->function_symbols = new std::vector (std::move (symbols)); - result->minimal_symbols = minimal_symbols; + result->minimal_symbols + = new std::vector (std::move (minimal_symbols)); } if (label_name != NULL) @@ -2778,10 +2773,7 @@ linespec_parser_delete (void *arg) delete PARSER_RESULT (parser)->file_symtabs; delete PARSER_RESULT (parser)->function_symbols; - - if (PARSER_RESULT (parser)->minimal_symbols != NULL) - VEC_free (bound_minimal_symbol_d, PARSER_RESULT (parser)->minimal_symbols); - + delete PARSER_RESULT (parser)->minimal_symbols; delete PARSER_RESULT (parser)->labels.label_symbols; delete PARSER_RESULT (parser)->labels.function_symbols; @@ -3041,7 +3033,7 @@ linespec_complete (completion_tracker &tracker, const char *text, const char *func_name = PARSER_EXPLICIT (&parser)->function_name; std::vector function_symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector minimal_symbols; find_linespec_symbols (PARSER_STATE (&parser), PARSER_RESULT (&parser)->file_symtabs, func_name, match_type, @@ -3049,7 +3041,8 @@ linespec_complete (completion_tracker &tracker, const char *text, PARSER_RESULT (&parser)->function_symbols = new std::vector (std::move (function_symbols)); - PARSER_RESULT (&parser)->minimal_symbols = minimal_symbols; + PARSER_RESULT (&parser)->minimal_symbols + = new std::vector (std::move (minimal_symbols)); complete_label (tracker, &parser, parser.completion_word); } @@ -3449,7 +3442,8 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) std::vector symbols; info.result.symbols = &symbols; - info.result.minimal_symbols = NULL; + std::vector minimal_symbols; + info.result.minimal_symbols = &minimal_symbols; new_argptr = find_imps (arg, &symbol_names); if (symbol_names.empty ()) @@ -3459,8 +3453,7 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) FUNCTIONS_DOMAIN); std::vector values; - if (!symbols.empty () - || !VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) + if (!symbols.empty () || !minimal_symbols.empty ()) { char *saved_arg; @@ -3470,7 +3463,8 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) ls->explicit_loc.function_name = xstrdup (saved_arg); ls->function_symbols = new std::vector (std::move (symbols)); - ls->minimal_symbols = info.result.minimal_symbols; + ls->minimal_symbols + = new std::vector (std::move (minimal_symbols)); values = convert_linespec_to_sals (self, ls); if (self->canonical) @@ -3662,32 +3656,26 @@ compare_symbols (const void *a, const void *b) /* Like compare_symbols but for minimal symbols. */ -static int -compare_msymbols (const void *a, const void *b) +static bool +compare_msymbols (const bound_minimal_symbol &a, const bound_minimal_symbol &b) { - const struct bound_minimal_symbol *sa - = (const struct bound_minimal_symbol *) a; - const struct bound_minimal_symbol *sb - = (const struct bound_minimal_symbol *) b; uintptr_t uia, uib; - uia = (uintptr_t) sa->objfile->pspace; - uib = (uintptr_t) sa->objfile->pspace; + uia = (uintptr_t) a.objfile->pspace; + uib = (uintptr_t) a.objfile->pspace; if (uia < uib) - return -1; + return true; if (uia > uib) - return 1; + return false; - uia = (uintptr_t) sa->minsym; - uib = (uintptr_t) sb->minsym; + uia = (uintptr_t) a.minsym; + uib = (uintptr_t) b.minsym; if (uia < uib) - return -1; - if (uia > uib) - return 1; + return true; - return 0; + return false; } /* Look for all the matching instances of each symbol in NAMES. Only @@ -3736,7 +3724,7 @@ static void find_method (struct linespec_state *self, std::vector *file_symtabs, const char *class_name, const char *method_name, VEC (symbolp) *sym_classes, std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *minsyms) { struct symbol *sym; int ix; @@ -3755,7 +3743,7 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, info.state = self; info.file_symtabs = file_symtabs; info.result.symbols = symbols; - info.result.minimal_symbols = NULL; + info.result.minimal_symbols = minsyms; /* Iterate over all the types, looking for the names of existing methods matching METHOD_NAME. If we cannot find a direct method in a @@ -3805,12 +3793,8 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, } } - if (!symbols->empty () - || !VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) - { - *minsyms = info.result.minimal_symbols; - return; - } + if (!symbols->empty () || !minsyms->empty ()) + return; /* Throw an NOT_FOUND_ERROR. This will be caught by the caller and other attempts to locate the symbol will be made. */ @@ -3938,14 +3922,14 @@ find_function_symbols (struct linespec_state *state, std::vector *file_symtabs, const char *name, symbol_name_match_type name_match_type, std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *minsyms) { struct collect_info info; std::vector symbol_names; info.state = state; info.result.symbols = symbols; - info.result.minimal_symbols = NULL; + info.result.minimal_symbols = minsyms; info.file_symtabs = file_symtabs; /* Try NAME as an Objective-C selector. */ @@ -3956,14 +3940,6 @@ find_function_symbols (struct linespec_state *state, else add_matching_symbols_to_info (name, name_match_type, FUNCTIONS_DOMAIN, &info, state->search_pspace); - - if (VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) - { - VEC_free (bound_minimal_symbol_d, info.result.minimal_symbols); - *minsyms = NULL; - } - else - *minsyms = info.result.minimal_symbols; } /* Find all symbols named NAME in FILE_SYMTABS, returning debug symbols @@ -3975,7 +3951,7 @@ find_linespec_symbols (struct linespec_state *state, const char *lookup_name, symbol_name_match_type name_match_type, std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *minsyms) { std::string canon = cp_canonicalize_string_no_typedefs (lookup_name); if (!canon.empty ()) @@ -3996,8 +3972,7 @@ find_linespec_symbols (struct linespec_state *state, /* If we were unable to locate a symbol of the same name, try dividing the name into class and method names and searching the class and its baseclasses. */ - if (symbols->empty () - && VEC_empty (bound_minimal_symbol_d, *minsyms)) + if (symbols->empty () && minsyms->empty ()) { std::string klass, method; const char *last, *p, *scope_op; @@ -4472,8 +4447,7 @@ search_minsyms_for_name (struct collect_info *info, if (classify_mtype (MSYMBOL_TYPE (item.minsym)) != classification) break; - VEC_safe_push (bound_minimal_symbol_d, - info->result.minimal_symbols, &item); + info->result.minimal_symbols->push_back (item); } } }