diff options
author | Doug Evans <dje@google.com> | 2020-02-19 13:54:59 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-02-19 13:59:31 -0700 |
commit | 084104828cba3e80b19a4bad9538d32991312d7a (patch) | |
tree | 39bf9f0d465051e66917d5d5884b3f29031263d1 | |
parent | 623563f79db9c2d576303565f8ba1415c911c452 (diff) | |
download | gdb-084104828cba3e80b19a4bad9538d32991312d7a.zip gdb-084104828cba3e80b19a4bad9538d32991312d7a.tar.gz gdb-084104828cba3e80b19a4bad9538d32991312d7a.tar.bz2 |
rust/25535 Apply embedded offset to enum variant calculation
Hopefully straightforward (and I didn't miss anything ...).
gdb/ChangeLog
2020-02-19 Doug Evans <dje@google.com>
PR rust/25535
* rust-lang.c (rust_print_enum): Apply embedded_offset to
rust_enum_variant calculation.
gdb/testsuite/ChangeLog
2020-02-19 Doug Evans <dje@google.com>
PR rust/25535
* gdb.rust/simple.exp: Add test.
* gdb.rust/simple.rs: Add test.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/rust-lang.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/simple.exp | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/simple.rs | 8 |
5 files changed, 24 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3fdebc9..6d30272 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-02-19 Doug Evans <dje@google.com> + + PR rust/25535 + * rust-lang.c (rust_print_enum): Apply embedded_offset to + rust_enum_variant calculation. + 2020-02-19 Tom Tromey <tromey@adacore.com> * mips-tdep.h (mips_pc_is_mips): Parameter type is CORE_ADDR. diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 9123bf2..18dc6a5 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -481,7 +481,8 @@ rust_print_enum (struct type *type, int embedded_offset, } const gdb_byte *valaddr = value_contents_for_printing (val); - struct field *variant_field = rust_enum_variant (type, valaddr); + struct field *variant_field = rust_enum_variant (type, + valaddr + embedded_offset); embedded_offset += FIELD_BITPOS (*variant_field) / 8; struct type *variant_type = FIELD_TYPE (*variant_field); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e599791..0dff20d 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-02-19 Doug Evans <dje@google.com> + + PR rust/25535 + * gdb.rust/simple.exp: Add test. + * gdb.rust/simple.rs: Add test. + 2020-02-19 Tom de Vries <tdevries@suse.de> * gdb.base/corefile-buildid.exp (check_exec_file): Match info files diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index aa64e6b..b4fcf27 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -357,6 +357,8 @@ gdb_test_sequence "ptype/o SimpleLayout" "" { gdb_test "print u2" " = simple::Union2 {name: \\\[1\\\]}" +gdb_test "print nonzero_offset" " = simple::EnumWithNonzeroOffset {a: core::option::Option<u8>::Some\\(1\\), b: core::option::Option<u8>::None}" + # PR rust/23626 - this used to crash. Note that the results are # fairly lax because most existing versions of Rust (those before the # DW_TAG_variant patches) do not emit what gdb wants here; and there diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs index 1280e04..36448ec 100644 --- a/gdb/testsuite/gdb.rust/simple.rs +++ b/gdb/testsuite/gdb.rust/simple.rs @@ -104,6 +104,12 @@ struct SimpleLayout { enum EmptyEnum {} +#[derive(Debug)] +struct EnumWithNonzeroOffset { + a: Option<u8>, + b: Option<u8>, +} + fn main () { let a = (); let b : [i32; 0] = []; @@ -186,6 +192,8 @@ fn main () { let u2 = Union2 { name: [1] }; + let nonzero_offset = EnumWithNonzeroOffset { a: Some(1), b: None }; + println!("{}, {}", x.0, x.1); // set breakpoint here println!("{}", diff2(92, 45)); empty(); |