From patchwork Mon Dec 2 19:15:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 36442 Received: (qmail 31498 invoked by alias); 2 Dec 2019 19:15:50 -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 31423 invoked by uid 89); 2 Dec 2019 19:15:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN autolearn=ham version=3.3.1 spammy=reaching, sk:include, eptr X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 02 Dec 2019 19:15:45 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id BB5A120334; Mon, 2 Dec 2019 14:15:42 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 1DDCD203C1; Mon, 2 Dec 2019 14:15:33 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 9BB7328174; Mon, 2 Dec 2019 14:15:33 -0500 (EST) X-Gerrit-PatchSet: 9 Date: Mon, 2 Dec 2019 14:15:32 -0500 From: "Andrew Burgess (Code Review)" To: gdb-patches@sourceware.org Cc: Joel Brobecker , Simon Marchi Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [review v9] gdb/mi: Add -max-results parameter to some -symbol-info-* commands X-Gerrit-Change-Id: I90a28feb55b388fb46461a096c5db08b6b0bd427 X-Gerrit-Change-Number: 269 X-Gerrit-ChangeURL: X-Gerrit-Commit: 3b785047f20a54bafaa8b94a3c45a1fab4160c2c In-Reply-To: References: Reply-To: andrew.burgess@embecosm.com, simon.marchi@polymtl.ca, brobecker@adacore.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Message-Id: <20191202191533.9BB7328174@gnutoolchain-gerrit.osci.io> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/269 ...................................................................... gdb/mi: Add -max-results parameter to some -symbol-info-* commands Adds a new parameter -max-results to -symbol-info-functions, -symbol-info-variables, -symbol-info-types, and -symbol-info-modules. This parameter limits the number of results returned. This change still leaves -symbol-info-module-functions and -symbol-info-module-variables always returning all results, fixing these commands is slightly harder. There's currently no mechanism for the user of these commands to know if the result list has been truncated if you get back the maximum number of results, so if there are exactly 10 functions and you call '-symbol-info-functions --max-results 10' the reply would appear no different than if you had 20 functions and called with a max of 10. Right now, if you get back the maximum then you should assume that there might be more results available. One other thing to note is that the global_symbol_searcher::search by default returns UINT_MAX results, there's no longer a mechanism to return an unlimited number of results, though hopefully this will not be a huge issue. gdb/ChangeLog: * mi/mi-symbol-cmds.c (mi_symbol_info): Take extra parameter, and add it into the search spec. (mi_info_functions_or_variables): Parse -max-results flag and pass it to mi_symbol_info. (mi_cmd_symbol_info_modules): Likewise. (mi_cmd_symbol_info_types): Likewise. * symtab.c (global_symbol_searcher::add_matching_symbols): Change return type to bool, don't add new results if we have enough already. (global_symbol_searcher::add_matching_msymbols): Likewise. (global_symbol_searcher::search): Early exit from search loop when we have enough results. * symtab.h (global_symbol_searcher) : New member function. (global_symbol_searcher) : New member variable. (global_symbol_searcher) : Update header comment and change return type to bool. (global_symbol_searcher) : Update header comment and change return type to bool. gdb/doc/ChangeLog: * doc/gdb.texinfo (GDB/MI Symbol Query): Add documentation of -max-results to some -symbol-info-* commands. gdb/testsuite/ChangeLog: * gdb.mi/mi-sym-info.exp: Add tests for -max-results parameter. Change-Id: I90a28feb55b388fb46461a096c5db08b6b0bd427 --- M gdb/ChangeLog M gdb/doc/ChangeLog M gdb/doc/gdb.texinfo M gdb/mi/mi-symbol-cmds.c M gdb/symtab.c M gdb/symtab.h M gdb/testsuite/ChangeLog M gdb/testsuite/gdb.mi/mi-sym-info.exp 8 files changed, 168 insertions(+), 21 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a21e06c..c3199e3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,28 @@ 2019-12-02 Andrew Burgess + * mi/mi-symbol-cmds.c (mi_symbol_info): Take extra parameter, and + add it into the search spec. + (mi_info_functions_or_variables): Parse -max-results flag and pass + it to mi_symbol_info. + (mi_cmd_symbol_info_modules): Likewise. + (mi_cmd_symbol_info_types): Likewise. + * symtab.c (global_symbol_searcher::add_matching_symbols): Change + return type to bool, don't add new results if we have enough + already. + (global_symbol_searcher::add_matching_msymbols): Likewise. + (global_symbol_searcher::search): Early exit from search loop when + we have enough results. + * symtab.h (global_symbol_searcher) : New + member function. + (global_symbol_searcher) : New member + variable. + (global_symbol_searcher) : Update header + comment and change return type to bool. + (global_symbol_searcher) : Update header + comment and change return type to bool. + +2019-12-02 Andrew Burgess + * symtab.c (symbol_search::compare_search_syms): Update header comment. (global_symbol_searcher::is_suitable_msymbol): New function. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 10e2207..df6026f 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,5 +1,10 @@ 2019-12-02 Andrew Burgess + * doc/gdb.texinfo (GDB/MI Symbol Query): Add documentation of + -max-results to some -symbol-info-* commands. + +2019-12-02 Andrew Burgess + * doc/gdb.texinfo (GDB/MI Symbol Query): Document new MI command -symbol-info-module-functions and -symbol-info-module-variables. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 6fb7e8a..544e632 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -33962,6 +33962,7 @@ -symbol-info-functions [--include-nondebug] [--type @var{type_regexp}] [--name @var{name_regexp}] + [--max-results @var{limit}] @end smallexample @noindent @@ -33977,6 +33978,11 @@ to be filtered based on either the name of the function, or the type signature of the function. +The option @code{--max-results} restricts the command to return no +more than @var{limit} results. If exactly @var{limit} results are +returned then there might be additional results available if a higher +limit is used. + @subsubheading @value{GDBN} Command The corresponding @value{GDBN} command is @samp{info functions}. @@ -34208,6 +34214,8 @@ @smallexample -symbol-info-modules [--name @var{name_regexp}] + [--max-results @var{limit}] + @end smallexample @noindent @@ -34218,6 +34226,11 @@ The option @code{--name} allows the modules returned to be filtered based the name of the module. +The option @code{--max-results} restricts the command to return no +more than @var{limit} results. If exactly @var{limit} results are +returned then there might be additional results available if a higher +limit is used. + @subsubheading @value{GDBN} Command The corresponding @value{GDBN} command is @samp{info modules}. @@ -34262,6 +34275,8 @@ @smallexample -symbol-info-types [--name @var{name_regexp}] + [--max-results @var{limit}] + @end smallexample @noindent @@ -34275,6 +34290,11 @@ The option @code{--name} allows the list of types returned to be filtered by name. +The option @code{--max-results} restricts the command to return no +more than @var{limit} results. If exactly @var{limit} results are +returned then there might be additional results available if a higher +limit is used. + @subsubheading @value{GDBN} Command The corresponding @value{GDBN} command is @samp{info types}. @@ -34322,6 +34342,8 @@ -symbol-info-variables [--include-nondebug] [--type @var{type_regexp}] [--name @var{name_regexp}] + [--max-results @var{limit}] + @end smallexample @noindent @@ -34337,6 +34359,11 @@ to be filtered based on either the name of the variable, or the type of the variable. +The option @code{--max-results} restricts the command to return no +more than @var{limit} results. If exactly @var{limit} results are +returned then there might be additional results available if a higher +limit is used. + @subsubheading @value{GDBN} Command The corresponding @value{GDBN} command is @samp{info variables}. diff --git a/gdb/mi/mi-symbol-cmds.c b/gdb/mi/mi-symbol-cmds.c index 6334e39..8bc6c26 100644 --- a/gdb/mi/mi-symbol-cmds.c +++ b/gdb/mi/mi-symbol-cmds.c @@ -111,11 +111,13 @@ static void mi_symbol_info (enum search_domain kind, const char *name_regexp, - const char *type_regexp, bool exclude_minsyms) + const char *type_regexp, bool exclude_minsyms, + unsigned int max_results) { global_symbol_searcher sym_search (kind, name_regexp); sym_search.set_symbol_type_regexp (type_regexp); sym_search.set_exclude_minsyms (exclude_minsyms); + sym_search.set_max_search_results (max_results); std::vector symbols = sym_search.search (); ui_out *uiout = current_uiout; int i = 0; @@ -172,19 +174,21 @@ static void mi_info_functions_or_variables (enum search_domain kind, char **argv, int argc) { + unsigned int max_results = UINT_MAX; const char *regexp = nullptr; const char *t_regexp = nullptr; bool exclude_minsyms = true; enum opt { - INCLUDE_NONDEBUG_OPT, TYPE_REGEXP_OPT, NAME_REGEXP_OPT + INCLUDE_NONDEBUG_OPT, TYPE_REGEXP_OPT, NAME_REGEXP_OPT, MAX_RESULTS_OPT }; static const struct mi_opt opts[] = { {"-include-nondebug" , INCLUDE_NONDEBUG_OPT, 0}, {"-type", TYPE_REGEXP_OPT, 1}, {"-name", NAME_REGEXP_OPT, 1}, + {"-max-results", MAX_RESULTS_OPT, 1}, { 0, 0, 0 } }; @@ -210,10 +214,19 @@ case NAME_REGEXP_OPT: regexp = oarg; break; + case MAX_RESULTS_OPT: + { + char *eptr = oarg; + long val = strtol (oarg, &eptr, 10); + if (oarg == eptr || val > UINT_MAX || val < 0) + error (_("invalid value for --max-results argument")); + max_results = (unsigned int) val; + } + break; } } - mi_symbol_info (kind, regexp, t_regexp, exclude_minsyms); + mi_symbol_info (kind, regexp, t_regexp, exclude_minsyms, max_results); } /* Helper for mi_info_module_functions_or_variables. Display the results @@ -382,15 +395,17 @@ void mi_cmd_symbol_info_modules (const char *command, char **argv, int argc) { + unsigned int max_results = UINT_MAX; const char *regexp = nullptr; enum opt { - NAME_REGEXP_OPT + NAME_REGEXP_OPT, MAX_RESULTS_OPT }; static const struct mi_opt opts[] = { {"-name", NAME_REGEXP_OPT, 1}, + {"-max-results", MAX_RESULTS_OPT, 1}, { 0, 0, 0 } }; @@ -408,10 +423,19 @@ case NAME_REGEXP_OPT: regexp = oarg; break; + case MAX_RESULTS_OPT: + { + char *eptr = oarg; + long val = strtol (oarg, &eptr, 10); + if (oarg == eptr || val > UINT_MAX || val < 0) + error (_("invalid value for --max-results argument")); + max_results = (unsigned int) val; + } + break; } } - mi_symbol_info (MODULES_DOMAIN, regexp, nullptr, true); + mi_symbol_info (MODULES_DOMAIN, regexp, nullptr, true, max_results); } /* Implement -symbol-info-types command. */ @@ -419,15 +443,17 @@ void mi_cmd_symbol_info_types (const char *command, char **argv, int argc) { + unsigned int max_results = UINT_MAX; const char *regexp = nullptr; enum opt { - NAME_REGEXP_OPT + NAME_REGEXP_OPT, MAX_RESULTS_OPT }; static const struct mi_opt opts[] = { {"-name", NAME_REGEXP_OPT, 1}, + {"-max-results", MAX_RESULTS_OPT, 1}, { 0, 0, 0 } }; @@ -445,10 +471,19 @@ case NAME_REGEXP_OPT: regexp = oarg; break; + case MAX_RESULTS_OPT: + { + char *eptr = oarg; + long val = strtol (oarg, &eptr, 10); + if (oarg == eptr || val > UINT_MAX || val < 0) + error (_("invalid value for --max-results argument")); + max_results = (unsigned int) val; + } + break; } } - mi_symbol_info (TYPES_DOMAIN, regexp, nullptr, true); + mi_symbol_info (TYPES_DOMAIN, regexp, nullptr, true, max_results); } /* Implement -symbol-info-variables command. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index 0e92d4a..16dca72 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4534,7 +4534,7 @@ /* See symtab.h. */ -void +bool global_symbol_searcher::add_matching_symbols (objfile *objfile, const gdb::optional &preg, @@ -4597,19 +4597,26 @@ && SYMBOL_DOMAIN (sym) == MODULE_DOMAIN && SYMBOL_LINE (sym) != 0)))) { - /* Match, insert if not already in the results. */ - symbol_search ss (block, sym); - if (result_set->find (ss) == result_set->end ()) - result_set->insert (ss); + if (result_set->size () < m_max_search_results) + { + /* Match, insert if not already in the results. */ + symbol_search ss (block, sym); + if (result_set->find (ss) == result_set->end ()) + result_set->insert (ss); + } + else + return false; } } } } + + return true; } /* See symtab.h. */ -void +bool global_symbol_searcher::add_matching_msymbols (objfile *objfile, const gdb::optional &preg, std::vector *results) const @@ -4641,12 +4648,17 @@ VAR_DOMAIN).symbol == NULL) { /* Matching msymbol, add it to the results list. */ - results->emplace_back (GLOBAL_BLOCK, msymbol, objfile); + if (results->size () < m_max_search_results) + results->emplace_back (GLOBAL_BLOCK, msymbol, objfile); + else + return false; } } } } } + + return true; } /* See symtab.h. */ @@ -4721,7 +4733,8 @@ /* Find matching symbols within OBJFILE and add them in to RESULT_SET. */ - add_matching_symbols (objfile, preg, treg, &result_set); + if (!add_matching_symbols (objfile, preg, treg, &result_set)) + break; } /* Convert the result set into a sorted result list. */ @@ -4738,7 +4751,8 @@ { gdb_assert (m_kind == VARIABLES_DOMAIN || m_kind == FUNCTIONS_DOMAIN); for (objfile *objfile : current_program_space->objfiles ()) - add_matching_msymbols (objfile, preg, &result); + if (!add_matching_msymbols (objfile, preg, &result)) + break; } return result; diff --git a/gdb/symtab.h b/gdb/symtab.h index f183083..d0fc20d 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2093,6 +2093,12 @@ m_exclude_minsyms = exclude_minsyms; } + /* Set the maximum number of search results to be returned. */ + void set_max_search_results (unsigned int max_search_results) + { + m_max_search_results = max_search_results; + } + /* Search the symbols from all objfiles in the current program space looking for matches as defined by the current state of this object. @@ -2126,6 +2132,10 @@ be included in the results, otherwise they are excluded. */ bool m_exclude_minsyms = false; + /* Maximum number of search results. We currently impose a hard limit + of UINT_MAX, there is no "unlimited". */ + unsigned int m_max_search_results = UINT_MAX; + /* Expand symtabs in OBJFILE that match PREG, are of type M_KIND. Return true if any msymbols were seen that we should later consider adding to the results list. */ @@ -2133,15 +2143,23 @@ const gdb::optional &preg) const; /* Add symbols from symtabs in OBJFILE that match PREG, and TREG, and are - of type M_KIND, to the results set RESULTS_SET. */ - void add_matching_symbols (objfile *objfile, + of type M_KIND, to the results set RESULTS_SET. Return false if we + stop adding results early due to having already found too many results + (based on M_MAX_SEARCH_RESULTS limit), otherwise return true. + Returning true does not indicate that any results were added, just + that we didn't _not_ add a result due to reaching MAX_SEARCH_RESULTS. */ + bool add_matching_symbols (objfile *objfile, const gdb::optional &preg, const gdb::optional &treg, std::set *result_set) const; - /* Add msymbols from OBJFILE that match PREG and M_KIND, to the - results vector RESULTS. */ - void add_matching_msymbols (objfile *objfile, + /* Add msymbols from OBJFILE that match PREG and M_KIND, to the results + vector RESULTS. Return false if we stop adding results early due to + having already found too many results (based on max search results + limit M_MAX_SEARCH_RESULTS), otherwise return true. Returning true + does not indicate that any results were added, just that we didn't + _not_ add a result due to reaching MAX_SEARCH_RESULTS. */ + bool add_matching_msymbols (objfile *objfile, const gdb::optional &preg, std::vector *results) const; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7fa48e3..765fb84 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2019-12-02 Andrew Burgess + * gdb.mi/mi-sym-info.exp: Add tests for -max-results parameter. + +2019-12-02 Andrew Burgess + * gdb.mi/mi-fortran-modules.exp: Add additional tests for -symbol-info-module-functions and -symbol-info-module-variables. diff --git a/gdb/testsuite/gdb.mi/mi-sym-info.exp b/gdb/testsuite/gdb.mi/mi-sym-info.exp index 33fe865..4a65bd6 100644 --- a/gdb/testsuite/gdb.mi/mi-sym-info.exp +++ b/gdb/testsuite/gdb.mi/mi-sym-info.exp @@ -127,3 +127,24 @@ mi_gdb_test "120-symbol-info-types --name _int_" \ "120\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"27\",name=\"my_int_t\"\}\\\]\},\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"23\",name=\"another_int_t\"\}\\\]\}\\\]\}" \ "List all types matching _int_" + +# Test the --max-results parameter. +mi_gdb_test "121-symbol-info-functions --max-results 0" \ + "121\\^done,symbols=\{\}" \ + "-symbol-info-functions --max-results 0" + +mi_gdb_test "122-symbol-info-functions --max-results 1" \ + "122\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"39\",name=\"f3\",type=\"int \\(another_int_t\\)\",description=\"int f3\\(another_int_t\\);\"\}\\\]\}\\\]\}" \ + "-symbol-info-functions --max-results 1" + +mi_gdb_test "123-symbol-info-functions --max-results 2" \ + "123\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"33\",name=\"f2\",type=\"float \\(another_float_t\\)\",description=\"float f2\\(another_float_t\\);\"\},\{line=\"39\",name=\"f3\",type=\"int \\(another_int_t\\)\",description=\"int f3\\(another_int_t\\);\"\}\\\]\}\\\]\}" \ + "-symbol-info-functions --max-results 2" + +mi_gdb_test "124-symbol-info-variables --max-results 3" \ + "124\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"global_f2\",type=\"int\",description=\"int global_f2;\"\},\{line=\"20\",name=\"global_i2\",type=\"int\",description=\"int global_i2;\"\},\{line=\"19\",name=\"global_f1\",type=\"float\",description=\"static float global_f1;\"\}\\\]\}\\\]\}" \ + "-symbol-info-variables --max-results 3" + +mi_gdb_test "125-symbol-info-types --max-results 4" \ + "125\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"24\",name=\"another_float_t\"\},\{line=\"23\",name=\"another_int_t\"\},\{name=\"float\"\},\{name=\"int\"\}\\\]\}\\\]\}" \ + "-symbol-info-types --max-results 4"