about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-01-28 12:46:13 +0000
committerbors <bors@rust-lang.org>2022-01-28 12:46:13 +0000
commit427eba2f0bacdeaebc992a78eb2889564de7d7cf (patch)
tree5b3749bcc4fc7dd1254bb933999b9900c084d863 /src
parente0e70c0c2c4fc8d150a56c181994e3a3b3e9999a (diff)
parentc10f9e7d1d6deba9797642fdd24a01ba9bb25d47 (diff)
downloadrust-427eba2f0bacdeaebc992a78eb2889564de7d7cf.tar.gz
rust-427eba2f0bacdeaebc992a78eb2889564de7d7cf.zip
Auto merge of #93006 - michaelwoerister:fix-unsized-ptr-debuginfo, r=davidtwco,oli-obk
Fix debuginfo for pointers/references to unsized types

This PR makes the compiler emit fat pointer debuginfo in all cases. Before, we sometimes got thin-pointer debuginfo, making it impossible to fully interpret the pointed to memory in debuggers. The code is actually cleaner now, especially around generation of trait object pointer debuginfo.

Fixes https://github.com/rust-lang/rust/issues/92718

~~Blocked on https://github.com/rust-lang/rust/pull/92729.~~
Diffstat (limited to 'src')
-rw-r--r--src/test/debuginfo/unsized.rs50
-rw-r--r--src/test/debuginfo/vec-slices.rs48
2 files changed, 62 insertions, 36 deletions
diff --git a/src/test/debuginfo/unsized.rs b/src/test/debuginfo/unsized.rs
index c27fe61dc8b..ebd40f9dda2 100644
--- a/src/test/debuginfo/unsized.rs
+++ b/src/test/debuginfo/unsized.rs
@@ -4,32 +4,56 @@
 
 // gdb-command:run
 
-// gdb-command:print *a
-// gdbg-check:$1 = {value = [...] "abc"}
-// gdbr-check:$1 = unsized::Foo<[u8]> {value: [...]}
+// gdb-command:print a
+// gdbg-check:$1 = {data_ptr = [...], length = 4}
+// gdbr-check:$1 = &unsized::Foo<[u8]> {data_ptr: [...], length: 4}
 
-// gdb-command:print *b
-// gdbg-check:$2 = {value = {value = [...] "abc"}}
-// gdbr-check:$2 = unsized::Foo<unsized::Foo<[u8]>> {value: unsized::Foo<[u8]> {value: [...]}}
+// gdb-command:print b
+// gdbg-check:$2 = {data_ptr = [...], length = 4}
+// gdbr-check:$2 = &unsized::Foo<unsized::Foo<[u8]>> {data_ptr: [...], length: 4}
 
+// gdb-command:print c
+// gdbg-check:$3 = {pointer = [...], vtable = [...]}
+// gdbr-check:$3 = &unsized::Foo<dyn core::fmt::Debug> {pointer: [...], vtable: [...]}
+
+// === CDB TESTS ===================================================================================
+
+// cdb-command: g
+// cdb-command:dx a
+// cdb-check:a                [Type: ref$<unsized::Foo<slice$<u8> > >]
+// cdb-check:    [+0x000] data_ptr         : 0x[...] [Type: unsized::Foo<slice$<u8> > *]
+// cdb-check:    [...] length           : 0x4 [Type: unsigned [...]int[...]
+
+// cdb-command:dx b
+// cdb-check:b                [Type: ref$<unsized::Foo<unsized::Foo<slice$<u8> > > >]
+// cdb-check:    [+0x000] data_ptr         : 0x[...] [Type: unsized::Foo<unsized::Foo<slice$<u8> > > *]
+// cdb-check:    [...] length           : 0x4 [Type: unsigned [...]int[...]
+
+// cdb-command:dx c
+// cdb-check:c                [Type: ref$<unsized::Foo<dyn$<core::fmt::Debug> > >]
+// cdb-check:    [+0x000] pointer          : 0x[...] [Type: unsized::Foo<dyn$<core::fmt::Debug> > *]
+// cdb-check:    [...] vtable           : 0x[...] [Type: unsigned [...]int[...] (*)[3]]
 
 #![feature(omit_gdb_pretty_printer_section)]
 #![omit_gdb_pretty_printer_section]
 
 struct Foo<T: ?Sized> {
-    value: T
+    value: T,
 }
 
 fn main() {
-    let foo: Foo<Foo<[u8; 4]>> = Foo {
-        value: Foo {
-            value: *b"abc\0"
-        }
-    };
+    let foo: Foo<Foo<[u8; 4]>> = Foo { value: Foo { value: *b"abc\0" } };
+
+    // We expect `a`, `b`, and `c` to all be fat pointers.
+    // `a` and `b` should be slice-like and thus have a `data_ptr` and `length` field.
+    // `c` should be trait-object-like and thus have a `pointer` and `vtable` field.
     let a: &Foo<[u8]> = &foo.value;
     let b: &Foo<Foo<[u8]>> = &foo;
+    let c: &Foo<dyn std::fmt::Debug> = &Foo { value: 7i32 };
 
     zzz(); // #break
 }
 
-fn zzz() { () }
+fn zzz() {
+    ()
+}
diff --git a/src/test/debuginfo/vec-slices.rs b/src/test/debuginfo/vec-slices.rs
index e109b1bf2ae..7d88e45caf2 100644
--- a/src/test/debuginfo/vec-slices.rs
+++ b/src/test/debuginfo/vec-slices.rs
@@ -1,5 +1,4 @@
 // ignore-windows
-// ignore-gdb // Test temporarily ignored due to debuginfo tests being disabled, see PR 47155
 // min-lldb-version: 310
 
 // compile-flags:-g
@@ -13,21 +12,21 @@
 // gdb-command:print singleton.length
 // gdb-check:$2 = 1
 // gdbg-command:print *((i64[1]*)(singleton.data_ptr))
-// gdbr-command:print *(singleton.data_ptr as &[i64; 1])
+// gdbr-command:print *(singleton.data_ptr as *const [i64; 1])
 // gdbg-check:$3 = {1}
 // gdbr-check:$3 = [1]
 
 // gdb-command:print multiple.length
 // gdb-check:$4 = 4
 // gdbg-command:print *((i64[4]*)(multiple.data_ptr))
-// gdbr-command:print *(multiple.data_ptr as &[i64; 4])
+// gdbr-command:print *(multiple.data_ptr as *const [i64; 4])
 // gdbg-check:$5 = {2, 3, 4, 5}
 // gdbr-check:$5 = [2, 3, 4, 5]
 
 // gdb-command:print slice_of_slice.length
 // gdb-check:$6 = 2
 // gdbg-command:print *((i64[2]*)(slice_of_slice.data_ptr))
-// gdbr-command:print *(slice_of_slice.data_ptr as &[i64; 2])
+// gdbr-command:print *(slice_of_slice.data_ptr as *const [i64; 2])
 // gdbg-check:$7 = {3, 4}
 // gdbr-check:$7 = [3, 4]
 
@@ -49,21 +48,24 @@
 // gdbg-check:$13 = {x = 13, y = 14, z = 15}
 // gdbr-check:$13 = vec_slices::AStruct {x: 13, y: 14, z: 15}
 
-// gdbg-command:print 'vec_slices::MUT_VECT_SLICE'.length
-// gdbr-command:print MUT_VECT_SLICE.length
-// gdb-check:$14 = 2
-// gdbg-command:print *((i64[2]*)('vec_slices::MUT_VECT_SLICE'.data_ptr))
-// gdbr-command:print *(MUT_VECT_SLICE.data_ptr as &[i64; 2])
-// gdbg-check:$15 = {64, 65}
-// gdbr-check:$15 = [64, 65]
+// gdb-command:print mut_slice.length
+// gdb-check:$14 = 5
+// gdbg-command:print *((i64[5]*)(mut_slice.data_ptr))
+// gdbr-command:print *(mut_slice.data_ptr as *const [i64; 5])
+// gdbg-check:$15 = {1, 2, 3, 4, 5}
+// gdbr-check:$15 = [1, 2, 3, 4, 5]
 
-//gdb-command:print mut_slice.length
-//gdb-check:$16 = 5
-//gdbg-command:print *((i64[5]*)(mut_slice.data_ptr))
-//gdbr-command:print *(mut_slice.data_ptr as &[i64; 5])
-//gdbg-check:$17 = {1, 2, 3, 4, 5}
-//gdbr-check:$17 = [1, 2, 3, 4, 5]
+// Some lines below are marked with [ignored] because old GDB versions seem to have trouble
+// accessing globals.
 
+// [ignored] gdbg-command:print 'vec_slices::MUT_VECT_SLICE'.length
+// gdbr-command:print MUT_VECT_SLICE.length
+// [ignored] gdbg-check:$16 = 2
+// gdbr-check:$16 = 2
+// [ignored] gdbg-command:print *((i64[2]*)('vec_slices::MUT_VECT_SLICE'.data_ptr))
+// gdbr-command:print *(MUT_VECT_SLICE.data_ptr as *const [i64; 2])
+// [ignored] gdbg-check:$17 = {64, 65}
+// gdbr-check:$17 = [64, 65]
 
 // === LLDB TESTS ==================================================================================
 
@@ -100,7 +102,7 @@
 struct AStruct {
     x: i16,
     y: i32,
-    z: i16
+    z: i16,
 }
 
 static VECT_SLICE: &'static [i64] = &[64, 65];
@@ -114,10 +116,8 @@ fn main() {
 
     let padded_tuple: &[(i32, i16)] = &[(6, 7), (8, 9)];
 
-    let padded_struct: &[AStruct] = &[
-        AStruct { x: 10, y: 11, z: 12 },
-        AStruct { x: 13, y: 14, z: 15 }
-    ];
+    let padded_struct: &[AStruct] =
+        &[AStruct { x: 10, y: 11, z: 12 }, AStruct { x: 13, y: 14, z: 15 }];
 
     unsafe {
         MUT_VECT_SLICE = VECT_SLICE;
@@ -128,4 +128,6 @@ fn main() {
     zzz(); // #break
 }
 
-fn zzz() {()}
+fn zzz() {
+    ()
+}