From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 56900 invoked by alias); 31 Oct 2016 03:20:01 -0000 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 Received: (qmail 56863 invoked by uid 89); 31 Oct 2016 03:20:00 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=tom@tromey.com, U*tom, D*tromey.com, tomtromeycom X-HELO: mail-wm0-f48.google.com Received: from mail-wm0-f48.google.com (HELO mail-wm0-f48.google.com) (74.125.82.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 31 Oct 2016 03:19:49 +0000 Received: by mail-wm0-f48.google.com with SMTP id p190so123272199wmp.1 for ; Sun, 30 Oct 2016 20:19:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=hZKz0Sl4otrHxJT0kqb3Jkgj1cBgUeQT0ySDJ3jRn1o=; b=Y/s32TOQDyHtzkPKFYsB1soUXxa4R2XwtvRS60d6da/dzqj2okd1a8z9+cKNioIgiZ 7bgkU3zqQWckCrwvIZzgodnwm6/WBl6cnHAbKeXWdn27nBU1K65KPNw7S8Ev69ky5Phc AD8cUUFPPFWIijZnz5yMmYohl0MhJzvM7Y0lY7CRPgB6FVk7aWZjEMcRsbUwH5qeXq25 GcG2EzsWrx0ZWJNufyOs64+K7jVuHBCN22E5tQK0xnqALif7NYP0v9mr7pkNzmz2gIXD cmLIYmERB/Ow6rViUCfcaEoUfD9zQPkQYKR7XW0xGVDc4LGIZqnt4LktvP/7HpYymZmt UgCA== X-Gm-Message-State: ABUngvefWUA5Nz5zSALE2+OlsfxdSk44Eu5Np0dYphiEZjXrL2WfnAZtIGP1HGD5Vswwl6rScUjJNBwk1YnZrmYq X-Received: by 10.28.113.18 with SMTP id m18mr7960262wmc.101.1477883987770; Sun, 30 Oct 2016 20:19:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.131.21 with HTTP; Sun, 30 Oct 2016 20:19:27 -0700 (PDT) In-Reply-To: <874m3tw784.fsf@tromey.com> References: <87pomiwo1z.fsf@tromey.com> <87lgx6wntm.fsf@tromey.com> <87d1iiwlvx.fsf@tromey.com> <874m3tw784.fsf@tromey.com> From: Manish Goregaokar Date: Mon, 31 Oct 2016 03:20:00 -0000 Message-ID: Subject: Re: [PATCH] Fix handling of discriminantless univariant enums in Rust To: Tom Tromey Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2016-10/txt/msg00853.txt.bz2 Updated. Not sure what the style issues are, could you point them out? Did some editing to remove the need for wrapping the function call. gmail auto wraps to 80 characters in plain text mode, so I uploaded the same patch at https://manishearth.pastebin.mozilla.org/8923535 >From 940d50a6c4be92ad871f2c8e1f7589d5fa703f24 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 27 Oct 2016 16:46:34 -0700 Subject: [PATCH 1/3] Fix handling of discriminantless univariant enums in Rust; fix bug with encoded enums 2016-10-27 Manish Goregaokar gdb/ChangeLog: * rust-lang.c (rust_get_disr_info): Treat univariant enums without discriminants as encoded enums with a real field * rust-lang.c (rust_evaluate_subexp): Handle field access on encoded struct-like enums gdb/testsuite/ChangeLog: * simple.rs: Add test for univariant enums without discriminants and for encoded struct-like enums * simple.exp: Add test expectations --- gdb/rust-lang.c | 15 ++++++++++++++- gdb/testsuite/gdb.rust/simple.exp | 12 ++++++++++++ gdb/testsuite/gdb.rust/simple.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 82cd3f9..0ced4bb 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -194,6 +194,17 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr, has changed its debuginfo format. */ error (_("Could not find enum discriminant field")); } + else if (TYPE_NFIELDS (type) == 1) { + /* Sometimes univariant enums are encoded without a + discriminant. In that case, treating it as an encoded enum + with the first field being the actual type works. */ + const char* field_name = TYPE_NAME (TYPE_FIELD_TYPE (type, 0)); + const char* last = rust_last_path_segment (field_name); + ret.name = concat (TYPE_NAME (type), "::", last, (char *) NULL); + ret.field_no = RUST_ENCODED_ENUM_REAL; + ret.is_encoded = 1; + return ret; + } if (strcmp (TYPE_FIELD_NAME (disr_type, 0), "RUST$ENUM$DISR") != 0) error (_("Rust debug format has changed")); @@ -1725,7 +1736,9 @@ tuple structs, and tuple-like enum variants")); variant_type = TYPE_FIELD_TYPE (type, disr.field_no); if (variant_type == NULL - || rust_tuple_variant_type_p (variant_type)) + || (disr.is_encoded + ? rust_tuple_struct_type_p (variant_type) + : rust_tuple_variant_type_p (variant_type))) error(_("Attempting to access named field %s of tuple variant %s, \ which has only anonymous fields"), field_name, disr.name); diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 5e00b03..8e84daa 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -103,6 +103,11 @@ gdb_test_sequence "ptype z" "" { } gdb_test "print z.1" " = 8" +gdb_test "print univariant" " = simple::Univariant::Foo{a: 1}" +gdb_test "print univariant.a" " = 1" +gdb_test "print univariant_anon" " = simple::UnivariantAnon::Foo\\(1\\)" +gdb_test "print univariant_anon.0" " = 1" + gdb_test_sequence "ptype simple::ByeBob" "" { " = struct simple::ByeBob \\(" " i32," @@ -220,3 +225,10 @@ gdb_test "print (1,)" "Tuple expressions not supported yet" gdb_test "print (1)" " = 1" gdb_test "print 23..97.0" "Range expression with different types" + +gdb_test "print (*parametrized.next.val)" \ + " = simple::ParametrizedStruct {next: simple::ParametrizedEnum>>::Empty, value: 1}" +gdb_test "print parametrized.next.val" \ + " = \\(simple::ParametrizedStruct \\*\\) $hex" +gdb_test "print parametrized" \ + " = simple::ParametrizedStruct \\{next: simple::ParametrizedEnum>>::Val\\{val: $hex\\}, value: 0\\}" diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs index eeff3d7..670f54e 100644 --- a/gdb/testsuite/gdb.rust/simple.rs +++ b/gdb/testsuite/gdb.rust/simple.rs @@ -63,6 +63,23 @@ enum SpaceSaver { Nothing, } +enum Univariant { + Foo {a: u8} +} +enum UnivariantAnon { + Foo(u8) +} + +enum ParametrizedEnum { + Val { val: T }, + Empty, +} + +struct ParametrizedStruct { + next: ParametrizedEnum>>, + value: T +} + fn main () { let a = (); let b : [i32; 0] = []; @@ -93,6 +110,9 @@ fn main () { let y = HiBob {field1: 7, field2: 8}; let z = ByeBob(7, 8); + let univariant = Univariant::Foo {a : 1}; + let univariant_anon = UnivariantAnon::Foo(1); + let slice = &w[2..3]; let fromslice = slice[0]; let slice2 = &slice[0..1]; @@ -117,6 +137,16 @@ fn main () { let custom_some = NonZeroOptimized::Value("hi".into()); let custom_none = NonZeroOptimized::Empty; + let parametrized = ParametrizedStruct { + next: ParametrizedEnum::Val { + val: Box::new(ParametrizedStruct { + next: ParametrizedEnum::Empty, + value: 1, + }) + }, + value: 0, + }; + println!("{}, {}", x.0, x.1); // set breakpoint here println!("{}", diff2(92, 45)); empty(); -- 2.10.1 -Manish On Sun, Oct 30, 2016 at 8:03 PM, Tom Tromey wrote: >>>>>> "Manish" == Manish Goregaokar writes: > > Manish> + else if (TYPE_NFIELDS (type) == 1) { > Manish> + /* Sometimes univariant enums are encoded without a > Manish> + discriminant. In that case, treating it as an encoded enum > Manish> + with the first field being the actual type works. */ > Manish> + const char* field_name = TYPE_NAME (TYPE_FIELD_TYPE (type, 0)); > Manish> + ret.name = concat (TYPE_NAME (type), "::", > Manish> + rust_last_path_segment (field_name), > Manish> + (char *) NULL); > Manish> + ret.field_no = RUST_ENCODED_ENUM_REAL; > Manish> + ret.is_encoded = 1; > Manish> + return ret; > Manish> + } > Manish> if (strcmp (TYPE_FIELD_NAME (disr_type, 0), "RUST$ENUM$DISR") != 0) > > This still should follow GNU style. > And I think a blank line after the "}". > > Manish> +gdb_test "print parametrized.next.val" " = > Manish> \\(simple::ParametrizedStruct \\*\\) $hex" > > Patch mangled by mail program. > No biggie but it's a pain if one wants to try it out. > > Manish> $hex\\}, value: 0\\}" > Manish> \ No newline at end of file > > Please add a newline. > > Tom