From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107212 invoked by alias); 21 May 2018 15:27:09 -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 107201 invoked by uid 89); 21 May 2018 15:27:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 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.2 spammy=entirely X-HELO: mail-wr0-f182.google.com Received: from mail-wr0-f182.google.com (HELO mail-wr0-f182.google.com) (209.85.128.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 21 May 2018 15:27:06 +0000 Received: by mail-wr0-f182.google.com with SMTP id i12-v6so3259285wrc.4 for ; Mon, 21 May 2018 08:27:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=JDrnDFgaxrTe3jP1nQRom3LZ4PRmRPakguDqCghO+NQ=; b=d0gY3lUkcVb+jeb4ynShYX1RzH/41vfx2AwBNqET/3352SQadxOiT6rALjrULU0WYB aVU5zxm5dq9cDtms1QxmJnRw9VWyX2nMBrSgHhXuLYJreIOhyrROkEmKsLPvnCOueFD0 TMaq2Y6nkDv1OXUoNdymxwgVhmh/sdECFTMtpvaLZ2EoAv61LwFq71B3wMJ7PqVLrlMw LWfwwVa9bQasunv931LKNG5SJmQ0z/kbEf+6jwk9Cv4ff+Hgie67YJIzbwrrE3J5wM4c EwPlv+0LZR/OgERNCWJOjuxjuEfieUTYRJM/GkuTZP6WQ0qPi1GXaT1TJhPSC2/AdD1v JL9A== X-Gm-Message-State: ALKqPwe11rhzhazcFj8XsBnrp6yPPlDVS1MwSqOcLyoVYVFhKD8QzhyP FWuJ04hP3bRjncydypH/scuSceIg X-Google-Smtp-Source: AB8JxZqplY4S47yOePttDbFgqKV5yvJByGnNCGO4grIIGUQhSK2OrLNEifLescnzrf381Z+yldnHnA== X-Received: by 2002:adf:a58a:: with SMTP id g10-v6mr16785944wrc.233.1526916424047; Mon, 21 May 2018 08:27:04 -0700 (PDT) Received: from localhost (cust64-dsl91-135-5.idnet.net. [91.135.5.64]) by smtp.gmail.com with ESMTPSA id 187-v6sm20808292wmu.41.2018.05.21.08.27.02 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 May 2018 08:27:03 -0700 (PDT) Date: Mon, 21 May 2018 15:52:00 -0000 From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Pedro Alves Subject: Re: [PATCHv2 1/2] gdb: Split func_command into two parts. Message-ID: <20180521152701.GT3797@embecosm.com> References: <3378e45e-2da2-6eea-814a-86e6e565bf7a@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3378e45e-2da2-6eea-814a-86e6e565bf7a@redhat.com> X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes X-SW-Source: 2018-05/txt/msg00483.txt.bz2 Thanks for the feedback. * Pedro Alves [2018-05-18 20:38:26 +0100]: > On 05/08/2018 05:58 PM, Andrew Burgess wrote: > > The func_command function is used to emulate the dbx 'func' command. > > However, finding a stack frame based on function name might be a useful > > feature, and so the core of func_command is now split out into a > > separate function. > > > > gdb/ChangeLog: > > > > * stack.c (select_and_print_frame): Delete. > > (func_command): Most content moved into new function > > find_frame_for_function, use new function, print result, add > > function comment. > > (find_frame_for_function): New function, now returns a result. > > This LGTM, with a couple minor nits. > > > /* Return the symbol-block in which the selected frame is executing. > > Can return zero under various legitimate circumstances. > > @@ -2460,19 +2450,19 @@ struct function_bounds > > CORE_ADDR low, high; > > }; > > > > -static void > > -func_command (const char *arg, int from_tty) > > +static struct frame_info * > > +find_frame_for_function (const char *function_name) > > There's a comment above the structure that is describing > what the func_command function did. That needs to be > updated to describe what the new function does. As the structure was so small, and only used in that one function, I moved the structure into the function entirely (and added an updated comment to both the structure, and the function). I had a little look through GDB and there are a few other cases of structures declared within a function, so hopefully this is OK. Let me know if you'd rather see this moved back out again. > > > + > > +/* Implements the dbx 'func' command. */ > > + > > +static void > > +func_command (const char *arg, int from_tty) > > +{ > > + struct frame_info *frame; > > + > > + if (arg == NULL) > > + return; > > + > > + frame = find_frame_for_function (arg); > > You can declare and initialize at the same time: Done. --- gdb: Split func_command into two parts. The func_command function is used to emulate the dbx 'func' command. However, finding a stack frame based on function name might be a useful feature, and so the core of func_command is now split out into a separate function. gdb/ChangeLog: * stack.c (select_and_print_frame): Delete. (struct function_bounds): Move struct within function. (func_command): Most content moved into new function find_frame_for_function, use new function, print result, add function comment. (find_frame_for_function): New function, now returns a result. --- gdb/ChangeLog | 9 ++++++++ gdb/stack.c | 67 +++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/gdb/stack.c b/gdb/stack.c index 74c92537da4..5cd17de3193 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2156,16 +2156,6 @@ info_args_command (const char *ignore, int from_tty) print_frame_arg_vars (get_selected_frame (_("No frame selected.")), gdb_stdout); } - -/* Select frame FRAME. Also print the stack frame and show the source - if this is the tui version. */ -static void -select_and_print_frame (struct frame_info *frame) -{ - select_frame (frame); - if (frame) - print_stack_frame (frame, 1, SRC_AND_LOC, 1); -} /* Return the symbol-block in which the selected frame is executing. Can return zero under various legitimate circumstances. @@ -2451,29 +2441,30 @@ return_command (const char *retval_exp, int from_tty) print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } -/* Sets the scope to input function name, provided that the function - is within the current stack frame. */ - -struct function_bounds -{ - CORE_ADDR low, high; -}; +/* Find the most inner frame in the current stack for a function called + FUNCTION_NAME. If no matching frame is found return NULL. */ -static void -func_command (const char *arg, int from_tty) +static struct frame_info * +find_frame_for_function (const char *function_name) { + /* Used to hold the lower and upper addresses for each of the + SYMTAB_AND_LINEs found for functions matching FUNCTION_NAME. */ + struct function_bounds + { + CORE_ADDR low, high; + }; struct frame_info *frame; - int found = 0; + bool found = false; int level = 1; - if (arg == NULL) - return; + gdb_assert (function_name != NULL); frame = get_current_frame (); std::vector sals - = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE); + = decode_line_with_current_source (function_name, + DECODE_LINE_FUNFIRSTLINE); gdb::def_vector func_bounds (sals.size ()); - for (size_t i = 0; (i < sals.size () && !found); i++) + for (size_t i = 0; i < sals.size (); i++) { if (sals[i].pspace != current_program_space) func_bounds[i].low = func_bounds[i].high = 0; @@ -2481,9 +2472,7 @@ func_command (const char *arg, int from_tty) || find_pc_partial_function (sals[i].pc, NULL, &func_bounds[i].low, &func_bounds[i].high) == 0) - { - func_bounds[i].low = func_bounds[i].high = 0; - } + func_bounds[i].low = func_bounds[i].high = 0; } do @@ -2500,9 +2489,27 @@ func_command (const char *arg, int from_tty) while (!found && level == 0); if (!found) - printf_filtered (_("'%s' not within current stack frame.\n"), arg); - else if (frame != get_selected_frame (NULL)) - select_and_print_frame (frame); + frame = NULL; + + return frame; +} + +/* Implements the dbx 'func' command. */ + +static void +func_command (const char *arg, int from_tty) +{ + if (arg == NULL) + return; + + struct frame_info *frame = find_frame_for_function (arg); + if (frame == NULL) + error (_("'%s' not within current stack frame.\n"), arg); + if (frame != get_selected_frame (NULL)) + { + select_frame (frame); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); + } } void -- 2.14.3