From patchwork Fri Aug 7 08:57:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 8082 Received: (qmail 29895 invoked by alias); 7 Aug 2015 08:57:33 -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 29886 invoked by uid 89); 7 Aug 2015 08:57:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.1 required=5.0 tests=BAYES_50, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: mail-wi0-f181.google.com Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com) (209.85.212.181) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 07 Aug 2015 08:57:31 +0000 Received: by wibhh20 with SMTP id hh20so56850501wib.0 for ; Fri, 07 Aug 2015 01:57:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=wD1nsBUvrsIPkWtZPiD4eyWLJsUoIVAZZjJ3AB7pv68=; b=bObWs09wq5Q2zuwQ2QbtpOBARgyBRFByod1tzEAaAlkNpCuytArhC8ujSaxcWH4K1F Yz4T++6y4PU22rnr0uJ1RIWTeKxTwRmsJKDOT8mTmEE1EviRku6u0HV9KP108ObsT4yl Ar8Gr99wiMktMiIIcTgWBc2iMY8ZCxHSOC7nm6SSZgJ/tAmByZVdUiQAG8PZZUqcumZS rpAIIk/eB9vHBmTnN+RLIwyCI4lWGMSs5zNJUsPE/KFZXETJY9dw0jp8lXQPhJWmGoYR H2HFk3rS/Jzo6C3sn8ZR7rcSb54wCdKn2Wbk/KBGmCqgHMDgAqfJ35Rl2xNe6OzkX0u+ 8dpg== X-Gm-Message-State: ALoCoQkQUUbS+dN2FXoOfS4vrI1fhA5EfbjVHrOogdO8nRRtyaGG3YYK+7sXGJnLr72txtaLeaeV X-Received: by 10.195.11.37 with SMTP id ef5mr12479607wjd.60.1438937847689; Fri, 07 Aug 2015 01:57:27 -0700 (PDT) Received: from localhost (vpn-konference.ms.mff.cuni.cz. [195.113.20.101]) by smtp.gmail.com with ESMTPSA id ny7sm7430355wic.11.2015.08.07.01.57.26 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Aug 2015 01:57:26 -0700 (PDT) Date: Fri, 7 Aug 2015 09:57:23 +0100 From: Andrew Burgess To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [PATCH 2/2] gdb: Move get_frame_language from stack.c to frame.c. Message-ID: <20150807085723.GB30204@embecosm.com> References: <568a4c1273713e14f691586c2d32bdbd3be610a1.1438699523.git.andrew.burgess@embecosm.com> <55C0E229.7050003@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <55C0E229.7050003@redhat.com> X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes * Pedro Alves [2015-08-04 17:02:49 +0100]: > On 08/04/2015 04:40 PM, Andrew Burgess wrote: > > > --- a/gdb/frame.h > > +++ b/gdb/frame.h > > @@ -814,4 +814,10 @@ extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc); > > extern int frame_unwinder_is (struct frame_info *fi, > > const struct frame_unwind *unwinder); > > > > +/* Return the language of FRAME. */ > > + > > +enum language; > > No new forward declarations of enums please. That doesn't work in C++. OK. New version includes the language.h header file, which showed up a few places where we were missing forward declarations of structs, otherwise, no significant changes. Thanks, Andrew --- The get_frame_language feels like it would be more at home in frame.c rather than in stack.c, while the declaration, that is currently in language.h can be moved into frame.h to match. A couple of new includes are added, but otherwise no substantial change here. gdb/ChangeLog: * stack.c (get_frame_language): Moved ... * frame.c (get_frame_language): ... to here. * language.h (get_frame_language): Declaration moved to frame.h. * frame.h: Add language.h include, for language enum. (get_frame_language): Declaration moved from language.h. * language.c: Add frame.h include. * top.c: Add frame.h include. * symtab.h (struct obj_section): Declare. (struct cmd_list_element): Declare. --- gdb/ChangeLog | 12 ++++++++++++ gdb/frame.c | 42 ++++++++++++++++++++++++++++++++++++++++++ gdb/frame.h | 7 +++++++ gdb/language.c | 1 + gdb/language.h | 2 -- gdb/stack.c | 42 ------------------------------------------ gdb/symtab.h | 2 ++ gdb/top.c | 1 + 8 files changed, 65 insertions(+), 44 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 223d2e5..d510c3d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2015-08-04 Andrew Burgess + * stack.c (get_frame_language): Moved ... + * frame.c (get_frame_language): ... to here. + * language.h (get_frame_language): Declaration moved to frame.h. + * frame.h: Add language.h include, for language enum. + (get_frame_language): Declaration moved from language.h. + * language.c: Add frame.h include. + * top.c: Add frame.h include. + * symtab.h (struct obj_section): Declare. + (struct cmd_list_element): Declare. + +2015-08-04 Andrew Burgess + * language.c (show_language_command): Find selected frame before asking for the language of that frame. (set_language_command): Likewise. diff --git a/gdb/frame.c b/gdb/frame.c index da5bfb9..f05f739 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -2571,6 +2571,48 @@ frame_unwind_caller_arch (struct frame_info *next_frame) return frame_unwind_arch (skip_artificial_frames (next_frame)); } +/* Gets the language of FRAME. */ + +enum language +get_frame_language (struct frame_info *frame) +{ + CORE_ADDR pc = 0; + int pc_p = 0; + + gdb_assert (frame!= NULL); + + /* We determine the current frame language by looking up its + associated symtab. To retrieve this symtab, we use the frame + PC. However we cannot use the frame PC as is, because it + usually points to the instruction following the "call", which + is sometimes the first instruction of another function. So + we rely on get_frame_address_in_block(), it provides us with + a PC that is guaranteed to be inside the frame's code + block. */ + + TRY + { + pc = get_frame_address_in_block (frame); + pc_p = 1; + } + CATCH (ex, RETURN_MASK_ERROR) + { + if (ex.error != NOT_AVAILABLE_ERROR) + throw_exception (ex); + } + END_CATCH + + if (pc_p) + { + struct compunit_symtab *cust = find_pc_compunit_symtab (pc); + + if (cust != NULL) + return compunit_language (cust); + } + + return language_unknown; +} + /* Stack pointer methods. */ CORE_ADDR diff --git a/gdb/frame.h b/gdb/frame.h index be64c57..03f3892 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -69,6 +69,8 @@ */ +#include "language.h" + struct symtab_and_line; struct frame_unwind; struct frame_base; @@ -814,4 +816,9 @@ extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc); extern int frame_unwinder_is (struct frame_info *fi, const struct frame_unwind *unwinder); +/* Return the language of FRAME. */ + +extern enum language get_frame_language (struct frame_info *frame); + + #endif /* !defined (FRAME_H) */ diff --git a/gdb/language.c b/gdb/language.c index 75d4497..715efe5 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -43,6 +43,7 @@ #include "demangle.h" #include "symfile.h" #include "cp-support.h" +#include "frame.h" extern void _initialize_language (void); diff --git a/gdb/language.h b/gdb/language.h index 8782ef0..2265afc 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -544,8 +544,6 @@ extern const char *language_str (enum language); extern void add_language (const struct language_defn *); -extern enum language get_frame_language (struct frame_info *frame); /* In stack.c */ - /* Check for a language-specific trampoline. */ extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc); diff --git a/gdb/stack.c b/gdb/stack.c index 31a723d..ae53ec8 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2559,48 +2559,6 @@ func_command (char *arg, int from_tty) else if (frame != get_selected_frame (NULL)) select_and_print_frame (frame); } - -/* Gets the language of FRAME. */ - -enum language -get_frame_language (struct frame_info *frame) -{ - CORE_ADDR pc = 0; - int pc_p = 0; - - gdb_assert (frame!= NULL); - - /* We determine the current frame language by looking up its - associated symtab. To retrieve this symtab, we use the frame - PC. However we cannot use the frame PC as is, because it - usually points to the instruction following the "call", which - is sometimes the first instruction of another function. So - we rely on get_frame_address_in_block(), it provides us with - a PC that is guaranteed to be inside the frame's code - block. */ - - TRY - { - pc = get_frame_address_in_block (frame); - pc_p = 1; - } - CATCH (ex, RETURN_MASK_ERROR) - { - if (ex.error != NOT_AVAILABLE_ERROR) - throw_exception (ex); - } - END_CATCH - - if (pc_p) - { - struct compunit_symtab *cust = find_pc_compunit_symtab (pc); - - if (cust != NULL) - return compunit_language (cust); - } - - return language_unknown; -} /* Provide a prototype to silence -Wmissing-prototypes. */ diff --git a/gdb/symtab.h b/gdb/symtab.h index 61fc8c5..e90ce00 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -38,6 +38,8 @@ struct program_space; struct language_defn; struct probe; struct common_block; +struct obj_section; +struct cmd_list_element; /* Some of the structures in this file are space critical. The space-critical structures are: diff --git a/gdb/top.c b/gdb/top.c index 0130acf..061b52f 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -49,6 +49,7 @@ #include "observer.h" #include "maint.h" #include "filenames.h" +#include "frame.h" /* readline include files. */ #include "readline/readline.h"