Skip to content

Commit e9baeab

Browse files
debuginfo: Adapted DI generation to new memory layout of unique vecs.
1 parent b2aeb4b commit e9baeab

File tree

4 files changed

+76
-17
lines changed

4 files changed

+76
-17
lines changed

src/librustc/middle/trans/debuginfo.rs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,8 @@ fn tuple_metadata(cx: &mut CrateContext,
581581
fn enum_metadata(cx: &mut CrateContext,
582582
enum_type: ty::t,
583583
enum_def_id: ast::def_id,
584-
substs: &ty::substs,
584+
// _substs is only needed in the other version. Will go away with new snapshot.
585+
_substs: &ty::substs,
585586
span: span)
586587
-> DIType {
587588

@@ -1017,10 +1018,10 @@ fn fixed_vec_metadata(cx: &mut CrateContext,
10171018
};
10181019
}
10191020

1020-
fn boxed_vec_metadata(cx: &mut CrateContext,
1021-
element_type: ty::t,
1022-
span: span)
1023-
-> DICompositeType {
1021+
fn vec_metadata(cx: &mut CrateContext,
1022+
element_type: ty::t,
1023+
span: span)
1024+
-> DICompositeType {
10241025

10251026
let element_type_metadata = type_metadata(cx, element_type, span);
10261027
let element_llvm_type = type_of::type_of(cx, element_type);
@@ -1045,14 +1046,25 @@ fn boxed_vec_metadata(cx: &mut CrateContext,
10451046
// fill alloc elements
10461047
let member_type_metadata = &[int_type_metadata, int_type_metadata, array_type_metadata];
10471048

1048-
let vec_metadata = composite_type_metadata(
1049+
return composite_type_metadata(
10491050
cx,
10501051
vec_llvm_type,
10511052
vec_type_name,
10521053
member_llvm_types,
10531054
member_names,
10541055
member_type_metadata,
10551056
span);
1057+
}
1058+
1059+
fn boxed_vec_metadata(cx: &mut CrateContext,
1060+
element_type: ty::t,
1061+
span: span)
1062+
-> DICompositeType {
1063+
1064+
let element_llvm_type = type_of::type_of(cx, element_type);
1065+
let vec_llvm_type = Type::vec(cx.sess.targ_cfg.arch, &element_llvm_type);
1066+
let vec_type_name: &str = fmt!("[%s]", ty_to_str(cx.tcx, element_type));
1067+
let vec_metadata = vec_metadata(cx, element_type, span);
10561068

10571069
return boxed_type_metadata(
10581070
cx,
@@ -1197,10 +1209,13 @@ fn type_metadata(cx: &mut CrateContext,
11971209
ty::vstore_fixed(len) => {
11981210
fixed_vec_metadata(cx, i8_t, len + 1, span)
11991211
},
1200-
ty::vstore_uniq |
1212+
ty::vstore_uniq => {
1213+
let vec_metadata = vec_metadata(cx, i8_t, span);
1214+
pointer_type_metadata(cx, t, vec_metadata)
1215+
}
12011216
ty::vstore_box => {
1202-
let box_metadata = boxed_vec_metadata(cx, i8_t, span);
1203-
pointer_type_metadata(cx, t, box_metadata)
1217+
let boxed_vec_metadata = boxed_vec_metadata(cx, i8_t, span);
1218+
pointer_type_metadata(cx, t, boxed_vec_metadata)
12041219
}
12051220
ty::vstore_slice(_region) => {
12061221
vec_slice_metadata(cx, t, i8_t, span)
@@ -1217,12 +1232,19 @@ fn type_metadata(cx: &mut CrateContext,
12171232
match *vstore {
12181233
ty::vstore_fixed(len) => {
12191234
fixed_vec_metadata(cx, mt.ty, len, span)
1220-
},
1221-
ty::vstore_uniq |
1222-
ty::vstore_box => {
1223-
let box_metadata = boxed_vec_metadata(cx, mt.ty, span);
1224-
pointer_type_metadata(cx, t, box_metadata)
1225-
},
1235+
}
1236+
ty::vstore_uniq if ty::type_contents(cx.tcx, mt.ty).contains_managed() => {
1237+
let boxed_vec_metadata = boxed_vec_metadata(cx, mt.ty, span);
1238+
pointer_type_metadata(cx, t, boxed_vec_metadata)
1239+
}
1240+
ty::vstore_uniq => {
1241+
let vec_metadata = vec_metadata(cx, mt.ty, span);
1242+
pointer_type_metadata(cx, t, vec_metadata)
1243+
}
1244+
ty::vstore_box => {
1245+
let boxed_vec_metadata = boxed_vec_metadata(cx, mt.ty, span);
1246+
pointer_type_metadata(cx, t, boxed_vec_metadata)
1247+
}
12261248
ty::vstore_slice(_) => {
12271249
vec_slice_metadata(cx, t, mt.ty, span)
12281250
}

src/test/debug-info/boxed-vec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
// debugger:print *((uint64_t[3]*)(managed->val.elements))
2121
// check:$2 = {7, 8, 9}
2222

23-
// debugger:print unique->val.fill
23+
// debugger:print unique->fill
2424
// check:$3 = 32
25-
// debugger:print *((uint64_t[4]*)(unique->val.elements))
25+
// debugger:print *((uint64_t[4]*)(unique->elements))
2626
// check:$4 = {10, 11, 12, 13}
2727

2828
fn main() {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
12+
13+
// compile-flags:-Z extra-debug-info
14+
// debugger:break zzz
15+
// debugger:run
16+
// debugger:finish
17+
18+
// debugger:print unique->val.elements[0]->val
19+
// check:$1 = 10
20+
21+
// debugger:print unique->val.elements[1]->val
22+
// check:$2 = 11
23+
24+
// debugger:print unique->val.elements[2]->val
25+
// check:$3 = 12
26+
27+
// debugger:print unique->val.elements[3]->val
28+
// check:$4 = 13
29+
30+
fn main() {
31+
32+
let unique: ~[@i64] = ~[@10, @11, @12, @13];
33+
34+
zzz();
35+
}
36+
37+
fn zzz() {()}

0 commit comments

Comments
 (0)