From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 5F7123857806 for ; Wed, 16 Mar 2022 12:12:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5F7123857806 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-407-6rKsIX81MiWVROdKuSMOxQ-1; Wed, 16 Mar 2022 08:12:41 -0400 X-MC-Unique: 6rKsIX81MiWVROdKuSMOxQ-1 Received: by mail-wm1-f71.google.com with SMTP id v67-20020a1cac46000000b00383e71bb26fso646940wme.1 for ; Wed, 16 Mar 2022 05:12:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=eu9S66CZAwBv4ddDSAxPWC/68hGRnl2qKl1oIdjC9fo=; b=5A4i+EKq/BpByKQuVQ8kd5ooLZKoSEwX+MNGwQCCBNV3ZUphsDJaPiM/1WtOxUKUe/ 3ujUjmiORK5sEjA1tOlv+6Q/SKf/H+bkKOpWCCt/KBc42lfuwDi7XOJhdRiByJZpML7/ cWri+t/ZAdD9liyWljPhHbZu3pDJY8ABIgrfgbpI2eWgZyqh2rpqZuU7aPokIPXfnC20 6x3tbqggcywv1b6h0RyO9uEksQKo0EjCVCP7ON4HYKI7umvqCgUqB/e/MgMn4nR6smvt hdMYaPm22hy+tq5xuJVzyHrQiOlxY2kmPRHzSz+kS5XnD4OZKo+/TKblBX9Tw4LzQVWV lUxg== X-Gm-Message-State: AOAM533XzdNtwt5LNMz3RqdY6TCW0BE7euC3/OJxQ7/7xyE47eat4O/L RX4LSF/IRqAjvZ45sOMWacVQUwcNhUTxL605ysZyDt4ssZuA0CDTrLr8RwTrLIhapVnGeTuIQ+Z ceRQWAvI3RJmfTo2zQmsiP19JDQt9IN8W9SzJb/9L4nOB5KdvJ8mwnVDMT5Zb86vF+L0PCFdlNw == X-Received: by 2002:a05:600c:14a:b0:389:948e:eb2f with SMTP id w10-20020a05600c014a00b00389948eeb2fmr7055767wmm.141.1647432760342; Wed, 16 Mar 2022 05:12:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwaWdRO06/WGeQdDiau0aRGS9yqqhvZEWn86QZin+2vLzVv56ubisgC14TQEahdnIPx37lZDw== X-Received: by 2002:a05:600c:14a:b0:389:948e:eb2f with SMTP id w10-20020a05600c014a00b00389948eeb2fmr7055749wmm.141.1647432760101; Wed, 16 Mar 2022 05:12:40 -0700 (PDT) Received: from localhost (host109-154-72-186.range109-154.btcentralplus.com. [109.154.72.186]) by smtp.gmail.com with ESMTPSA id o14-20020a5d47ce000000b00203e0a21c16sm1474155wrc.3.2022.03.16.05.12.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Mar 2022 05:12:39 -0700 (PDT) From: Andrew Burgess To: Tom Tromey via Gdb-patches , gdb-patches@sourceware.org Cc: Tom Tromey Subject: Re: [PATCH 2/4] Ada support for wide strings In-Reply-To: <20220315132500.1032991-3-tromey@adacore.com> References: <20220315132500.1032991-1-tromey@adacore.com> <20220315132500.1032991-3-tromey@adacore.com> Date: Wed, 16 Mar 2022 12:12:38 +0000 Message-ID: <87y21at7t5.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, 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: Wed, 16 Mar 2022 12:12:44 -0000 Tom Tromey via Gdb-patches writes: > This adds some basic support for Wide_String and Wide_Wide_String to > the Ada expression evaluator. In particular, a string literal may be > converted to a wide or wide-wide string depending on context. > > The patch updates an existing test case. Note that another test, > namely something like: > > ptype Wide_Wide_String'("literal") > > ... would be nice to add, but when tested against a distro GNAT, this > did not work (probably due to lack of debuginfo); so, I haven't > included it here. LGTM. Thanks, Andrew > --- > gdb/ada-lang.c | 63 +++++++++++++++++++++++--- > gdb/testsuite/gdb.ada/widewide.exp | 4 ++ > gdb/testsuite/gdb.ada/widewide/foo.adb | 2 + > 3 files changed, 63 insertions(+), 6 deletions(-) > > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c > index 12ff0353829..f097ad4b6f7 100644 > --- a/gdb/ada-lang.c > +++ b/gdb/ada-lang.c > @@ -10603,12 +10603,63 @@ ada_string_operation::evaluate (struct type *expect_type, > struct expression *exp, > enum noside noside) > { > - value *result = string_operation::evaluate (expect_type, exp, noside); > - /* The result type will have code OP_STRING, bashed there from > - OP_ARRAY. Bash it back. */ > - if (value_type (result)->code () == TYPE_CODE_STRING) > - value_type (result)->set_code (TYPE_CODE_ARRAY); > - return result; > + struct type *char_type; > + if (expect_type != nullptr && ada_is_string_type (expect_type)) > + char_type = ada_array_element_type (expect_type, 1); > + else > + char_type = language_string_char_type (exp->language_defn, exp->gdbarch); > + > + const std::string &str = std::get<0> (m_storage); > + const char *encoding; > + switch (TYPE_LENGTH (char_type)) > + { > + case 1: > + { > + /* Simply copy over the data -- this isn't perhaps strictly > + correct according to the encodings, but it is gdb's > + historical behavior. */ > + struct type *stringtype > + = lookup_array_range_type (char_type, 1, str.length ()); > + struct value *val = allocate_value (stringtype); > + memcpy (value_contents_raw (val).data (), str.c_str (), > + str.length ()); > + return val; > + } > + > + case 2: > + if (gdbarch_byte_order (exp->gdbarch) == BFD_ENDIAN_BIG) > + encoding = "UTF-16BE"; > + else > + encoding = "UTF-16LE"; > + break; > + > + case 4: > + if (gdbarch_byte_order (exp->gdbarch) == BFD_ENDIAN_BIG) > + encoding = "UTF-32BE"; > + else > + encoding = "UTF-32LE"; > + break; > + > + default: > + error (_("unexpected character type size %s"), > + pulongest (TYPE_LENGTH (char_type))); > + } > + > + auto_obstack converted; > + convert_between_encodings (host_charset (), encoding, > + (const gdb_byte *) str.c_str (), > + str.length (), 1, > + &converted, translit_none); > + > + struct type *stringtype > + = lookup_array_range_type (char_type, 1, > + obstack_object_size (&converted) > + / TYPE_LENGTH (char_type)); > + struct value *val = allocate_value (stringtype); > + memcpy (value_contents_raw (val).data (), > + obstack_base (&converted), > + obstack_object_size (&converted)); > + return val; > } > > value * > diff --git a/gdb/testsuite/gdb.ada/widewide.exp b/gdb/testsuite/gdb.ada/widewide.exp > index c0268f9c99b..d68a0b112c4 100644 > --- a/gdb/testsuite/gdb.ada/widewide.exp > +++ b/gdb/testsuite/gdb.ada/widewide.exp > @@ -43,3 +43,7 @@ gdb_test "print my_wws(1)" "= 32 ' '" > > gdb_test "print my_wws(2)" "= 104 'h'" > > +gdb_test "print my_wws = \" helo\"" " = true" > + > +gdb_test "print my_ws = \"wide\"" " = true" > +gdb_test "print my_ws = \"nope\"" " = false" > diff --git a/gdb/testsuite/gdb.ada/widewide/foo.adb b/gdb/testsuite/gdb.ada/widewide/foo.adb > index 45adbde20a1..d41734a485f 100644 > --- a/gdb/testsuite/gdb.ada/widewide/foo.adb > +++ b/gdb/testsuite/gdb.ada/widewide/foo.adb > @@ -19,9 +19,11 @@ procedure Foo is > Some_Easy : Wide_Wide_Character := 'J'; > Some_Larger : Wide_Wide_Character := Wide_Wide_Character'Val(16#beef#); > Some_Big : Wide_Wide_Character := Wide_Wide_Character'Val(16#00dabeef#); > + My_Ws : Wide_String := "wide"; > My_WWS : Wide_Wide_String := " helo"; > begin > Do_Nothing (Some_Easy'Address); -- START > Do_Nothing (Some_Larger'Address); > + Do_Nothing (My_Ws'Address); > Do_Nothing (Some_Big'Address); > end Foo; > -- > 2.34.1