about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/trans/debuginfo.rs52
-rw-r--r--src/test/debug-info/boxed-vec.rs4
-rw-r--r--src/test/debug-info/managed-pointer-within-unique-vec.rs37
-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