Skip to content

Commit ecae5e8

Browse files
---
yaml --- r: 69079 b: refs/heads/auto c: 36ea756 h: refs/heads/master i: 69077: c1af8af 69075: e6caba5 69071: 04ac402 v: v3
1 parent 7f047d6 commit ecae5e8

File tree

4 files changed

+135
-73
lines changed

4 files changed

+135
-73
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: 7a31a3e0716f33ceb7c7278cb7da4acbafd97e17
17+
refs/heads/auto: 36ea75683105447cb9f8338cd2a70493f4eb2c70
1818
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1919
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c

branches/auto/src/librustc/middle/trans/debuginfo.rs

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ pub fn create_local_var(bcx: block, local: @ast::local) -> DIVariable {
149149
let loc = span_start(cx, local.span);
150150
let ty = node_id_type(bcx, local.node.id);
151151
let tymd = create_ty(cx, ty, local.node.ty.span);
152-
let filemd = create_file(cx, loc.file.name);
152+
let filemd = get_or_create_file(cx, loc.file.name);
153153
let context = match bcx.parent {
154154
None => create_function(bcx.fcx),
155155
Some(_) => create_block(bcx)
@@ -203,7 +203,7 @@ pub fn create_arg(bcx: block, arg: &ast::arg, span: span) -> Option<DIVariable>
203203

204204
let ty = node_id_type(bcx, arg.id);
205205
let tymd = create_ty(cx, ty, arg.ty.span);
206-
let filemd = create_file(cx, loc.file.name);
206+
let filemd = get_or_create_file(cx, loc.file.name);
207207
let context = create_function(fcx);
208208

209209
match arg.pat.node {
@@ -297,7 +297,7 @@ pub fn create_function(fcx: fn_ctxt) -> DISubprogram {
297297
debug!("create_function: %s, %s", cx.sess.str_of(ident), cx.sess.codemap.span_to_str(span));
298298

299299
let loc = span_start(cx, span);
300-
let file_md = create_file(cx, loc.file.name);
300+
let file_md = get_or_create_file(cx, loc.file.name);
301301

302302
let ret_ty_md = if cx.sess.opts.extra_debuginfo {
303303
match ret_ty.node {
@@ -374,13 +374,13 @@ fn create_compile_unit(cx: @mut CrateContext) {
374374
}}}}}};
375375
}
376376

377-
fn create_file(cx: &mut CrateContext, full_path: &str) -> DIFile {
377+
fn get_or_create_file(cx: &mut CrateContext, full_path: &str) -> DIFile {
378378
match dbg_cx(cx).created_files.find_equiv(&full_path) {
379379
Some(file_md) => return *file_md,
380380
None => ()
381381
}
382382

383-
debug!("create_file: %s", full_path);
383+
debug!("get_or_create_file: %s", full_path);
384384

385385
let work_dir = cx.sess.working_dir.to_str();
386386
let file_name =
@@ -428,7 +428,7 @@ fn create_block(bcx: block) -> DILexicalBlock {
428428
};
429429
let cx = bcx.ccx();
430430
let loc = span_start(cx, span);
431-
let file_md = create_file(cx, loc.file.name);
431+
let file_md = get_or_create_file(cx, loc.file.name);
432432

433433
let block_md = unsafe {
434434
llvm::LLVMDIBuilderCreateLexicalBlock(
@@ -639,6 +639,9 @@ fn create_tuple(cx: &mut CrateContext,
639639
span);
640640
}
641641

642+
/// Creates debug information for a composite type, that is, anything that results in a LLVM struct.
643+
///
644+
/// Examples of Rust types to use this are: structs, tuples, boxes, and enums.
642645
fn create_composite_type(cx: &mut CrateContext,
643646
composite_llvm_type: Type,
644647
composite_type_name: &str,
@@ -649,7 +652,7 @@ fn create_composite_type(cx: &mut CrateContext,
649652
-> DICompositeType {
650653

651654
let loc = span_start(cx, span);
652-
let file_metadata = create_file(cx, loc.file.name);
655+
let file_metadata = get_or_create_file(cx, loc.file.name);
653656

654657
let composite_size = machine::llsize_of_alloc(cx, composite_llvm_type);
655658
let composite_align = machine::llalign_of_min(cx, composite_llvm_type);
@@ -763,47 +766,21 @@ fn create_boxed_type(cx: &mut CrateContext,
763766
member_types_metadata,
764767
span);
765768

769+
// Unfortunately, we cannot assert anything but the correct types here---and not whether the
770+
// 'next' and 'prev' pointers are in the order.
766771
fn box_layout_is_as_expected(cx: &CrateContext,
767-
member_types: &[Type],
768-
content_type: Type)
772+
member_llvm_types: &[Type],
773+
content_llvm_type: Type)
769774
-> bool {
770-
return member_types[0] == cx.int_type
771-
&& member_types[1] == cx.tydesc_type.ptr_to()
772-
&& member_types[2] == Type::i8().ptr_to()
773-
&& member_types[3] == Type::i8().ptr_to()
774-
&& member_types[4] == content_type;
775+
member_llvm_types.len() == 5 &&
776+
member_llvm_types[0] == cx.int_type &&
777+
member_llvm_types[1] == cx.tydesc_type.ptr_to() &&
778+
member_llvm_types[2] == Type::i8().ptr_to() &&
779+
member_llvm_types[3] == Type::i8().ptr_to() &&
780+
member_llvm_types[4] == content_llvm_type
775781
}
776782
}
777783

778-
// fn create_boxed_type(cx: &mut CrateContext,
779-
// contents: ty::t,
780-
// span: span,
781-
// boxed: DIType)
782-
// -> DICompositeType {
783-
784-
// debug!("create_boxed_type: %?", ty::get(contents));
785-
786-
// let loc = span_start(cx, span);
787-
// let file_md = create_file(cx, loc.file.name);
788-
// let int_t = ty::mk_int();
789-
// let refcount_type = create_basic_type(cx, int_t, span);
790-
// let name = ty_to_str(cx.tcx, contents);
791-
792-
// let mut scx = StructContext::new(cx, fmt!("box<%s>", name), file_md, 0);
793-
// scx.add_member("refcnt", 0, sys::size_of::<uint>(),
794-
// sys::min_align_of::<uint>(), refcount_type);
795-
// // the tydesc and other pointers should be irrelevant to the
796-
// // debugger, so treat them as void* types
797-
// let (vp, vpsize, vpalign) = voidptr(cx);
798-
// scx.add_member("tydesc", 0, vpsize, vpalign, vp);
799-
// scx.add_member("prev", 0, vpsize, vpalign, vp);
800-
// scx.add_member("next", 0, vpsize, vpalign, vp);
801-
// let (size, align) = size_and_align_of(cx, contents);
802-
// scx.add_member("val", 0, size, align, boxed);
803-
// return scx.finalize();
804-
// }
805-
806-
807784
fn create_fixed_vec(cx: &mut CrateContext, _vec_t: ty::t, elem_t: ty::t,
808785
len: uint, span: span) -> DIType {
809786
debug!("create_fixed_vec: %?", ty::get(_vec_t));
@@ -831,7 +808,7 @@ fn create_boxed_vec(cx: &mut CrateContext, vec_t: ty::t, elem_t: ty::t,
831808
debug!("create_boxed_vec: %?", ty::get(vec_t));
832809

833810
let loc = span_start(cx, vec_ty_span);
834-
let file_md = create_file(cx, loc.file.name);
811+
let file_md = get_or_create_file(cx, loc.file.name);
835812
let elem_ty_md = create_ty(cx, elem_t, vec_ty_span);
836813

837814
let mut vec_scx = StructContext::new(cx, ty_to_str(cx.tcx, vec_t), file_md, 0);
@@ -896,29 +873,54 @@ fn create_boxed_vec(cx: &mut CrateContext, vec_t: ty::t, elem_t: ty::t,
896873
return mdval;
897874
}
898875

899-
fn create_vec_slice(cx: &mut CrateContext, vec_t: ty::t, elem_t: ty::t, span: span)
900-
-> DICompositeType {
901-
debug!("create_vec_slice: %?", ty::get(vec_t));
876+
fn create_vec_slice(cx: &mut CrateContext,
877+
vec_type: ty::t,
878+
element_type: ty::t,
879+
span: span)
880+
-> DICompositeType {
902881

903-
let loc = span_start(cx, span);
904-
let file_md = create_file(cx, loc.file.name);
905-
let elem_ty_md = create_ty(cx, elem_t, span);
906-
let uint_type = create_basic_type(cx, ty::mk_uint(), span);
907-
let elem_ptr = create_pointer_type(cx, elem_t, span, elem_ty_md);
882+
debug!("create_vec_slice: %?", ty::get(vec_type));
908883

909-
let mut scx = StructContext::new(cx, ty_to_str(cx.tcx, vec_t), file_md, 0);
910-
let (_, ptr_size, ptr_align) = voidptr(cx);
911-
scx.add_member("vec", 0, ptr_size, ptr_align, elem_ptr);
912-
scx.add_member("length", 0, sys::size_of::<uint>(), sys::min_align_of::<uint>(), uint_type);
913-
return scx.finalize();
884+
let slice_llvm_type = type_of::type_of(cx, vec_type);
885+
let slice_type_name = ty_to_str(cx.tcx, vec_type);
886+
887+
let member_llvm_types = slice_llvm_type.field_types();
888+
let member_names = &[~"data_ptr", ~"size_in_bytes"];
889+
890+
assert!(slice_layout_is_as_expected(cx, member_llvm_types, element_type));
891+
892+
let data_ptr_type = ty::mk_ptr(cx.tcx, ty::mt { ty: element_type, mutbl: ast::m_const });
893+
894+
let member_type_metadata = &[
895+
create_ty(cx, data_ptr_type, span),
896+
create_ty(cx, ty::mk_uint(), span)
897+
];
898+
899+
return create_composite_type(
900+
cx,
901+
slice_llvm_type,
902+
slice_type_name,
903+
member_llvm_types,
904+
member_names,
905+
member_type_metadata,
906+
span);
907+
908+
fn slice_layout_is_as_expected(cx: &mut CrateContext,
909+
member_llvm_types: &[Type],
910+
element_type: ty::t)
911+
-> bool {
912+
member_llvm_types.len() == 2 &&
913+
member_llvm_types[0] == type_of::type_of(cx, element_type).ptr_to() &&
914+
member_llvm_types[1] == cx.int_type
915+
}
914916
}
915917

916918
fn create_fn_ty(cx: &mut CrateContext, _fn_ty: ty::t, inputs: ~[ty::t], output: ty::t,
917919
span: span) -> DICompositeType {
918920
debug!("create_fn_ty: %?", ty::get(_fn_ty));
919921

920922
let loc = span_start(cx, span);
921-
let file_md = create_file(cx, loc.file.name);
923+
let file_md = get_or_create_file(cx, loc.file.name);
922924
let (vp, _, _) = voidptr(cx);
923925
let output_md = create_ty(cx, output, span);
924926
let output_ptr_md = create_pointer_type(cx, output, span, output_md);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
// compile-flags:-Z extra-debug-info
12+
// debugger:set print pretty off
13+
// debugger:break zzz
14+
// debugger:run
15+
// debugger:finish
16+
// debugger:print empty.size_in_bytes
17+
// check:$1 = 0
18+
19+
// debugger:print singleton.size_in_bytes
20+
// check:$2 = 8
21+
// debugger:print *((int64_t[1]*)(singleton.data_ptr))
22+
// check:$3 = {1}
23+
24+
// debugger:print multiple.size_in_bytes
25+
// check:$4 = 32
26+
// debugger:print *((int64_t[4]*)(multiple.data_ptr))
27+
// check:$5 = {2, 3, 4, 5}
28+
29+
// debugger:print slice_of_slice.size_in_bytes
30+
// check:$6 = 16
31+
// debugger:print *((int64_t[2]*)(slice_of_slice.data_ptr))
32+
// check:$7 = {3, 4}
33+
34+
// debugger:print padded_tuple.size_in_bytes
35+
// check:$8 = 16
36+
// debugger:print padded_tuple.data_ptr[0]
37+
// check:$9 = {6, 7}
38+
// debugger:print padded_tuple.data_ptr[1]
39+
// check:$10 = {8, 9}
40+
41+
// debugger:print padded_struct.size_in_bytes
42+
// check:$11 = 24
43+
// debugger:print padded_struct.data_ptr[0]
44+
// check:$12 = {x = 10, y = 11, z = 12}
45+
// debugger:print padded_struct.data_ptr[1]
46+
// check:$13 = {x = 13, y = 14, z = 15}
47+
48+
struct AStruct {
49+
x: i16,
50+
y: i32,
51+
z: i16
52+
}
53+
54+
fn main() {
55+
let empty : &[i64] = &[];
56+
let singleton : &[i64] = &[1];
57+
let multiple : &[i64] = &[2, 3, 4, 5];
58+
let slice_of_slice = multiple.slice(1,3);
59+
60+
let padded_tuple : &[(i32, i16)] = &[(6, 7), (8, 9)];
61+
62+
let padded_struct : &[AStruct] = &[
63+
AStruct { x: 10, y: 11, z: 12 },
64+
AStruct { x: 13, y: 14, z: 15 }
65+
];
66+
67+
zzz();
68+
}
69+
70+
fn zzz() {()}

branches/auto/src/test/debug-info/vec.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,18 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
// xfail-test
12-
1311
// compile-flags:-Z extra-debug-info
1412
// debugger:set print pretty off
15-
// debugger:break _zzz
13+
// debugger:break zzz
1614
// debugger:run
1715
// debugger:finish
1816
// debugger:print a
1917
// check:$1 = {1, 2, 3}
20-
// debugger:print b.vec[0]
21-
// check:$2 = 4
22-
// debugger:print c->boxed.data[1]
23-
// check:$3 = 8
24-
// debugger:print d->boxed.data[2]
25-
// check:$4 = 12
2618

2719
fn main() {
2820
let a = [1, 2, 3];
29-
let b = &[4, 5, 6];
30-
let c = @[7, 8, 9];
31-
let d = ~[10, 11, 12];
32-
_zzz();
21+
22+
zzz();
3323
}
3424

35-
fn _zzz() {()}
25+
fn zzz() {()}

0 commit comments

Comments
 (0)