]> git.lizzy.rs Git - rust.git/commitdiff
debuginfo: Adapted DI generation to new memory layout of unique vecs.
authorMichael Woerister <michaelwoerister@gmail>
Tue, 16 Jul 2013 11:28:13 +0000 (13:28 +0200)
committerMichael Woerister <michaelwoerister@gmail>
Fri, 19 Jul 2013 05:58:28 +0000 (07:58 +0200)
src/librustc/middle/trans/debuginfo.rs
src/test/debug-info/boxed-vec.rs
src/test/debug-info/managed-box-within-unique.rs [deleted file]
src/test/debug-info/managed-pointer-within-unique-vec.rs [new file with mode: 0644]
src/test/debug-info/managed-pointer-within-unique.rs [new file with mode: 0644]

index eea65a4c48addc6c184cd49e2d0f90402bcaf06f..2489f4f8235160171cc4421515995d4862cae53f 100644 (file)
@@ -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 create_pointer_to_box_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 create_pointer_to_box_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)
                 }
index 964ca689e8af1db140063e061ad2eb6cc77699cb..8abead6519697305a8148c9d938108235e205ff3 100644 (file)
@@ -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-box-within-unique.rs b/src/test/debug-info/managed-box-within-unique.rs
deleted file mode 100644 (file)
index 3eb1c2e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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:set print pretty off
-// debugger:break zzz
-// debugger:run
-// debugger:finish
-
-// debugger:print *ordinary_unique
-// check:$1 = {-1, -2}
-
-// debugger:print managed_within_unique.val->x
-// check:$2 = -3
-
-// debugger:print managed_within_unique.val->y->val
-// check:$3 = -4
-
-struct ContainsManaged
-{
-       x: int,
-       y: @int
-}
-
-fn main() {
-
-       let ordinary_unique = ~(-1, -2);
-
-
-       // This is a special case: Normally values allocated in the exchange heap are not boxed, unless,
-       // however, if they contain managed pointers.
-       // This test case verifies that both cases are handled correctly.
-    let managed_within_unique = ~ContainsManaged { x: -3, y: @-4 };
-
-    zzz();
-}
-
-fn zzz() {()}
\ No newline at end of file
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 (file)
index 0000000..e426315
--- /dev/null
@@ -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-pointer-within-unique.rs b/src/test/debug-info/managed-pointer-within-unique.rs
new file mode 100644 (file)
index 0000000..3eb1c2e
--- /dev/null
@@ -0,0 +1,47 @@
+// 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:set print pretty off
+// debugger:break zzz
+// debugger:run
+// debugger:finish
+
+// debugger:print *ordinary_unique
+// check:$1 = {-1, -2}
+
+// debugger:print managed_within_unique.val->x
+// check:$2 = -3
+
+// debugger:print managed_within_unique.val->y->val
+// check:$3 = -4
+
+struct ContainsManaged
+{
+       x: int,
+       y: @int
+}
+
+fn main() {
+
+       let ordinary_unique = ~(-1, -2);
+
+
+       // This is a special case: Normally values allocated in the exchange heap are not boxed, unless,
+       // however, if they contain managed pointers.
+       // This test case verifies that both cases are handled correctly.
+    let managed_within_unique = ~ContainsManaged { x: -3, y: @-4 };
+
+    zzz();
+}
+
+fn zzz() {()}
\ No newline at end of file