mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
80062eb949
When printing a rust structure that contains a string GDB can currently fail to read the fields that define the string. This is because GDB mistakenly treats a value that is the parent structure as though it is the structure that defines the string, and then fails to find the fields needed to extract a string. The solution is to create a new value to represent the string field of the parent value. gdb/ChangeLog: * rust-lang.c (val_print_struct): Handle printing structures containing strings. gdb/testsuite/ChangeLog: * gdb.rust/simple.exp: Add new test case. * gdb.rust/simple.rs (struct StringAtOffset): New struct. (main): Initialise an instance of the new struct.
187 lines
4.0 KiB
Rust
187 lines
4.0 KiB
Rust
// Copyright (C) 2016-2019 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 <http://www.gnu.org/licenses/>.
|
|
|
|
#![allow(dead_code)]
|
|
#![allow(unused_variables)]
|
|
#![allow(unused_assignments)]
|
|
|
|
|
|
pub struct HiBob {
|
|
pub field1: i32,
|
|
field2: u64,
|
|
}
|
|
|
|
struct ByeBob(i32, u64);
|
|
|
|
enum Something {
|
|
One,
|
|
Two,
|
|
Three
|
|
}
|
|
|
|
enum MoreComplicated {
|
|
One,
|
|
Two(i32),
|
|
Three(HiBob),
|
|
Four{this: bool, is: u8, a: char, struct_: u64, variant: u32},
|
|
}
|
|
|
|
// tests the nonzero optimization, but fields are reversed
|
|
enum NonZeroOptimized {
|
|
Empty,
|
|
Value(String),
|
|
}
|
|
|
|
fn diff2(x: i32, y: i32) -> i32 {
|
|
x - y
|
|
}
|
|
|
|
// Empty function, should not have "void"
|
|
// or "()" in its return type
|
|
fn empty() {
|
|
|
|
}
|
|
|
|
pub struct Unit;
|
|
|
|
// This triggers the non-zero optimization that yields a different
|
|
// enum representation in the debug info.
|
|
enum SpaceSaver {
|
|
Thebox(u8, Box<i32>),
|
|
Nothing,
|
|
}
|
|
|
|
enum Univariant {
|
|
Foo {a: u8}
|
|
}
|
|
enum UnivariantAnon {
|
|
Foo(u8)
|
|
}
|
|
|
|
enum ParametrizedEnum<T> {
|
|
Val { val: T },
|
|
Empty,
|
|
}
|
|
|
|
struct ParametrizedStruct<T> {
|
|
next: ParametrizedEnum<Box<ParametrizedStruct<T>>>,
|
|
value: T
|
|
}
|
|
|
|
union Union {
|
|
f1: i8,
|
|
f2: u8,
|
|
}
|
|
|
|
struct StringAtOffset {
|
|
pub field1: &'static str,
|
|
pub field2: i32,
|
|
pub field3: &'static str,
|
|
}
|
|
|
|
// A simple structure whose layout won't be changed by the compiler,
|
|
// so that ptype/o testing will work on any platform.
|
|
struct SimpleLayout {
|
|
f1: u16,
|
|
f2: u16
|
|
}
|
|
|
|
enum EmptyEnum {}
|
|
|
|
fn main () {
|
|
let a = ();
|
|
let b : [i32; 0] = [];
|
|
|
|
let mut c = 27;
|
|
let d = c = 99;
|
|
|
|
let e = MoreComplicated::Two(73);
|
|
let e2 = MoreComplicated::Four {this: true, is: 8, a: 'm',
|
|
struct_: 100, variant: 10};
|
|
|
|
let f = "hi bob";
|
|
let g = b"hi bob";
|
|
let h = b'9';
|
|
|
|
let fslice = &f[3..];
|
|
|
|
let i = ["whatever"; 8];
|
|
|
|
let j = Unit;
|
|
let j2 = Unit{};
|
|
|
|
let k = SpaceSaver::Nothing;
|
|
let l = SpaceSaver::Thebox(9, Box::new(1729));
|
|
|
|
let v = Something::Three;
|
|
let w = [1,2,3,4];
|
|
let w_ptr = &w[0];
|
|
let x = (23, 25.5);
|
|
let y = HiBob {field1: 7, field2: 8};
|
|
let z = ByeBob(7, 8);
|
|
|
|
let field1 = 77;
|
|
let field2 = 88;
|
|
let y0 = HiBob { field1, field2 };
|
|
|
|
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];
|
|
|
|
let all1 = &w[..];
|
|
let all2 = &slice[..];
|
|
|
|
let from1 = &w[1..];
|
|
let from2 = &slice[1..];
|
|
|
|
let to1 = &w[..3];
|
|
let to2 = &slice[..1];
|
|
|
|
let st = StringAtOffset { field1: "hello", field2: 1, field3: "world" };
|
|
|
|
// tests for enum optimizations
|
|
|
|
let str_some = Some("hi".to_string());
|
|
let str_none = None::<String>;
|
|
let box_some = Some(Box::new(1u8));
|
|
let box_none = None::<Box<u8>>;
|
|
let int_some = Some(1u8);
|
|
let int_none = None::<u8>;
|
|
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,
|
|
};
|
|
|
|
let u = Union { f2: 255 };
|
|
let simplelayout = SimpleLayout { f1: 8, f2: 9 };
|
|
|
|
let empty_enum_value: EmptyEnum;
|
|
|
|
println!("{}, {}", x.0, x.1); // set breakpoint here
|
|
println!("{}", diff2(92, 45));
|
|
empty();
|
|
}
|