From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH 10/20] Remove last cleanups from stabsread.c
Date: Wed, 13 Feb 2019 21:30:00 -0000 [thread overview]
Message-ID: <20190213212927.9474-11-tom@tromey.com> (raw)
In-Reply-To: <20190213212927.9474-1-tom@tromey.com>
This removes the last cleanups from stabsread.c. Similar code in
dwarf2read.c was C++-ified, but considering that stabs are deprecated,
it seemed simpler to just change these allocations to use an obstack
and leave the data structures in place.
This patch renames field_info to stabs_field_info -- adding a
constructor here provoked a bug due to the resulting ODR violation.
gdb/ChangeLog
2019-02-13 Tom Tromey <tom@tromey.com>
* stabsread.c (struct stabs_field_info): Rename from field_info.
<list, fnlist>: Add initializers.
<obstack>: New member.
(read_member_functions, read_struct_fields, read_baseclasses):
Allocate on obstack. Don't use cleanups.
(read_one_struct_field, read_member_functions, read_struct_fields)
(read_baseclasses, read_tilde_fields, attach_fn_fields_to_type)
(attach_fields_to_type, read_cpp_abbrev, read_member_functions)
(read_struct_type): Update.
---
gdb/ChangeLog | 12 ++++++++
gdb/stabsread.c | 81 +++++++++++++++++++++----------------------------
2 files changed, 47 insertions(+), 46 deletions(-)
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index fc3db8f19b4..ac33465c13b 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -85,14 +85,16 @@ struct next_fnfieldlist
This is part of some reorganization of low level C++ support and is
expected to eventually go away... (FIXME) */
-struct field_info
+struct stab_field_info
{
- struct nextfield *list;
- struct next_fnfieldlist *fnlist;
+ struct nextfield *list = nullptr;
+ struct next_fnfieldlist *fnlist = nullptr;
+
+ auto_obstack obstack;
};
static void
-read_one_struct_field (struct field_info *, const char **, const char *,
+read_one_struct_field (struct stab_field_info *, const char **, const char *,
struct type *, struct objfile *);
static struct type *dbx_alloc_type (int[2], struct objfile *);
@@ -125,24 +127,24 @@ static struct type *read_enum_type (const char **, struct type *, struct objfile
static struct type *rs6000_builtin_type (int, struct objfile *);
static int
-read_member_functions (struct field_info *, const char **, struct type *,
+read_member_functions (struct stab_field_info *, const char **, struct type *,
struct objfile *);
static int
-read_struct_fields (struct field_info *, const char **, struct type *,
+read_struct_fields (struct stab_field_info *, const char **, struct type *,
struct objfile *);
static int
-read_baseclasses (struct field_info *, const char **, struct type *,
+read_baseclasses (struct stab_field_info *, const char **, struct type *,
struct objfile *);
static int
-read_tilde_fields (struct field_info *, const char **, struct type *,
+read_tilde_fields (struct stab_field_info *, const char **, struct type *,
struct objfile *);
-static int attach_fn_fields_to_type (struct field_info *, struct type *);
+static int attach_fn_fields_to_type (struct stab_field_info *, struct type *);
-static int attach_fields_to_type (struct field_info *, struct type *,
+static int attach_fields_to_type (struct stab_field_info *, struct type *,
struct objfile *);
static struct type *read_struct_type (const char **, struct type *,
@@ -158,7 +160,7 @@ static struct field *read_args (const char **, int, struct objfile *,
static void add_undefined_type (struct type *, int[2]);
static int
-read_cpp_abbrev (struct field_info *, const char **, struct type *,
+read_cpp_abbrev (struct stab_field_info *, const char **, struct type *,
struct objfile *);
static const char *find_name_end (const char *name);
@@ -2277,7 +2279,7 @@ stabs_method_name_from_physname (const char *physname)
Returns 1 for success, 0 for failure. */
static int
-read_member_functions (struct field_info *fip, const char **pp,
+read_member_functions (struct stab_field_info *fip, const char **pp,
struct type *type, struct objfile *objfile)
{
int nfn_fields = 0;
@@ -2317,8 +2319,7 @@ read_member_functions (struct field_info *fip, const char **pp,
look_ahead_type = NULL;
length = 0;
- new_fnlist = XCNEW (struct next_fnfieldlist);
- make_cleanup (xfree, new_fnlist);
+ new_fnlist = OBSTACK_ZALLOC (&fip->obstack, struct next_fnfieldlist);
if ((*pp)[0] == 'o' && (*pp)[1] == 'p' && is_cplus_marker ((*pp)[2]))
{
@@ -2357,8 +2358,7 @@ read_member_functions (struct field_info *fip, const char **pp,
do
{
- new_sublist = XCNEW (struct next_fnfield);
- make_cleanup (xfree, new_sublist);
+ new_sublist = OBSTACK_ZALLOC (&fip->obstack, struct next_fnfield);
/* Check for and handle cretinous dbx symbol name continuation! */
if (look_ahead_type == NULL)
@@ -2642,8 +2642,8 @@ read_member_functions (struct field_info *fip, const char **pp,
/* Create a new fn_fieldlist for the destructors. */
- destr_fnlist = XCNEW (struct next_fnfieldlist);
- make_cleanup (xfree, destr_fnlist);
+ destr_fnlist = OBSTACK_ZALLOC (&fip->obstack,
+ struct next_fnfieldlist);
destr_fnlist->fn_fieldlist.name
= obconcat (&objfile->objfile_obstack, "~",
@@ -2743,8 +2743,8 @@ read_member_functions (struct field_info *fip, const char **pp,
keep parsing and it's time for error_type(). */
static int
-read_cpp_abbrev (struct field_info *fip, const char **pp, struct type *type,
- struct objfile *objfile)
+read_cpp_abbrev (struct stab_field_info *fip, const char **pp,
+ struct type *type, struct objfile *objfile)
{
const char *p;
const char *name;
@@ -2838,8 +2838,9 @@ read_cpp_abbrev (struct field_info *fip, const char **pp, struct type *type,
}
static void
-read_one_struct_field (struct field_info *fip, const char **pp, const char *p,
- struct type *type, struct objfile *objfile)
+read_one_struct_field (struct stab_field_info *fip, const char **pp,
+ const char *p, struct type *type,
+ struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
@@ -2981,8 +2982,8 @@ read_one_struct_field (struct field_info *fip, const char **pp, const char *p,
Returns 1 for success, 0 for failure. */
static int
-read_struct_fields (struct field_info *fip, const char **pp, struct type *type,
- struct objfile *objfile)
+read_struct_fields (struct stab_field_info *fip, const char **pp,
+ struct type *type, struct objfile *objfile)
{
const char *p;
struct nextfield *newobj;
@@ -3001,8 +3002,7 @@ read_struct_fields (struct field_info *fip, const char **pp, struct type *type,
{
STABS_CONTINUE (pp, objfile);
/* Get space to record the next field's data. */
- newobj = XCNEW (struct nextfield);
- make_cleanup (xfree, newobj);
+ newobj = OBSTACK_ZALLOC (&fip->obstack, struct nextfield);
newobj->next = fip->list;
fip->list = newobj;
@@ -3079,8 +3079,8 @@ read_struct_fields (struct field_info *fip, const char **pp, struct type *type,
static int
-read_baseclasses (struct field_info *fip, const char **pp, struct type *type,
- struct objfile *objfile)
+read_baseclasses (struct stab_field_info *fip, const char **pp,
+ struct type *type, struct objfile *objfile)
{
int i;
struct nextfield *newobj;
@@ -3123,8 +3123,7 @@ read_baseclasses (struct field_info *fip, const char **pp, struct type *type,
for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
{
- newobj = XCNEW (struct nextfield);
- make_cleanup (xfree, newobj);
+ newobj = OBSTACK_ZALLOC (&fip->obstack, struct nextfield);
newobj->next = fip->list;
fip->list = newobj;
@@ -3203,8 +3202,8 @@ read_baseclasses (struct field_info *fip, const char **pp, struct type *type,
so we can look for the vptr base class info. */
static int
-read_tilde_fields (struct field_info *fip, const char **pp, struct type *type,
- struct objfile *objfile)
+read_tilde_fields (struct stab_field_info *fip, const char **pp,
+ struct type *type, struct objfile *objfile)
{
const char *p;
@@ -3286,7 +3285,7 @@ read_tilde_fields (struct field_info *fip, const char **pp, struct type *type,
}
static int
-attach_fn_fields_to_type (struct field_info *fip, struct type *type)
+attach_fn_fields_to_type (struct stab_field_info *fip, struct type *type)
{
int n;
@@ -3305,7 +3304,7 @@ attach_fn_fields_to_type (struct field_info *fip, struct type *type)
for this class's virtual functions. */
static int
-attach_fields_to_type (struct field_info *fip, struct type *type,
+attach_fields_to_type (struct stab_field_info *fip, struct type *type,
struct objfile *objfile)
{
int nfields = 0;
@@ -3474,11 +3473,7 @@ static struct type *
read_struct_type (const char **pp, struct type *type, enum type_code type_code,
struct objfile *objfile)
{
- struct cleanup *back_to;
- struct field_info fi;
-
- fi.list = NULL;
- fi.fnlist = NULL;
+ struct stab_field_info fi;
/* When describing struct/union/class types in stabs, G++ always drops
all qualifications from the name. So if you've got:
@@ -3500,8 +3495,6 @@ read_struct_type (const char **pp, struct type *type, enum type_code type_code,
return type;
}
- back_to = make_cleanup (null_cleanup, 0);
-
INIT_CPLUS_SPECIFIC (type);
TYPE_CODE (type) = type_code;
TYPE_STUB (type) = 0;
@@ -3513,10 +3506,7 @@ read_struct_type (const char **pp, struct type *type, enum type_code type_code,
TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
if (nbits != 0)
- {
- do_cleanups (back_to);
- return error_type (pp, objfile);
- }
+ return error_type (pp, objfile);
set_length_in_type_chain (type);
}
@@ -3535,7 +3525,6 @@ read_struct_type (const char **pp, struct type *type, enum type_code type_code,
type = error_type (pp, objfile);
}
- do_cleanups (back_to);
return (type);
}
--
2.17.2
next prev parent reply other threads:[~2019-02-13 21:29 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-13 21:29 [PATCH 00/20] Remove cleanups Tom Tromey
2019-02-13 21:29 ` [PATCH 05/20] Remove last cleanup from gdbserver Tom Tromey
2019-02-13 21:29 ` [PATCH 16/20] Remove some now-dead exception code Tom Tromey
2019-02-13 21:29 ` [PATCH 14/20] Make exceptions use std::string and be self-managing Tom Tromey
2019-02-13 21:29 ` [PATCH 07/20] Remove last cleanups from solib-svr4.c Tom Tromey
2019-02-13 21:29 ` [PATCH 12/20] Remove free_current_contents Tom Tromey
2019-02-13 21:29 ` [PATCH 03/20] Change displaced_step_clear_cleanup with a forward_scope_exit Tom Tromey
2019-02-13 21:29 ` [PATCH 20/20] Introduce and use bcache_up Tom Tromey
2019-02-13 21:29 ` [PATCH 11/20] Remove basic cleanup code Tom Tromey
2019-02-13 21:29 ` [PATCH 01/20] Remove cleanups from coffread.c Tom Tromey
2019-02-13 21:29 ` [PATCH 06/20] Remove cleanup from solib-svr4.c Tom Tromey
2019-02-13 21:29 ` [PATCH 17/20] Make exception throwing a bit more efficient Tom Tromey
2019-02-13 21:30 ` [PATCH 09/20] Remove last cleanup from linux-namespaces.c Tom Tromey
2019-02-13 21:30 ` [PATCH 18/20] Replace throw_exception with throw in some cases Tom Tromey
2019-02-13 21:30 ` Tom Tromey [this message]
2019-02-13 21:30 ` [PATCH 04/20] C++ify remote notification code Tom Tromey
2019-02-13 21:30 ` [PATCH 02/20] Update two cleanup comments Tom Tromey
2019-02-13 21:30 ` [PATCH 08/20] Remove last cleanup solib-aix.c Tom Tromey
2019-02-13 21:30 ` [PATCH 15/20] Rewrite TRY/CATCH Tom Tromey
2019-02-13 21:30 ` [PATCH 13/20] Simplify exception handling Tom Tromey
2019-02-13 21:49 ` [PATCH 00/20] Remove cleanups John Baldwin
2019-02-14 14:48 ` Tom Tromey
2019-02-14 20:38 ` John Baldwin
2019-02-14 22:49 ` Tom Tromey
2019-02-14 22:55 ` John Baldwin
2019-02-14 15:34 ` Pedro Alves
2019-02-14 16:35 ` Tom Tromey
2019-02-13 21:53 ` [PATCH 19/20] Use SCOPE_EXIT in write_gcore_file Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190213212927.9474-11-tom@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox