From patchwork Fri Aug 1 21:04:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kratochvil X-Patchwork-Id: 2288 Received: (qmail 8039 invoked by alias); 1 Aug 2014 21:05:03 -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 8026 invoked by uid 89); 1 Aug 2014 21:05:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.3 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 01 Aug 2014 21:05:01 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s71L4rlB025174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Aug 2014 17:04:53 -0400 Received: from host2.jankratochvil.net (ovpn-116-57.ams2.redhat.com [10.36.116.57]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s71L4fqP001408 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 1 Aug 2014 17:04:44 -0400 Date: Fri, 1 Aug 2014 23:04:37 +0200 From: Jan Kratochvil To: Keven Boell Cc: gdb-patches@sourceware.org, sanimir.agovic@intel.com Subject: [patch 2/2] Re: Crash regression(?) printing Fortran strings in bt [Re: [V2 00/23] Fortran dynamic array support] Message-ID: <20140801210437.GA26082@host2.jankratochvil.net> References: <1405070495-6948-1-git-send-email-keven.boell@intel.com> <20140729183023.GA17443@host2.jankratochvil.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20140729183023.GA17443@host2.jankratochvil.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes Hi Keven, in this patch I have tried to implement some sanity checking so that there cannot happen what happened. Unfortunately it has many regression in normal testcases, it would need to be tuned more. But IMO it would be worth to implement some such checks, it is easy to forget calling some dynamic-resolve. Thanks, Jan diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index fbf13ce..145445f 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -14272,8 +14272,8 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) } else { - TYPE_HIGH_BOUND (range_type) = DW_UNSND (attr); TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; + TYPE_HIGH_BOUND (range_type) = DW_UNSND (attr); } } else @@ -14283,13 +14283,13 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { - TYPE_HIGH_BOUND (range_type) = DW_UNSND (attr); TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; + TYPE_HIGH_BOUND (range_type) = DW_UNSND (attr); } else { - TYPE_HIGH_BOUND (range_type) = 1; TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; + TYPE_HIGH_BOUND (range_type) = 1; } } diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 53cae2c..cf7ac26 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2001,6 +2002,16 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr) return resolve_dynamic_type_internal (type, addr, 1); } +/* See gdbtypes.h */ + +LONGEST * +dynamic_prop_get_const_val_ptr (struct dynamic_prop *prop) +{ + gdb_assert (prop->kind == PROP_CONST); + + return &prop->data.const_val; +} + /* Find the real type of TYPE. This function returns the real type, after removing all layers of typedefs, and completing opaque or stub types. Completion changes the TYPE argument, but stripping of diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 436edf8..78c8003 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1212,9 +1212,9 @@ extern void allocate_gnat_aux_type (struct type *); #define TYPE_INDEX_TYPE(type) TYPE_FIELD_TYPE (type, 0) #define TYPE_RANGE_DATA(thistype) TYPE_MAIN_TYPE(thistype)->flds_bnds.bounds #define TYPE_LOW_BOUND(range_type) \ - TYPE_RANGE_DATA(range_type)->low.data.const_val + (*dynamic_prop_get_const_val_ptr (&TYPE_RANGE_DATA(range_type)->low)) #define TYPE_HIGH_BOUND(range_type) \ - TYPE_RANGE_DATA(range_type)->high.data.const_val + (*dynamic_prop_get_const_val_ptr (&TYPE_RANGE_DATA(range_type)->high)) #define TYPE_LOW_BOUND_UNDEFINED(range_type) \ (TYPE_RANGE_DATA(range_type)->low.kind == PROP_UNDEFINED) #define TYPE_HIGH_BOUND_UNDEFINED(range_type) \ @@ -1224,13 +1224,7 @@ extern void allocate_gnat_aux_type (struct type *); #define TYPE_LOW_BOUND_KIND(range_type) \ TYPE_RANGE_DATA(range_type)->low.kind #define TYPE_BYTE_STRIDE(range_type) \ - TYPE_RANGE_DATA(range_type)->stride.data.const_val -#define TYPE_BYTE_STRIDE_BLOCK(range_type) \ - TYPE_RANGE_DATA(range_type)->stride.data.locexpr -#define TYPE_BYTE_STRIDE_LOCLIST(range_type) \ - TYPE_RANGE_DATA(range_type)->stride.data.loclist -#define TYPE_BYTE_STRIDE_KIND(range_type) \ - TYPE_RANGE_DATA(range_type)->stride.kind + (*dynamic_prop_get_const_val_ptr (&TYPE_RANGE_DATA(range_type)->stride)) /* Attribute accessors for the type data location. */ @@ -1767,6 +1761,10 @@ extern struct type *resolve_dynamic_type (struct type *type, CORE_ADDR addr); /* * Predicate if the type has dynamic values, which are not resolved yet. */ extern int is_dynamic_type (struct type *type); +/* Fetch const_val reference from PROP. It is never dynamically resolved, + the correct KIND is checked by gdb_assert. */ +extern LONGEST *dynamic_prop_get_const_val_ptr (struct dynamic_prop *prop); + extern struct type *check_typedef (struct type *); #define CHECK_TYPEDEF(TYPE) \