diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/middle/trans/debuginfo.rs | 52 | ||||
| -rw-r--r-- | src/test/debug-info/boxed-vec.rs | 4 | ||||
| -rw-r--r-- | src/test/debug-info/managed-pointer-within-unique-vec.rs | 37 | ||||
| -rw-r--r-- | src/test/debug-info/managed-pointer-within-unique.rs (renamed from src/test/debug-info/managed-box-within-unique.rs) | 0 |
4 files changed, 76 insertions, 17 deletions
diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs index eea65a4c48a..2489f4f8235 100644 --- a/src/librustc/middle/trans/debuginfo.rs +++ b/src/librustc/middle/trans/debuginfo.rs @@ -581,7 +581,8 @@ fn tuple_metadata(cx: &mut CrateContext, fn enum_metadata(cx: &mut CrateContext, enum_type: ty::t, enum_def_id: ast::def_id, - substs: &ty::substs, + // _substs is only needed in the other version. Will go away with new snapshot. + _substs: &ty::substs, span: span) -> DIType { @@ -1017,10 +1018,10 @@ fn fixed_vec_metadata(cx: &mut CrateContext, }; } -fn boxed_vec_metadata(cx: &mut CrateContext, - element_type: ty::t, - span: span) - -> DICompositeType { +fn vec_metadata(cx: &mut CrateContext, + element_type: ty::t, + span: span) + -> DICompositeType { let element_type_metadata = type_metadata(cx, element_type, span); let element_llvm_type = type_of::type_of(cx, element_type); @@ -1045,7 +1046,7 @@ fn boxed_vec_metadata(cx: &mut CrateContext, // fill alloc elements let member_type_metadata = &[int_type_metadata, int_type_metadata, array_type_metadata]; - let vec_metadata = composite_type_metadata( + return composite_type_metadata( cx, vec_llvm_type, vec_type_name, @@ -1053,6 +1054,17 @@ fn boxed_vec_metadata(cx: &mut CrateContext, member_names, member_type_metadata, span); +} + +fn boxed_vec_metadata(cx: &mut CrateContext, + element_type: ty::t, + span: span) + -> DICompositeType { + + let element_llvm_type = type_of::type_of(cx, element_type); + let vec_llvm_type = Type::vec(cx.sess.targ_cfg.arch, &element_llvm_type); + let vec_type_name: &str = fmt!("[%s]", ty_to_str(cx.tcx, element_type)); + let vec_metadata = vec_metadata(cx, element_type, span); return boxed_type_metadata( cx, @@ -1197,10 +1209,13 @@ fn type_metadata(cx: &mut CrateContext, ty::vstore_fixed(len) => { fixed_vec_metadata(cx, i8_t, len + 1, span) }, - ty::vstore_uniq | + ty::vstore_uniq => { + let vec_metadata = vec_metadata(cx, i8_t, span); + pointer_type_metadata(cx, t, vec_metadata) + } ty::vstore_box => { - let box_metadata = boxed_vec_metadata(cx, i8_t, span); - pointer_type_metadata(cx, t, box_metadata) + let boxed_vec_metadata = boxed_vec_metadata(cx, i8_t, span); + pointer_type_metadata(cx, t, boxed_vec_metadata) } ty::vstore_slice(_region) => { vec_slice_metadata(cx, t, i8_t, span) @@ -1217,12 +1232,19 @@ fn type_metadata(cx: &mut CrateContext, match *vstore { ty::vstore_fixed(len) => { fixed_vec_metadata(cx, mt.ty, len, span) - }, - ty::vstore_uniq | - ty::vstore_box => { - let box_metadata = boxed_vec_metadata(cx, mt.ty, span); - pointer_type_metadata(cx, t, box_metadata) - }, + } + ty::vstore_uniq if ty::type_contents(cx.tcx, mt.ty).contains_managed() => { + let boxed_vec_metadata = boxed_vec_metadata(cx, mt.ty, span); + pointer_type_metadata(cx, t, boxed_vec_metadata) + } + ty::vstore_uniq => { + let vec_metadata = vec_metadata(cx, mt.ty, span); + pointer_type_metadata(cx, t, vec_metadata) + } + ty::vstore_box => { + let boxed_vec_metadata = boxed_vec_metadata(cx, mt.ty, span); + pointer_type_metadata(cx, t, boxed_vec_metadata) + } ty::vstore_slice(_) => { vec_slice_metadata(cx, t, mt.ty, span) } diff --git a/src/test/debug-info/boxed-vec.rs b/src/test/debug-info/boxed-vec.rs index 964ca689e8a..8abead65196 100644 --- a/src/test/debug-info/boxed-vec.rs +++ b/src/test/debug-info/boxed-vec.rs @@ -20,9 +20,9 @@ // debugger:print *((uint64_t[3]*)(managed->val.elements)) // check:$2 = {7, 8, 9} -// debugger:print unique->val.fill +// debugger:print unique->fill // check:$3 = 32 -// debugger:print *((uint64_t[4]*)(unique->val.elements)) +// debugger:print *((uint64_t[4]*)(unique->elements)) // check:$4 = {10, 11, 12, 13} fn main() { diff --git a/src/test/debug-info/managed-pointer-within-unique-vec.rs b/src/test/debug-info/managed-pointer-within-unique-vec.rs new file mode 100644 index 00000000000..e42631599a9 --- /dev/null +++ b/src/test/debug-info/managed-pointer-within-unique-vec.rs @@ -0,0 +1,37 @@ +// Copyright 2013 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. + +// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249 + +// compile-flags:-Z extra-debug-info +// debugger:break zzz +// debugger:run +// debugger:finish + +// debugger:print unique->val.elements[0]->val +// check:$1 = 10 + +// debugger:print unique->val.elements[1]->val +// check:$2 = 11 + +// debugger:print unique->val.elements[2]->val +// check:$3 = 12 + +// debugger:print unique->val.elements[3]->val +// check:$4 = 13 + +fn main() { + + let unique: ~[@i64] = ~[@10, @11, @12, @13]; + + zzz(); +} + +fn zzz() {()} \ No newline at end of file diff --git a/src/test/debug-info/managed-box-within-unique.rs b/src/test/debug-info/managed-pointer-within-unique.rs index 3eb1c2ef01e..3eb1c2ef01e 100644 --- a/src/test/debug-info/managed-box-within-unique.rs +++ b/src/test/debug-info/managed-pointer-within-unique.rs |
