From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from alt-proxy28.mail.unifiedlayer.com (alt-proxy28.mail.unifiedlayer.com [74.220.216.123]) by sourceware.org (Postfix) with ESMTPS id 240213858C5F for ; Thu, 9 Feb 2023 19:28:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 240213858C5F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com Received: from cmgw13.mail.unifiedlayer.com (unknown [10.0.90.128]) by progateway1.mail.pro1.eigbox.com (Postfix) with ESMTP id 99E2D1003FA86 for ; Thu, 9 Feb 2023 19:28:08 +0000 (UTC) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTP id QCaWpGNkvNX2aQCaWp1O1O; Thu, 09 Feb 2023 19:28:08 +0000 X-Authority-Reason: nr=8 X-Authority-Analysis: v=2.4 cv=NMAQR22g c=1 sm=1 tr=0 ts=63e54948 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=m04uMKEZRckA:10:nop_rcvd_month_year a=Qbun_eYptAEA:10:endurance_base64_authed_username_1 a=CCpqsmhAAAAA:8 a=mDV3o1hIAAAA:8 a=NEAV23lmAAAA:8 a=WTiTxWZV6t-TFMPhdbIA:9 a=ul9cdbp4aOFLsgKbc677:22 a=_FVE-zBwftR9WsbkzFJk:22 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=uQYOIwJyP8jojiGWfaFEP6VFiUK7cTT12kyaAxFtkgw=; b=UQ3oQeyGtSIWHZIV9ZZEe+GQ5o Jh2JYXvtoHWvdQvjNLQ0CUZ2B523771iduRksRfCDzEBe0GEAHbQtckQWYFmwc7B3wJRqk1zBTpQs XG5ya2vswwD1APjRXq8axZ2VA; Received: from 75-166-130-93.hlrn.qwest.net ([75.166.130.93]:44352 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pQCaW-0043uF-8q; Thu, 09 Feb 2023 12:28:08 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Fix crash with "finish" in Rust Date: Thu, 9 Feb 2023 12:27:55 -0700 Message-Id: <20230209192755.498183-1-tom@tromey.com> X-Mailer: git-send-email 2.39.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 75.166.130.93 X-Source-L: No X-Exim-ID: 1pQCaW-0043uF-8q X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 75-166-130-93.hlrn.qwest.net (localhost.localdomain) [75.166.130.93]:44352 X-Source-Auth: tom+tromey.com X-Email-Count: 4 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-3027.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: PR rust/30090 points out that a certain "finish" in a Rust program will cause gdb to crash. This happens due to some confusion about field indices in rust_language::print_enum. The fix is to use value_primitive_field so that the correct type can be passed; other spots in rust-lang.c already do this. Note that the enclosed test case comes with an xfail. This is needed because for this function, rustc doesn't follow the platform ABI. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30090 --- gdb/rust-lang.c | 2 +- gdb/testsuite/gdb.rust/finish.exp | 39 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.rust/finish.rs | 30 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.rust/finish.exp create mode 100644 gdb/testsuite/gdb.rust/finish.rs diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index f2017f95211..5b743b9e56b 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -470,7 +470,7 @@ rust_language::print_enum (struct value *val, struct ui_file *stream, } int variant_fieldno = rust_enum_variant (type); - val = value_field (val, variant_fieldno); + val = value_primitive_field (val, 0, variant_fieldno, type); struct type *variant_type = type->field (variant_fieldno).type (); int nfields = variant_type->num_fields (); diff --git a/gdb/testsuite/gdb.rust/finish.exp b/gdb/testsuite/gdb.rust/finish.exp new file mode 100644 index 00000000000..ab0250df277 --- /dev/null +++ b/gdb/testsuite/gdb.rust/finish.exp @@ -0,0 +1,39 @@ +# Copyright (C) 2023 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 a certain 'finish' in Rust. + +load_lib rust-support.exp +require allow_rust_tests + +standard_testfile .rs +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug rust}]} { + return -1 +} + +set line [gdb_get_line_number "BREAK"] +if {![runto ${srcfile}:$line]} { + untested "could not run to breakpoint" + return -1 +} + +# This 'finish' used to crash. See PR rust/30090. Also, this does +# not currently print the correct value, because rustc does not use +# the standard ABI here. This is being tracked here: +# https://github.com/rust-lang/rust/issues/85641 +setup_xfail *-*-* +gdb_test "finish" [string_to_regexp " = finish::MyResult::Some(97)"] +gdb_test "next" +gdb_test "print dei" [string_to_regexp " = finish::MyResult::Some(97)"] diff --git a/gdb/testsuite/gdb.rust/finish.rs b/gdb/testsuite/gdb.rust/finish.rs new file mode 100644 index 00000000000..e9dfcd89b0f --- /dev/null +++ b/gdb/testsuite/gdb.rust/finish.rs @@ -0,0 +1,30 @@ +// Copyright (C) 2023 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 . + +#![allow(warnings)] + +enum MyResult { + None, + Some(u32) +} + +fn return_some() -> MyResult { + MyResult::Some(97) // BREAK +} + +fn main() { + let dei = return_some(); + let another = return_some(); +} -- 2.39.1