From patchwork Wed Feb 27 20:18:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 31666 Received: (qmail 121842 invoked by alias); 27 Feb 2019 20:19:51 -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 121743 invoked by uid 89); 27 Feb 2019 20:19:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=drops, vptr, 31237, qualifications X-HELO: gateway31.websitewelcome.com Received: from gateway31.websitewelcome.com (HELO gateway31.websitewelcome.com) (192.185.143.234) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 27 Feb 2019 20:19:47 +0000 Received: from cm11.websitewelcome.com (cm11.websitewelcome.com [100.42.49.5]) by gateway31.websitewelcome.com (Postfix) with ESMTP id A508A28043 for ; Wed, 27 Feb 2019 14:18:55 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id z5fLg8rZbdnCez5fLg58Zl; Wed, 27 Feb 2019 14:18:55 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=5sBW6oNA6/Ol76Cglo/Vfsn7XjU2bHpNYelYbqq25fc=; b=jIMQ7gG+SOx7kwO1embF6cLx4A u5hGzqizyGjFkFQZJOgH+UfT9g+rr1D+5wtfGiul3mCaruinQqpdASfOO/+dsjIB29cyMBsvtwkBs 2aTOsriHKE4OLO2gOrD5vm6Hn; Received: from 75-166-85-218.hlrn.qwest.net ([75.166.85.218]:36364 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1gz5fL-004Fi1-Ea; Wed, 27 Feb 2019 14:18:55 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2 10/22] Remove last cleanups from stabsread.c Date: Wed, 27 Feb 2019 13:18:37 -0700 Message-Id: <20190227201849.32210-11-tom@tromey.com> In-Reply-To: <20190227201849.32210-1-tom@tromey.com> References: <20190227201849.32210-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-27 Tom Tromey * stabsread.c (struct stabs_field_info): Rename from field_info. : Add initializers. : 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); }