aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2020-02-19 13:54:59 -0700
committerTom Tromey <tromey@adacore.com>2020-02-19 13:59:31 -0700
commit084104828cba3e80b19a4bad9538d32991312d7a (patch)
tree39bf9f0d465051e66917d5d5884b3f29031263d1
parent623563f79db9c2d576303565f8ba1415c911c452 (diff)
downloadgdb-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/ChangeLog6
-rw-r--r--gdb/rust-lang.c3
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.rust/simple.exp2
-rw-r--r--gdb/testsuite/gdb.rust/simple.rs8
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();