From patchwork Wed Oct 16 23:28:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 35070 Received: (qmail 98219 invoked by alias); 16 Oct 2019 23:28:20 -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 98142 invoked by uid 89); 16 Oct 2019 23:28:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.1 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-f54.google.com Received: from mail-wr1-f54.google.com (HELO mail-wr1-f54.google.com) (209.85.221.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 16 Oct 2019 23:28:17 +0000 Received: by mail-wr1-f54.google.com with SMTP id j11so188964wrp.1 for ; Wed, 16 Oct 2019 16:28:17 -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=dTw07oP5I4RpKN8lmbQa/s9RS9mTYaOGHOOfWYepjlU=; b=XQq1/zTN4AnVjhR0os/8pvXChXdDFS/zIafemIQiX7jCBEuRKtpVv320Czs/n+sgUW jeOt/SHMYM9gCo5u6bRfjWrByrx8s0Aw5FZP9pi0pMMk6FOev659zsB9RO7P+dCbGnJ7 f2R3FhLLifNmMMBt+hGiFDJBi92O39ohz+QkbwZcZlKB73YJVbn22zWfE5LQWjKVEAtx SjnGFIpCEMITo7ax5PR5aWC52mBc18nISqauiOeerCFWqurp1KZfApwNETkXr9ks/9sH 4sJWehGpexkCTAj3kfXKDUUA8xTrbL5VoqVls+3BJkQAj/riXUImifs7P709cH+XY08P StFA== Return-Path: Received: from localhost (host86-128-12-122.range86-128.btcentralplus.com. [86.128.12.122]) by smtp.gmail.com with ESMTPSA id g17sm297102wrq.58.2019.10.16.16.28.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Oct 2019 16:28:14 -0700 (PDT) From: Andrew Burgess To: gdb-patches Cc: Andrew Burgess Subject: [PATCHv3 5/9] gdb: Split print_symbol_info into two parts Date: Thu, 17 Oct 2019 00:28:00 +0100 Message-Id: In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes 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. Change-Id: I6454ce43cacb61d32fbadb9e3655e70823085777 --- gdb/ChangeLog | 8 ++++++ gdb/symtab.c | 92 ++++++++++++++++++++++++++++++++++++----------------------- gdb/symtab.h | 8 ++++++ 3 files changed, 73 insertions(+), 35 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index b7b65b98ac8..f7affd418cd 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4707,44 +4707,25 @@ search_symbols (const search_symbols_spec &search_spec) 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); + std::string str; - if (last != NULL) - { - const char *s_filename = symtab_to_filename_for_display (s); - - if (filename_cmp (last, s_filename) != 0) - { - printf_filtered (_("\nFile %ps:\n"), - styled_string (file_name_style.style (), - s_filename)); - } - - 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 @@ -4754,28 +4735,69 @@ 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); - printf_filtered (";\n"); + str += tmp_stream.string (); + str += ";"; } + else if (kind == MODULES_DOMAIN) + str += SYMBOL_PRINT_NAME (sym); + + return str; +} + +/* Helper function for symbol info commands, for example 'info functions', + 'info variables', etc. KIND is the kind of symbol we searched for, and + BLOCK is the type of block the symbols was found in, either GLOBAL_BLOCK + or STATIC_BLOCK. SYM is the symbol we found. 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) + { + printf_filtered (_("\nFile %ps:\n"), + styled_string (file_name_style.style (), + s_filename)); + } + + if (SYMBOL_LINE (sym) != 0) + printf_filtered ("%d:\t", SYMBOL_LINE (sym)); + else + puts_filtered ("\t"); + } + /* Printing of modules is currently done here, maybe at some future point we might want a language specific method to print the module symbol so that we can customise the output more. */ - else if (kind == MODULES_DOMAIN) - printf_filtered ("%s\n", SYMBOL_PRINT_NAME (sym)); + 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 f1c7db22505..8852b50a170 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2126,6 +2126,14 @@ extern std::vector search_module_symbols (const char *module_regexp, const char *regexp, const char *type_regexp, search_domain kind); +/* Convert a global or static symbol SYM (based on BLOCK, which should be + either GLOBAL_BLOCK or STATIC_BLOCK) into a string for use in 'info' + type commands (e.g. 'info variables', 'info functions', etc). KIND is + the type of symbol that was searched for which gave us SYM. */ + +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);