diff --git a/src/etc/lldb_lookup.py b/src/etc/lldb_lookup.py index db3afb00369da..abbd802dcdd12 100644 --- a/src/etc/lldb_lookup.py +++ b/src/etc/lldb_lookup.py @@ -92,7 +92,7 @@ def synthetic_lookup(valobj, dict): return StdVecSyntheticProvider(valobj, dict) if rust_type == RustType.STD_VEC_DEQUE: return StdVecDequeSyntheticProvider(valobj, dict) - if rust_type == RustType.STD_SLICE: + if rust_type == RustType.STD_SLICE or rust_type == RustType.STD_STR: return StdSliceSyntheticProvider(valobj, dict) if rust_type == RustType.STD_HASH_MAP: diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py index a87fd6078b866..c6330117380b1 100644 --- a/src/etc/lldb_providers.py +++ b/src/etc/lldb_providers.py @@ -159,6 +159,9 @@ def StdStrSummaryProvider(valobj, dict): # logger = Logger.Logger() # logger >> "[StdStrSummaryProvider] for " + str(valobj.GetName()) + # the code below assumes non-synthetic value, this makes sure the assumption holds + valobj = valobj.GetNonSyntheticValue() + length = valobj.GetChildMemberWithName("length").GetValueAsUnsigned() if length == 0: return '""' diff --git a/tests/debuginfo/empty-string.rs b/tests/debuginfo/empty-string.rs index 36240730e1986..35b68ed91c0fc 100644 --- a/tests/debuginfo/empty-string.rs +++ b/tests/debuginfo/empty-string.rs @@ -23,7 +23,7 @@ // lldb-check:[...] empty_string = "" { vec = size=0 } // lldb-command:fr v empty_str -// lldb-check:[...] empty_str = "" { data_ptr = [...] length = 0 } +// lldb-check:[...] empty_str = "" fn main() { let empty_string = String::new(); diff --git a/tests/debuginfo/pretty-slices.rs b/tests/debuginfo/pretty-slices.rs index 5d2086fa478ac..9defa344be03e 100644 --- a/tests/debuginfo/pretty-slices.rs +++ b/tests/debuginfo/pretty-slices.rs @@ -27,10 +27,10 @@ // lldb-check:(&mut [i32]) mut_slice = size=4 { [0] = 2 [1] = 3 [2] = 5 [3] = 7 } // lldb-command:v str_slice -// lldb-check:(&str) str_slice = "string slice" { data_ptr = [...] length = 12 } +// lldb-check:(&str) str_slice = "string slice" { [0] = 's' [1] = 't' [2] = 'r' [3] = 'i' [4] = 'n' [5] = 'g' [6] = ' ' [7] = 's' [8] = 'l' [9] = 'i' [10] = 'c' [11] = 'e' } // lldb-command:v mut_str_slice -// lldb-check:(&mut str) mut_str_slice = "mutable string slice" { data_ptr = [...] length = 20 } +// lldb-check:(&mut str) mut_str_slice = "mutable string slice" { [0] = 'm' [1] = 'u' [2] = 't' [3] = 'a' [4] = 'b' [5] = 'l' [6] = 'e' [7] = ' ' [8] = 's' [9] = 't' [10] = 'r' [11] = 'i' [12] = 'n' [13] = 'g' [14] = ' ' [15] = 's' [16] = 'l' [17] = 'i' [18] = 'c' [19] = 'e' } fn b() {} diff --git a/tests/debuginfo/strings-and-strs.rs b/tests/debuginfo/strings-and-strs.rs new file mode 100644 index 0000000000000..48d40d167bad8 --- /dev/null +++ b/tests/debuginfo/strings-and-strs.rs @@ -0,0 +1,63 @@ +//@ min-gdb-version: 14.0 +//@ min-lldb-version: 1800 + +//@ compile-flags:-g + +// === GDB TESTS =================================================================================== +// gdb-command:run + +// gdb-command:print plain_string +// gdbr-check:$1 = alloc::string::String {vec: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x55555555ab80}, _marker: core::marker::PhantomData}, cap: alloc::raw_vec::Cap (5), alloc: alloc::alloc::Global}, len: 5}} + +// gdb-command:print plain_str +// gdbr-check:$2 = "Hello" + +// gdb-command:print str_in_struct +// gdbr-check:$3 = strings_and_strs::Foo {inner: "Hello"} + +// gdb-command:print str_in_tuple +// gdbr-check:$4 = ("Hello", "World") + +// gdb-command:print str_in_rc +// gdbr-check:$5 = alloc::rc::Rc<&str, alloc::alloc::Global> {ptr: core::ptr::non_null::NonNull> {pointer: 0x55555555aae0}, phantom: core::marker::PhantomData>, alloc: alloc::alloc::Global} + + +// === LLDB TESTS ================================================================================== +// lldb-command:run +// lldb-command:v plain_string +// lldbg-check:(alloc::string::String) plain_string = "Hello" { vec = size=5 { [0] = 'H' [1] = 'e' [2] = 'l' [3] = 'l' [4] = 'o' } } + +// lldb-command:v plain_str +// lldbg-check:(&str) plain_str = "Hello" { [0] = 'H' [1] = 'e' [2] = 'l' [3] = 'l' [4] = 'o' } + +// lldb-command:v str_in_struct +// lldbg-check:((&str, &str)) str_in_tuple = { 0 = "Hello" { [0] = 'H' [1] = 'e' [2] = 'l' [3] = 'l' [4] = 'o' } 1 = "World" { [0] = 'W' [1] = 'o' [2] = 'r' [3] = 'l' [4] = 'd' } } + +// lldb-command:v str_in_tuple +// lldbg-check:((&str, &str)) str_in_tuple = { 0 = "Hello" { [0] = 'H' [1] = 'e' [2] = 'l' [3] = 'l' [4] = 'o' } 1 = "World" { [0] = 'W' [1] = 'o' [2] = 'r' [3] = 'l' [4] = 'd' } } + +// lldb-command:v str_in_rc +// lldbg-check:(alloc::rc::Rc<&str, alloc::alloc::Global>) str_in_rc = strong=1, weak=0 { value = "Hello" { [0] = 'H' [1] = 'e' [2] = 'l' [3] = 'l' [4] = 'o' } } + + +#![allow(unused_variables)] +#![feature(omit_gdb_pretty_printer_section)] +#![omit_gdb_pretty_printer_section] + +pub struct Foo<'a> { + inner: &'a str, +} + +fn main() { + let plain_string = String::from("Hello"); + let plain_str = "Hello"; + let str_in_struct = Foo { inner: "Hello" }; + let str_in_tuple = ("Hello", "World"); + + let str_in_rc = std::rc::Rc::new("Hello"); + zzz(); // #break +} + +fn zzz() { + () +}