From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by sourceware.org (Postfix) with ESMTPS id 4395A385781C for ; Sun, 13 Mar 2022 05:08:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4395A385781C Received: by mail-wm1-x32c.google.com with SMTP id m42-20020a05600c3b2a00b00382ab337e14so9934924wms.3 for ; Sat, 12 Mar 2022 21:08:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=cZtBnDMurbWh8oJGXkbfqxFdxsTwcnEFFu+Oyg2YhOI=; b=n1NLWQUsFtXvo5H0RqYSAfjJjO+AIpip7/pkfx3RN+mSdtLYoyV5L5iUd+pk0oTU6Z I6W0onbiZJPklVlfvvjOPE9tFSgUlTn+Y+vNAma7VY2a6W5Cdvz86r9AtPtbay3nNtmE 2rYOlRWzjlT2gSk7sQLG9VUKvaSlpwHisRacLUnkTuVHGGrsu8G1zniQf3GMXfEGL1Di NBuVyK3tCW0KNbhhM5VLzPW8FxWRebMTSuE/M9ReOkCwj9Us9/oBpRmN359aSTno+AG8 cT/jn0A8OoCQpELPODyOBxN0n9r87LLl2XLhUuLGc4p8O2WreCriTij0sAfx1BtuX++3 H4mA== X-Gm-Message-State: AOAM5323W9rmonrNN2ItmjVXuNzxiWTLvVw3eFsSai33cVQGazqzFcFN s3CTQ+JpJW/oHU/GaQxpdW2VevPoy3A9 X-Google-Smtp-Source: ABdhPJzza7UhgAQjEj34FluveKVv6lqGU9k6DkbV/2rSTve094WSLKgz/GhvcmGKX0tjDIrIq2Qimg== X-Received: by 2002:a05:600c:348d:b0:389:bc83:8ac5 with SMTP id a13-20020a05600c348d00b00389bc838ac5mr21323918wmq.55.1647148080938; Sat, 12 Mar 2022 21:08:00 -0800 (PST) Received: from takamaka.home ([2a01:cb22:1d5:1100:649a:6ea9:3e07:fe1f]) by smtp.gmail.com with ESMTPSA id p11-20020adf9d8b000000b001f063deef80sm10150826wre.86.2022.03.12.21.08.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Mar 2022 21:08:00 -0800 (PST) Received: by takamaka.home (Postfix, from userid 1000) id E96B3A4AD3; Sun, 13 Mar 2022 09:07:57 +0400 (+04) Date: Sun, 13 Mar 2022 09:07:57 +0400 From: Joel Brobecker To: Tom Tromey via Gdb-patches Cc: Tom Tromey , Joel Brobecker Subject: Re: [PATCH] Correctly print subrange types in generic_value_print Message-ID: References: <20220310162556.430085-1-tromey@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220310162556.430085-1-tromey@adacore.com> X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2022 05:08:04 -0000 Hi Tom, On Thu, Mar 10, 2022 at 09:25:56AM -0700, Tom Tromey via Gdb-patches wrote: > I noticed that generic_value_print assumes that a subrange type is > always a subrange of an integer type. However, this isn't necessarily > the case. In Ada, for example, one has subranges of character and > enumeration types. > > This code isn't often exercised, I think, because languages with real > subrange types tend to implement their own printers. However, it > still seemed worth fixing. Agreed. Thanks for the patch and the testcase, it looks good to me. > --- > gdb/testsuite/gdb.dwarf2/subrange-enum.exp | 78 ++++++++++++++++++++++ > gdb/valprint.c | 9 ++- > 2 files changed, 86 insertions(+), 1 deletion(-) > create mode 100644 gdb/testsuite/gdb.dwarf2/subrange-enum.exp > > diff --git a/gdb/testsuite/gdb.dwarf2/subrange-enum.exp b/gdb/testsuite/gdb.dwarf2/subrange-enum.exp > new file mode 100644 > index 00000000000..b9f7cb68233 > --- /dev/null > +++ b/gdb/testsuite/gdb.dwarf2/subrange-enum.exp > @@ -0,0 +1,78 @@ > +# Copyright 2022 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see . > + > +# Test generic printing of subrange values. > + > +load_lib dwarf.exp > + > +# This test can only be run on targets which support DWARF-2 and use gas. > +if {![dwarf2_support]} { > + return 0 > +} > + > +standard_testfile main.c -dw.S > + > +# Make some DWARF for the test. > +set asm_file [standard_output_file $srcfile2] > +Dwarf::assemble $asm_file { > + cu {} { > + compile_unit {{language @DW_LANG_C}} { > + declare_labels integer_label enum_label subrange_label > + > + integer_label: DW_TAG_base_type { > + {DW_AT_byte_size 4 DW_FORM_sdata} > + {DW_AT_encoding @DW_ATE_signed} > + {DW_AT_name integer} > + } > + > + enum_label: DW_TAG_enumeration_type { > + {DW_AT_name E} > + {DW_AT_type :$integer_label} > + } { > + DW_TAG_enumerator { > + {DW_AT_name ONE} > + {DW_AT_const_value 1 DW_FORM_sdata} > + } > + DW_TAG_enumerator { > + {DW_AT_name TWO} > + {DW_AT_const_value 2 DW_FORM_sdata} > + } > + DW_TAG_enumerator { > + {DW_AT_name THREE} > + {DW_AT_const_value 3 DW_FORM_sdata} > + } > + } > + > + subrange_label: DW_TAG_subrange_type { > + {lower_bound 1 DW_FORM_sdata} > + {upper_bound 2 DW_FORM_sdata} > + {type :$enum_label} > + } > + > + DW_TAG_variable { > + {name rangeval} > + {type :$subrange_label} > + {const_value 2 DW_FORM_udata} > + } > + } > + } > +} > + > +if { [prepare_for_testing "failed to prepare" ${testfile} \ > + [list $srcfile $asm_file] {nodebug}] } { > + return -1 > +} > + > +gdb_test "print rangeval" " = TWO" > diff --git a/gdb/valprint.c b/gdb/valprint.c > index d6ec64845f4..c2ffe6224bf 100644 > --- a/gdb/valprint.c > +++ b/gdb/valprint.c > @@ -888,6 +888,14 @@ generic_value_print (struct value *val, struct ui_file *stream, int recurse, > if (is_fixed_point_type (type)) > type = type->fixed_point_type_base_type (); > > + /* Widen a subrange to its target type, then use that type's > + printer. */ > + while (type->code () == TYPE_CODE_RANGE) > + { > + type = check_typedef (TYPE_TARGET_TYPE (type)); > + val = value_cast (type, val); > + } > + > switch (type->code ()) > { > case TYPE_CODE_ARRAY: > @@ -936,7 +944,6 @@ generic_value_print (struct value *val, struct ui_file *stream, int recurse, > generic_value_print_bool (val, stream, options, decorations); > break; > > - case TYPE_CODE_RANGE: > case TYPE_CODE_INT: > generic_value_print_int (val, stream, options); > break; > -- > 2.34.1 > -- Joel