From patchwork Fri Jun 14 23:01:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 33142 Received: (qmail 14822 invoked by alias); 14 Jun 2019 23:01: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 14739 invoked by uid 89); 14 Jun 2019 23:01:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Received:adf, HX-Spam-Relays-External:209.85.221.67, HX-Received:e2c7, H*RU:209.85.221.67 X-HELO: mail-wr1-f67.google.com Received: from mail-wr1-f67.google.com (HELO mail-wr1-f67.google.com) (209.85.221.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 14 Jun 2019 23:01:47 +0000 Received: by mail-wr1-f67.google.com with SMTP id r16so4056626wrl.11 for ; Fri, 14 Jun 2019 16:01:47 -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=ls+Z+ycvsKp9Hz0qvba5z21WTc3kHCEenANr1hJhf9c=; b=FYPghZ/sCvsrZ77XiytKN6uO2R/rxmt/WHgSj1tcjjjv4vVNvC0G4TrXOfJS/TPzmR WvJBa/dTja2zzojVVFGC6nNd0F8rX99pgDFRD5oWjNZV3Okvdm7KglmQCTOiCT1Bzbp8 ddGEGUxluiKPEeZ/yFcgLzJfBgLsCnt9cR3UgFACHnYU2fSb7hQdaCf30RmjvKTub5Th 6J/L/GX8nKULRXHk2fjqx3eej9VSxqm9zdD0nwuwAKYzEwU/E0lasETvntsrxntbVU1a tQ2trTmFXCF2LJoe7q/YrBqA6VvlxUwrHPXaIttNt4TAAq8uJIIRacw8NwagFkf2n+Pi E8FA== Return-Path: Received: from localhost (host86-180-62-212.range86-180.btcentralplus.com. [86.180.62.212]) by smtp.gmail.com with ESMTPSA id r4sm2604960wrv.34.2019.06.14.16.01.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 14 Jun 2019 16:01:44 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH 2/4] gdb: New function to open source file and compute line charpos data Date: Sat, 15 Jun 2019 00:01:38 +0100 Message-Id: <24a072ec0ca17e602d5b239b8627f093a7ee9df7.1560553051.git.andrew.burgess@embecosm.com> In-Reply-To: References: In-Reply-To: References: <87v9x8mdkf.fsf@tromey.com> X-IsSubscribed: yes Every place that a symtab's line_charpos data is loaded always follows the same pattern, so create a new function to contain this logic and make use of it throughout GDB. There should be no user visible changes after this commit. gdb/ChangeLog: * source-cache.c (source_cache::get_plain_source_lines): Use open_source_file_with_line_charpos instead of just open_source_file, remove call to find_source_lines. (source_cache::get_source_lines): Likewise. * source.c (find_source_lines): Make static. (get_filename_and_charpos): Renamed into... (open_source_file_with_line_charpos): ..this along with changes to return a scoped_fd, and some other minor clean ups. (identify_source_line): Use open_source_file_with_line_charpos. (search_command_helper): Use open_source_file_with_line_charpos instead of just open_source_file, remove call to find_source_lines. * source.h (open_source_file_with_line_charpos): Declare new function. (find_source_lines): Delete declaration. --- gdb/ChangeLog | 18 ++++++++++++++++++ gdb/source-cache.c | 8 ++------ gdb/source.c | 33 ++++++++++++++++----------------- gdb/source.h | 11 +++++------ 4 files changed, 41 insertions(+), 29 deletions(-) diff --git a/gdb/source-cache.c b/gdb/source-cache.c index d2fb4b81b71..2d5b549d971 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -49,13 +49,10 @@ bool source_cache::get_plain_source_lines (struct symtab *s, int first_line, int last_line, std::string *lines) { - scoped_fd desc (open_source_file (s)); + scoped_fd desc (open_source_file_with_line_charpos (s)); if (desc.get () < 0) return false; - if (s->line_charpos == 0) - find_source_lines (s, desc.get ()); - if (first_line < 1 || first_line > s->nlines || last_line < 1) return false; @@ -202,10 +199,9 @@ source_cache::get_source_lines (struct symtab *s, int first_line, { if (s->line_charpos == 0) { - scoped_fd desc = open_source_file (s); + scoped_fd desc (open_source_file_with_line_charpos (s)); if (desc.get () < 0) return false; - find_source_lines (s, desc.get ()); /* FULLNAME points to a value owned by the symtab (symtab::fullname). Calling open_source_file reallocates diff --git a/gdb/source.c b/gdb/source.c index 5fa55e2c160..dae1801c136 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -1129,7 +1129,7 @@ symtab_to_filename_for_display (struct symtab *symtab) to be open on descriptor DESC. All set S->nlines to the number of such lines. */ -void +static void find_source_lines (struct symtab *s, int desc) { struct stat st; @@ -1196,28 +1196,30 @@ find_source_lines (struct symtab *s, int desc) -/* Get full pathname and line number positions for a symtab. - Set *FULLNAME to actual name of the file as found by `openp', - or to 0 if the file is not found. */ +/* See source.h. */ -static void -get_filename_and_charpos (struct symtab *s) +scoped_fd +open_source_file_with_line_charpos (struct symtab *s) { - scoped_fd desc = open_source_file (s); - if (desc.get () < 0) - return; - if (s->line_charpos == 0) - find_source_lines (s, desc.get ()); + scoped_fd fd (open_source_file (s)); + if (fd.get () < 0) + return fd; + + if (s->line_charpos == nullptr) + find_source_lines (s, fd.get ()); + return fd; } + + /* See source.h. */ int identify_source_line (struct symtab *s, int line, int mid_statement, CORE_ADDR pc) { - if (s->line_charpos == 0) - get_filename_and_charpos (s); + if (s->line_charpos == nullptr) + open_source_file_with_line_charpos (s); if (s->fullname == 0) return 0; if (line > s->nlines) @@ -1545,13 +1547,10 @@ search_command_helper (const char *regex, int from_tty, bool forward) if (current_source_symtab == 0) select_source_symtab (0); - scoped_fd desc = open_source_file (current_source_symtab); + scoped_fd desc (open_source_file_with_line_charpos (current_source_symtab)); if (desc.get () < 0) perror_with_name (symtab_to_filename_for_display (current_source_symtab)); - if (current_source_symtab->line_charpos == 0) - find_source_lines (current_source_symtab, desc.get ()); - int line = (forward ? last_line_listed + 1 : last_line_listed - 1); diff --git a/gdb/source.h b/gdb/source.h index f1b5f6e8f7f..7ea826acae5 100644 --- a/gdb/source.h +++ b/gdb/source.h @@ -76,6 +76,11 @@ extern scoped_fd find_and_open_source (const char *filename, negative number for error. */ extern scoped_fd open_source_file (struct symtab *s); +/* Open a source file given a symtab S (by calling open_source_file), then + ensure the line_charpos data is initialised for symtab S before + returning. */ +extern scoped_fd open_source_file_with_line_charpos (struct symtab *s); + extern gdb::unique_xmalloc_ptr rewrite_source_path (const char *path); extern const char *symtab_to_fullname (struct symtab *s); @@ -84,12 +89,6 @@ extern const char *symtab_to_fullname (struct symtab *s); filename. It depends on 'set filename-display' value. */ extern const char *symtab_to_filename_for_display (struct symtab *symtab); -/* Create and initialize the table S->line_charpos that records the - positions of the lines in the source file, which is assumed to be - open on descriptor DESC. All set S->nlines to the number of such - lines. */ -extern void find_source_lines (struct symtab *s, int desc); - /* Return the first line listed by print_source_lines. Used by command interpreters to request listing from a previous point. If 0, then no source lines have yet been listed since the last time