From 73fc52c4ccecf005aac264e3faa08e815d25118a Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 16 Nov 2018 15:30:35 -0700 Subject: [PATCH] Handle TYPE_CODE_PTR when printing Rust types This changes the Rust type printers to handle TYPE_CODE_PTR. The current approach is not ideal, because currently the code can't distinguish between mut and const, or between pointers and references. (These are debuginfo deficiencies, for which there are rustc bugs on file.) Meanwhile, this at least clears up the case seen in PR rust/23625. Tested on x86-64 Fedora 28. The nightly compiler gives the best results, but I regression-tested with stable and beta as well. gdb/ChangeLog 2018-11-16 Tom Tromey PR rust/23625: * rust-lang.c (rust_internal_print_type): Handle TYPE_CODE_PTR. gdb/testsuite/ChangeLog 2018-11-19 Tom Tromey PR rust/23625: * gdb.rust/simple.exp: Add ptype test. Update expected output. * gdb.rust/expr.exp: Update expected output. Change one test. --- gdb/ChangeLog | 5 +++++ gdb/rust-lang.c | 14 ++++++++++++++ gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.rust/expr.exp | 4 ++-- gdb/testsuite/gdb.rust/simple.exp | 13 +++++++------ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 436446c9f0..3939d235cf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-11-16 Tom Tromey + + PR rust/23625: + * rust-lang.c (rust_internal_print_type): Handle TYPE_CODE_PTR. + 2018-11-19 Simon Marchi * infrun.c (displaced_step_inferior_states): Change type to diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 152413a612..0a327ee619 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -918,6 +918,20 @@ rust_internal_print_type (struct type *type, const char *varstring, } break; + case TYPE_CODE_PTR: + { + if (TYPE_NAME (type) != nullptr) + fputs_filtered (TYPE_NAME (type), stream); + else + { + /* We currently can't distinguish between pointers and + references. */ + fputs_filtered ("*mut ", stream); + type_print (TYPE_TARGET_TYPE (type), "", stream, 0); + } + } + break; + default: c_printer: c_print_type (type, varstring, stream, show, level, flags); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e7693a07f5..daa283994c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-11-19 Tom Tromey + + PR rust/23625: + * gdb.rust/simple.exp: Add ptype test. Update expected output. + * gdb.rust/expr.exp: Update expected output. Change one test. + 2018-11-19 Tom Tromey * gdb.rust/simple.rs: Don't initialize empty_enum_value. diff --git a/gdb/testsuite/gdb.rust/expr.exp b/gdb/testsuite/gdb.rust/expr.exp index 22e6b49b54..ec230c1a1a 100644 --- a/gdb/testsuite/gdb.rust/expr.exp +++ b/gdb/testsuite/gdb.rust/expr.exp @@ -134,8 +134,8 @@ gdb_test "ptype \[23usize; 4\]" " = \\\[usize; 4\\\]" gdb_test "print \[mut 23usize; 4\]" " = \\\[23, 23, 23, 23\\\]" # Test lexer corner cases. -gdb_test "print 0x0 as *const ()" " = \\\(\\\(\\\) \\*\\\) 0x0" -gdb_test "print 0x0 as fn(i64) -> ()" " = \\\(\\\(\\\) \\\(\\*\\\)\\\(i64\\\)\\\) 0x0" +gdb_test "print 0x0 as *mut ()" " = \\\(\\*mut \\\(\\\)\\\) 0x0" +gdb_test "print 0x0 as fn(i64) -> ()" " = \\\(\\*mut fn \\\(i64\\\) -> \\\(\\\)\\\) 0x0" gdb_test "print r#" "syntax error in expression, near `#'\\." gdb_test "printf \"%d %d\\n\", 23+1, 23-1" "24 22" diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 956a6ca6fe..f02ff676db 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -54,6 +54,7 @@ gdb_test "print *&c" " = 0" gdb_test "print *(&c as &i32)" " = 0" gdb_test "print *(&c as *const i32)" " = 0" gdb_test "print *(&c as *mut i32)" " = 0" +gdb_test "ptype &c as *mut i32" "\\*mut i32" gdb_test "print/c f\[0\]" " = 104 'h'" @@ -68,8 +69,8 @@ gdb_test "print f" " = \"hi bob\"" gdb_test "print fslice" " = \"bob\"" gdb_test "print &f\[3..\]" " = \"bob\"" -gdb_test "print g" " = \\(u8 \\(\\*\\)\\\[6\\\]\\) $hex b\"hi bob\"" -gdb_test "ptype g" " = u8 \\(\\*\\)\\\[6\\\]" +gdb_test "print g" " = \\(\\*mut \\\[u8; 6\\\]\\) $hex b\"hi bob\"" +gdb_test "ptype g" " = \\*mut \\\[u8; 6\\\]" gdb_test "print v" " = simple::Something::Three" gdb_test_sequence "ptype v" "" { @@ -91,19 +92,19 @@ gdb_test "print slice as &\[i32\]\[0\]" " = 3" gdb_test_sequence "ptype slice" "" { " = struct &\\\[i32\\\] \\{" - " data_ptr: i32 \\*," + " data_ptr: \\*mut i32," " length: usize," "\\}" } gdb_test_sequence "ptype &slice\[..\]" "" { " = struct &\\\[i32\\\] \\{" - " data_ptr: i32 \\*," + " data_ptr: \\*mut i32," " length: usize," "\\}" } gdb_test_sequence "ptype &b\[..\]" "" { " = struct &\\\[\\*gdb\\*\\\] \\{" - " data_ptr: i32 \\*," + " data_ptr: \\*mut i32," " length: usize," "\\}" } @@ -281,7 +282,7 @@ gdb_test "print 23..97.0" "Range expression with different types" gdb_test "print (*parametrized.next.val)" \ " = simple::ParametrizedStruct {next: simple::ParametrizedEnum<\[a-z:\]*Box>>::Empty, value: 1}" gdb_test "print parametrized.next.val" \ - " = \\(simple::ParametrizedStruct \\*\\) $hex" + " = \\(\\*mut simple::ParametrizedStruct\\) $hex" gdb_test "print parametrized" \ " = simple::ParametrizedStruct \\{next: simple::ParametrizedEnum<\[a-z:\]*Box>>::Val\\{val: $hex\\}, value: 0\\}" -- 2.34.1