From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 51253 invoked by alias); 26 Sep 2019 23:09:48 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 51176 invoked by uid 89); 26 Sep 2019 23:09:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-wr1-f52.google.com Received: from mail-wr1-f52.google.com (HELO mail-wr1-f52.google.com) (209.85.221.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 26 Sep 2019 23:09:46 +0000 Received: by mail-wr1-f52.google.com with SMTP id h7so570875wrw.8 for ; Thu, 26 Sep 2019 16:09:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=LP2psVuwY9YQNIQ564HFxmrujKQ4k4MJFmBJ4TX9xII=; b=NiTrXqZ0MPurWH2Yzd+WI68hUSedJWOWFYPenjFgLBONLRAIUqFA7qNqggKVXFR7Bb KspdrWLO+LiVdwzy32vkYQy6oRM6KWBewLbJP6GIigSs0Yl8wxNItghvZTolcrap3vJg RfcZnPXQMD1WvhM/ISToL1Qq+vCuQ36pcVyxhZE+sH4nENielz0oHBqMvTz8r5ZAoQ4J KVFAc39ixBTcFL8zVl3nheCWDY74iWAChX6yBxpMbZdKM7ooFfDL/xsT3wxh+ZmEcLK0 oOLggP50Y9t4R281fY3jwmubab5PgH4S/ep8kqNqPF45x0Yn+6v4q4QFlCO4q2sJYy+y aqEg== Return-Path: Received: from localhost (host86-128-12-122.range86-128.btcentralplus.com. [86.128.12.122]) by smtp.gmail.com with ESMTPSA id d78sm4801221wmd.47.2019.09.26.16.09.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 26 Sep 2019 16:09:43 -0700 (PDT) From: Andrew Burgess To: gdb-patches Cc: Andrew Burgess Subject: [PATCH 2/3] gdb: Split print_symbol_info into two parts Date: Thu, 26 Sep 2019 23:09:00 -0000 Message-Id: In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00546.txt.bz2 Split the function print_symbol_info into two parts, the new worker core returns a string, which print_symbol_info then prints. This will be useful in a later commit when some new MI commands will be added which will use the worker core to fill some MI output fields. There should be no user visible changes after this commit. gdb/ChangeLog: * symtab.c (symbol_to_info_string): New function, most content moved from print_symbol_info, but updated to return a std::string. (print_symbol_info): Update to use symbol_to_info_string and print returned string. * symtab.h (symbol_to_info_string): Declare new function. --- gdb/ChangeLog | 8 ++++++ gdb/symtab.c | 87 ++++++++++++++++++++++++++++++++++++----------------------- gdb/symtab.h | 8 ++++++ 3 files changed, 70 insertions(+), 33 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index b4316479f53..5f5bbbb33cb 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4728,44 +4728,25 @@ search_symbols (const char *regexp, enum search_domain kind, return result; } -/* Helper function for symtab_symbol_info, this function uses - the data returned from search_symbols() to print information - regarding the match to gdb_stdout. If LAST is not NULL, - print file and line number information for the symbol as - well. Skip printing the filename if it matches LAST. */ +/* See symtab.h. */ -static void -print_symbol_info (enum search_domain kind, - struct symbol *sym, - int block, const char *last) +std::string +symbol_to_info_string (struct symbol *sym, int block, + enum search_domain kind) { - scoped_switch_to_sym_language_if_auto l (sym); - struct symtab *s = symbol_symtab (sym); - - if (last != NULL) - { - const char *s_filename = symtab_to_filename_for_display (s); + std::string str; - if (filename_cmp (last, s_filename) != 0) - { - fputs_filtered ("\nFile ", gdb_stdout); - fputs_styled (s_filename, file_name_style.style (), gdb_stdout); - fputs_filtered (":\n", gdb_stdout); - } - - if (SYMBOL_LINE (sym) != 0) - printf_filtered ("%d:\t", SYMBOL_LINE (sym)); - else - puts_filtered ("\t"); - } + gdb_assert (block == GLOBAL_BLOCK || block == STATIC_BLOCK); if (kind != TYPES_DOMAIN && block == STATIC_BLOCK) - printf_filtered ("static "); + str += "static "; /* Typedef that is not a C++ class. */ if (kind == TYPES_DOMAIN && SYMBOL_DOMAIN (sym) != STRUCT_DOMAIN) { + string_file tmp_stream; + /* FIXME: For C (and C++) we end up with a difference in output here between how a typedef is printed, and non-typedefs are printed. The TYPEDEF_PRINT code places a ";" at the end in an attempt to @@ -4775,23 +4756,63 @@ print_symbol_info (enum search_domain kind, printing of the ";" in this function, which is going to be wrong for languages that don't require a ";" between statements. */ if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_TYPEDEF) - typedef_print (SYMBOL_TYPE (sym), sym, gdb_stdout); + typedef_print (SYMBOL_TYPE (sym), sym, &tmp_stream); else - type_print (SYMBOL_TYPE (sym), "", gdb_stdout, -1); - printf_filtered ("\n"); + type_print (SYMBOL_TYPE (sym), "", &tmp_stream, -1); + str += tmp_stream.string (); } /* variable, func, or typedef-that-is-c++-class. */ else if (kind < TYPES_DOMAIN || (kind == TYPES_DOMAIN && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN)) { + string_file tmp_stream; + type_print (SYMBOL_TYPE (sym), (SYMBOL_CLASS (sym) == LOC_TYPEDEF ? "" : SYMBOL_PRINT_NAME (sym)), - gdb_stdout, 0); + &tmp_stream, 0); + + str += tmp_stream.string (); + str += ";"; + } - printf_filtered (";\n"); + return str; +} + +/* Helper function for symtab_symbol_info, this function uses + the data returned from search_symbols() to print information + regarding the match to gdb_stdout. If LAST is not NULL, + print file and line number information for the symbol as + well. Skip printing the filename if it matches LAST. */ + +static void +print_symbol_info (enum search_domain kind, + struct symbol *sym, + int block, const char *last) +{ + scoped_switch_to_sym_language_if_auto l (sym); + struct symtab *s = symbol_symtab (sym); + + if (last != NULL) + { + const char *s_filename = symtab_to_filename_for_display (s); + + if (filename_cmp (last, s_filename) != 0) + { + fputs_filtered ("\nFile ", gdb_stdout); + fputs_styled (s_filename, file_name_style.style (), gdb_stdout); + fputs_filtered (":\n", gdb_stdout); + } + + if (SYMBOL_LINE (sym) != 0) + printf_filtered ("%d:\t", SYMBOL_LINE (sym)); + else + puts_filtered ("\t"); } + + std::string str = symbol_to_info_string (sym, block, kind); + printf_filtered ("%s\n", str.c_str ()); } /* This help function for symtab_symbol_info() prints information diff --git a/gdb/symtab.h b/gdb/symtab.h index 1f0fc62a657..f5da8229f2f 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2029,6 +2029,14 @@ extern std::vector search_symbols (const char *, int, const char **, bool); + +/* Helper for print_symbol_info, return a string that describes SYM. + BLOCK is either GLOBAL_BLOCK or STATIC_BLOCK, and KIND is the type of + symbol that was searched for. */ + +extern std::string symbol_to_info_string (struct symbol *sym, int block, + enum search_domain kind); + extern bool treg_matches_sym_type_name (const compiled_regex &treg, const struct symbol *sym); -- 2.14.5