From patchwork Tue Dec 26 13:48:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stafford Horne X-Patchwork-Id: 25103 Received: (qmail 38417 invoked by alias); 26 Dec 2017 13:48:57 -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 38303 invoked by uid 89); 26 Dec 2017 13:48:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, 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=H*RU:209.85.160.67, Hx-spam-relays-external:209.85.160.67, *last, Hx-languages-length:3067 X-HELO: mail-pl0-f67.google.com Received: from mail-pl0-f67.google.com (HELO mail-pl0-f67.google.com) (209.85.160.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 26 Dec 2017 13:48:55 +0000 Received: by mail-pl0-f67.google.com with SMTP id d21so17888137pll.1 for ; Tue, 26 Dec 2017 05:48:55 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XaIGctD2z3cTvrl8YKz+OHqMBzqhWfwHC5edWpzl0aY=; b=PemyKx8xAaDsNHri81XR5PfLX3feAnNlonXnX9WhUQydJNNdptgQBRbCB/d2NclEIc 2ru2Ttk3O2TnnURSP+gHfX8xmWVY9Kx6Lh68JzaQcUc/BBPO/tsXPfMPJQ7raNlDOo3R CDBBCsKXoLahFI87bd88X1bP2OQcIOgvDTuX85ScnQ/ngTx1ThL1BU1ActDUEHCU8XRj 8gOMw1mNUbMQmVZ1D2SiuRoE+EUeYyQPgTOl4LUQlvm+NmQplKo+rAT+xUTUqrxBJfDm DJXci9ePhPIDnoRoFQAEfsePaWTVdsQMgZHlhlLvpmlnjeTsu7dpGP4shDnvbiJAPD71 cHAA== X-Gm-Message-State: AKGB3mK533b8Ukm/3zSL4YSObq9kpnSp2ke9UYDoxvTgKZ+fF4aLuMlk dlJBAnWe1HhChmK+sJkEIxslaO2W X-Google-Smtp-Source: ACJfBovkN/xe7/eH0WXFOTJTJdImp2TplW+OfQ/jhFYt691qXQNB+ziG0CwRlHHbESaVgz9FLQr9wA== X-Received: by 10.84.131.105 with SMTP id 96mr25608156pld.54.1514296134148; Tue, 26 Dec 2017 05:48:54 -0800 (PST) Received: from localhost (g121.222-224-191.ppp.wakwak.ne.jp. [222.224.191.121]) by smtp.gmail.com with ESMTPSA id a87sm61477066pfg.159.2017.12.26.05.48.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 26 Dec 2017 05:48:53 -0800 (PST) From: Stafford Horne To: GDB patches Cc: Simon Marchi , Eli Zaretskii , Stafford Horne Subject: [PATCH v4 3/4] reggroups: Add reggroup_gdbarch_new, reggroup_find for dynamic reggroups Date: Tue, 26 Dec 2017 22:48:31 +0900 Message-Id: <20171226134832.23497-4-shorne@gmail.com> In-Reply-To: <20171226134832.23497-1-shorne@gmail.com> References: <20171226134832.23497-1-shorne@gmail.com> X-IsSubscribed: yes Traditionally reggroups have been created via reggroup_new() during initialization code and never freed. Now, if we want to initialize reggroups dynamically (i.e. in target description) we should be able to free them. Create this function reggroup_gdbarch_new() which will allocate the reggroup memory onto the passed gdbarch obstack. Also creating reggroup_find() as a utility to find a gdbarch registered reggroup object by name. gdb/ChangeLog: yyyy-mm-dd Stafford Horne * reggroups.c (reggroup_gdbarch_new): New function. (reggroup_find): New function. * reggroups.h (reggroup_gdbarch_new): New function. (reggroup_find): New function. --- Changes since v3 * Added the reggroup_find function. gdb/reggroups.c | 29 +++++++++++++++++++++++++++++ gdb/reggroups.h | 5 +++++ 2 files changed, 34 insertions(+) diff --git a/gdb/reggroups.c b/gdb/reggroups.c index 5d5e33f2a3..4e6b452f88 100644 --- a/gdb/reggroups.c +++ b/gdb/reggroups.c @@ -46,6 +46,18 @@ reggroup_new (const char *name, enum reggroup_type type) return group; } +struct reggroup * +reggroup_gdbarch_new (struct gdbarch *gdbarch, const char *name, + enum reggroup_type type) +{ + struct reggroup *group = GDBARCH_OBSTACK_ZALLOC (gdbarch, + struct reggroup); + + group->name = gdbarch_obstack_strdup (gdbarch, name); + group->type = type; + return group; +} + /* Register group attributes. */ const char * @@ -201,6 +213,23 @@ default_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return 0; } +/* Find a reggroup by name. */ + +reggroup * +reggroup_find (struct gdbarch *gdbarch, const char *name) +{ + struct reggroup *group; + + for (group = reggroup_next (gdbarch, NULL); + group != NULL; + group = reggroup_next (gdbarch, group)) + { + if (strcmp (name, reggroup_name (group)) == 0) + return group; + } + return NULL; +} + /* Dump out a table of register groups for the current architecture. */ static void diff --git a/gdb/reggroups.h b/gdb/reggroups.h index 18fc1bf294..5cfa51abff 100644 --- a/gdb/reggroups.h +++ b/gdb/reggroups.h @@ -41,6 +41,10 @@ extern struct reggroup *const restore_reggroup; /* Create a new local register group. */ extern struct reggroup *reggroup_new (const char *name, enum reggroup_type type); +/* Create a new register group allocated onto the gdbarch obstack. */ +extern struct reggroup *reggroup_gdbarch_new (struct gdbarch *gdbarch, + const char *name, + enum reggroup_type type); /* Add a register group (with attribute values) to the pre-defined list. */ extern void reggroup_add (struct gdbarch *gdbarch, struct reggroup *group); @@ -57,6 +61,7 @@ extern struct reggroup *reggroup_next (struct gdbarch *gdbarch, struct reggroup *last); extern struct reggroup *reggroup_prev (struct gdbarch *gdbarch, struct reggroup *curr); +extern reggroup *reggroup_find (struct gdbarch *gdbarch, const char *name); /* Is REGNUM a member of REGGROUP? */ extern int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,