From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28544 invoked by alias); 17 Apr 2012 13:57:29 -0000 Received: (qmail 28524 invoked by uid 22791); 17 Apr 2012 13:57:27 -0000 X-SWARE-Spam-Status: No, hits=-7.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 17 Apr 2012 13:57:13 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q3HDvC4a029973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 17 Apr 2012 09:57:13 -0400 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q3HDvBqk015861; Tue, 17 Apr 2012 09:57:11 -0400 Message-ID: <4F8D76B7.90709@redhat.com> Date: Tue, 17 Apr 2012 13:59:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1 MIME-Version: 1.0 To: Jan Kratochvil CC: gdb-patches@sourceware.org, Siddhesh Poyarekar Subject: Re: [commit] Do not rely on FIELD_LOC_KIND_BITPOS being zero References: <20120417124410.GA15356@host2.jankratochvil.net> <4F8D695E.7070002@redhat.com> <20120417131559.GA25248@host2.jankratochvil.net> In-Reply-To: <20120417131559.GA25248@host2.jankratochvil.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-04/txt/msg00467.txt.bz2 On 04/17/2012 02:15 PM, Jan Kratochvil wrote: > On Tue, 17 Apr 2012 15:00:14 +0200, Pedro Alves wrote: >> We could make the compiler catch these by making the macro return an rvalue. > > With C++ getters and constructors-with-parameters such problem would have > never exist. Nor with C getters and setters with opaque types. Nor with Java getters/setters. It would however still exist with a field.bitpos C# property, as that'd allow the += style. Tested on x86_64 Fedora 16, and applied. 2012-04-17 Pedro Alves * gdbtypes.h (FIELD_BITPOS): Rename to ... (FIELD_BITPOS_LVAL): ... this. (FIELD_BITPOS): New. (SET_FIELD_BITPOS): Adjust to use FIELD_BITPOS_LVAL. * dwarf2read.c (dwarf2_add_field): Use SET_FIELD_BITPOS. * gdbtypes.c (append_composite_type_field_aligned): Adjust to use SET_FIELD_BITPOS. * gnu-v3-abi.c (build_gdb_vtable_type): Adjust to use SET_FIELD_BITPOS. * stabsread.c (read_cpp_abbrev, read_one_struct_field) (read_baseclasses): Adjust to use SET_FIELD_BITPOS. * target-descriptions.c (tdesc_gdb_type): Adjust to use SET_FIELD_BITPOS. --- gdb/dwarf2read.c | 8 +++++--- gdb/gdbtypes.c | 9 +++++---- gdb/gdbtypes.h | 5 +++-- gdb/gnu-v3-abi.c | 8 ++++---- gdb/stabsread.c | 9 +++++---- gdb/target-descriptions.c | 4 ++-- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 0e211ae..eec52fb 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -7066,7 +7066,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, anonymous object to the MSB of the field. We don't have to do anything special since we don't need to know the size of the anonymous object. */ - FIELD_BITPOS (*fp) += DW_UNSND (attr); + SET_FIELD_BITPOS (*fp, FIELD_BITPOS (*fp) + DW_UNSND (attr)); } else { @@ -7095,8 +7095,10 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, bit field. */ anonymous_size = TYPE_LENGTH (fp->type); } - FIELD_BITPOS (*fp) += anonymous_size * bits_per_byte - - bit_offset - FIELD_BITSIZE (*fp); + SET_FIELD_BITPOS (*fp, + (FIELD_BITPOS (*fp) + + anonymous_size * bits_per_byte + - bit_offset - FIELD_BITSIZE (*fp))); } } diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 90e33a5..d772d9a 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -3666,9 +3666,10 @@ append_composite_type_field_aligned (struct type *t, char *name, TYPE_LENGTH (t) = TYPE_LENGTH (t) + TYPE_LENGTH (field); if (TYPE_NFIELDS (t) > 1) { - FIELD_BITPOS (f[0]) = (FIELD_BITPOS (f[-1]) - + (TYPE_LENGTH (FIELD_TYPE (f[-1])) - * TARGET_CHAR_BIT)); + SET_FIELD_BITPOS (f[0], + (FIELD_BITPOS (f[-1]) + + (TYPE_LENGTH (FIELD_TYPE (f[-1])) + * TARGET_CHAR_BIT))); if (alignment) { @@ -3679,7 +3680,7 @@ append_composite_type_field_aligned (struct type *t, char *name, if (left) { - FIELD_BITPOS (f[0]) += (alignment - left); + SET_FIELD_BITPOS (f[0], FIELD_BITPOS (f[0]) + (alignment - left)); TYPE_LENGTH (t) += (alignment - left) / TARGET_CHAR_BIT; } } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 07c3a86..a2b2432 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1087,13 +1087,14 @@ extern void allocate_gnat_aux_type (struct type *); #define FIELD_TYPE(thisfld) ((thisfld).type) #define FIELD_NAME(thisfld) ((thisfld).name) #define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind) -#define FIELD_BITPOS(thisfld) ((thisfld).loc.bitpos) +#define FIELD_BITPOS_LVAL(thisfld) ((thisfld).loc.bitpos) +#define FIELD_BITPOS(thisfld) (FIELD_BITPOS_LVAL (thisfld) + 0) #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr) #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block) #define SET_FIELD_BITPOS(thisfld, bitpos) \ (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_BITPOS, \ - FIELD_BITPOS (thisfld) = (bitpos)) + FIELD_BITPOS_LVAL (thisfld) = (bitpos)) #define SET_FIELD_PHYSNAME(thisfld, name) \ (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \ FIELD_STATIC_PHYSNAME (thisfld) = (name)) diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index 1095c60..ed94b84 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -130,28 +130,28 @@ build_gdb_vtable_type (struct gdbarch *arch) /* ptrdiff_t vcall_and_vbase_offsets[0]; */ FIELD_NAME (*field) = "vcall_and_vbase_offsets"; FIELD_TYPE (*field) = lookup_array_range_type (ptrdiff_type, 0, -1); - FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT; + SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); offset += TYPE_LENGTH (FIELD_TYPE (*field)); field++; /* ptrdiff_t offset_to_top; */ FIELD_NAME (*field) = "offset_to_top"; FIELD_TYPE (*field) = ptrdiff_type; - FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT; + SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); offset += TYPE_LENGTH (FIELD_TYPE (*field)); field++; /* void *type_info; */ FIELD_NAME (*field) = "type_info"; FIELD_TYPE (*field) = void_ptr_type; - FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT; + SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); offset += TYPE_LENGTH (FIELD_TYPE (*field)); field++; /* void (*virtual_functions[0]) (); */ FIELD_NAME (*field) = "virtual_functions"; FIELD_TYPE (*field) = lookup_array_range_type (ptr_to_void_fn_type, 0, -1); - FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT; + SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); offset += TYPE_LENGTH (FIELD_TYPE (*field)); field++; diff --git a/gdb/stabsread.c b/gdb/stabsread.c index 39e0d7b..40b2465 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -2830,8 +2830,8 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type, { int nbits; - FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits, - 0); + SET_FIELD_BITPOS (fip->list->field, + read_huge_number (pp, ';', &nbits, 0)); if (nbits != 0) return 0; } @@ -2907,7 +2907,8 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p, { int nbits; - FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits, 0); + SET_FIELD_BITPOS (fip->list->field, + read_huge_number (pp, ',', &nbits, 0)); if (nbits != 0) { stabs_general_complaint ("bad structure-type format"); @@ -3187,7 +3188,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type, corresponding to this baseclass. Always zero in the absence of multiple inheritance. */ - FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits, 0); + SET_FIELD_BITPOS (new->field, read_huge_number (pp, ',', &nbits, 0)); if (nbits != 0) return 0; } diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index cbcca76..0b12e3e 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -657,9 +657,9 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type) bitsize = f->end - f->start + 1; total_size = tdesc_type->u.u.size * TARGET_CHAR_BIT; if (gdbarch_bits_big_endian (gdbarch)) - FIELD_BITPOS (fld[0]) = total_size - f->start - bitsize; + SET_FIELD_BITPOS (fld[0], total_size - f->start - bitsize); else - FIELD_BITPOS (fld[0]) = f->start; + SET_FIELD_BITPOS (fld[0], f->start); FIELD_BITSIZE (fld[0]) = bitsize; } else