Remove last cleanups from stabsread.c
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. 2019-03-06 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.
This commit is contained in:
parent
6cceac9414
commit
61b3009970
@ -1,3 +1,15 @@
|
||||
2019-03-06 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.
|
||||
|
||||
2019-03-06 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* nat/linux-namespaces.c (linux_mntns_access_fs): Use SCOPE_EXIT.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user