From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-il1-x131.google.com (mail-il1-x131.google.com [IPv6:2607:f8b0:4864:20::131]) by sourceware.org (Postfix) with ESMTPS id E54943858C78 for ; Tue, 15 Mar 2022 13:25:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E54943858C78 Received: by mail-il1-x131.google.com with SMTP id q6so576141ilv.6 for ; Tue, 15 Mar 2022 06:25:03 -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:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/iZvFEKYxX6JFeJJ+mDYOJ26wfzhma1USgfY2xSyYTc=; b=Sed8WJpqG0C9S1YQegqaJhUW4e15xFXPtTcBYqfRnnFtteh1GDsTaaaCHpdeqn8dMD s9TGTYi8HRBlQqETdDZeHQ/roAmbrWw0a/BA8OuPAFioUJxzwA9ZSZZ1wHqM6onfeyoh tWjtF+BDFuwl4XVko1RTMueyoSgWgFjDJwOtwJI3HxJw+cHBvClt2gGdhYHmL0rFBmik J3BwLR/jqvQIeu434aCk1UAGnk0RiB8JFx+0hkdU05r6dZBYLLMutqhAFF8QUk2aNNs2 iFSZsB1KZpSkziCZsdsKUJfWO4DxhcgBSWO2ABLGZFo0BYxb41mMBXQYZPlMAQmqVxfG 6zxA== X-Gm-Message-State: AOAM530FVodMWeZcHmUL+y4Dl1lwTvzhPp51p1zDem120fhz5axHBABc Xeq/fiui0zL2N9GXB2Jxss83aA/O86JKiA== X-Google-Smtp-Source: ABdhPJyuJyizbpuPmvvccjBH2tiViNUnZhauX/M0K/HQGhBoclSLkni5DNNnqL0y9NcIrpoaUdk5Kw== X-Received: by 2002:a05:6e02:1ca5:b0:2c6:67c8:5f6a with SMTP id x5-20020a056e021ca500b002c667c85f6amr21170172ill.45.1647350703194; Tue, 15 Mar 2022 06:25:03 -0700 (PDT) Received: from murgatroyd.Home (71-211-175-224.hlrn.qwest.net. [71.211.175.224]) by smtp.gmail.com with ESMTPSA id l14-20020a05660227ce00b00645ebb013c1sm10711430ios.45.2022.03.15.06.25.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Mar 2022 06:25:02 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 2/4] Ada support for wide strings Date: Tue, 15 Mar 2022 07:24:58 -0600 Message-Id: <20220315132500.1032991-3-tromey@adacore.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220315132500.1032991-1-tromey@adacore.com> References: <20220315132500.1032991-1-tromey@adacore.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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: Tue, 15 Mar 2022 13:25:05 -0000 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. --- 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