From af34f91c2762dfaa39959467d216f5c21ab5d0db Mon Sep 17 00:00:00 2001 From: Philip Craig <philipjcraig@gmail.com> Date: Thu, 22 Dec 2016 21:13:33 +1000 Subject: [PATCH] Fix debuginfo for unsized struct members The member was given the size of a fat pointer, which caused llvm to emit DWARF attributes for a 128-bit bitfield. --- src/librustc_trans/debuginfo/metadata.rs | 2 +- src/test/debuginfo/unsized.rs | 45 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/test/debuginfo/unsized.rs diff --git a/src/librustc_trans/debuginfo/metadata.rs b/src/librustc_trans/debuginfo/metadata.rs index 511c9d3c13f..b18df4d97f1 100644 --- a/src/librustc_trans/debuginfo/metadata.rs +++ b/src/librustc_trans/debuginfo/metadata.rs @@ -906,7 +906,7 @@ impl<'tcx> StructMemberDescriptionFactory<'tcx> { MemberDescription { name: name, - llvm_type: type_of::type_of(cx, fty), + llvm_type: type_of::in_memory_type_of(cx, fty), type_metadata: type_metadata(cx, fty, self.span), offset: offset, flags: DIFlags::FlagZero, diff --git a/src/test/debuginfo/unsized.rs b/src/test/debuginfo/unsized.rs new file mode 100644 index 00000000000..b0ce335a8d9 --- /dev/null +++ b/src/test/debuginfo/unsized.rs @@ -0,0 +1,45 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags:-g + +// === GDB TESTS =================================================================================== + +// gdb-command:run + +// gdb-command:print *a +// gdbg-check:$1 = {value = [...] "abc"} +// gdbr-check:$1 = unsized::Foo<[u8]> {value: [...]} + +// gdb-command:print *b +// gdbg-check:$2 = {value = {value = [...] "abc"}} +// gdbr-check:$2 = unsized::Foo<unsized::Foo<[u8]>> {value: unsized::Foo<[u8]> {value: [...]}} + + +#![feature(omit_gdb_pretty_printer_section)] +#![omit_gdb_pretty_printer_section] + +struct Foo<T: ?Sized> { + value: T +} + +fn main() { + let foo: Foo<Foo<[u8; 4]>> = Foo { + value: Foo { + value: *b"abc\0" + } + }; + let a: &Foo<[u8]> = &foo.value; + let b: &Foo<Foo<[u8]>> = &foo; + + zzz(); // #break +} + +fn zzz() { () }