Skip to content

Commit d366945

Browse files
committed
---
yaml --- r: 6821 b: refs/heads/master c: 30d019d h: refs/heads/master i: 6819: 204fd6d v: v3
1 parent 6a2f8c6 commit d366945

File tree

4 files changed

+178
-23
lines changed

4 files changed

+178
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: f43ed8f1bd249f4d758c2451a422a6d7395a52df
2+
refs/heads/master: 30d019d52088eef214a492a252f85038df79f129

trunk/src/comp/middle/debuginfo.rs

Lines changed: 169 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ fn update_cache(cache: metadata_cache, mdtag: int, val: debug_metadata) {
7474

7575
////////////////
7676

77+
type debug_ctxt = {
78+
llmetadata: metadata_cache,
79+
//llmod: ValueRef,
80+
//opt: bool,
81+
names: trans_common::namegen
82+
};
83+
84+
////////////////
85+
7786
type metadata<T> = {node: ValueRef, data: T};
7887

7988
type file_md = {path: str};
@@ -134,7 +143,7 @@ fn cached_metadata<copy T>(cache: metadata_cache, mdtag: int,
134143

135144
fn get_compile_unit_metadata(cx: @crate_ctxt, full_path: str)
136145
-> @metadata<compile_unit_md> {
137-
let cache = cx.llmetadata;
146+
let cache = get_cache(cx);
138147
alt cached_metadata::<@metadata<compile_unit_md>>(cache, CompileUnitTag,
139148
{|md| md.data.path == full_path}) {
140149
option::some(md) { ret md; }
@@ -166,37 +175,45 @@ fn get_compile_unit_metadata(cx: @crate_ctxt, full_path: str)
166175
ret mdval;
167176
}
168177

178+
fn get_cache(cx: @crate_ctxt) -> metadata_cache {
179+
option::get(cx.dbg_cx).llmetadata
180+
}
181+
169182
fn get_file_metadata(cx: @crate_ctxt, full_path: str) -> @metadata<file_md> {
170-
let cache = cx.llmetadata;
183+
let cache = get_cache(cx);;
184+
let tg = FileDescriptorTag;
171185
alt cached_metadata::<@metadata<file_md>>(
172-
cache, FileDescriptorTag,
173-
{|md|
174-
md.data.path == full_path}) {
175-
option::some(md) { ret md; }
176-
option::none. {}
186+
cache, tg, {|md| md.data.path == full_path}) {
187+
option::some(md) { ret md; }
188+
option::none. {}
177189
}
178190
let fname = fs::basename(full_path);
179191
let path = fs::dirname(full_path);
180192
let unit_node = get_compile_unit_metadata(cx, full_path).node;
181-
let file_md = [lltag(FileDescriptorTag),
193+
let file_md = [lltag(tg),
182194
llstr(fname),
183195
llstr(path),
184196
unit_node];
185197
let val = llmdnode(file_md);
186198
let mdval = @{node: val, data: {path: full_path}};
187-
update_cache(cache, FileDescriptorTag, file_metadata(mdval));
199+
update_cache(cache, tg, file_metadata(mdval));
188200
ret mdval;
189201
}
190202

203+
fn line_from_span(cm: codemap::codemap, sp: codemap::span) -> uint {
204+
codemap::lookup_char_pos(cm, sp.lo).line
205+
}
206+
191207
fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
192-
let cache = bcx_ccx(cx).llmetadata;
208+
let cache = get_cache(bcx_ccx(cx));
193209
let start = codemap::lookup_char_pos(bcx_ccx(cx).sess.get_codemap(),
194210
cx.sp.lo);
195211
let fname = start.filename;
196212
let end = codemap::lookup_char_pos(bcx_ccx(cx).sess.get_codemap(),
197213
cx.sp.hi);
214+
let tg = LexicalBlockTag;
198215
alt cached_metadata::<@metadata<block_md>>(
199-
cache, LexicalBlockTag,
216+
cache, tg,
200217
{|md| start == md.data.start && end == md.data.end}) {
201218
option::some(md) { ret md; }
202219
option::none. {}
@@ -210,7 +227,7 @@ fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
210227
option::some(v) { vec::len(v) as int }
211228
option::none. { 0 }
212229
};
213-
let lldata = [lltag(LexicalBlockTag),
230+
let lldata = [lltag(tg),
214231
parent,
215232
lli32(start.line as int),
216233
lli32(start.col as int),
@@ -219,7 +236,7 @@ fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
219236
];
220237
let val = llmdnode(lldata);
221238
let mdval = @{node: val, data: {start: start, end: end}};
222-
update_cache(cache, LexicalBlockTag, block_metadata(mdval));
239+
update_cache(cache, tg, block_metadata(mdval));
223240
ret mdval;
224241
}
225242

@@ -229,7 +246,7 @@ fn size_and_align_of<T>() -> (int, int) {
229246

230247
fn get_basic_type_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty)
231248
-> @metadata<tydesc_md> {
232-
let cache = cx.llmetadata;
249+
let cache = get_cache(cx);
233250
let tg = BasicTypeDescriptorTag;
234251
alt cached_metadata::<@metadata<tydesc_md>>(
235252
cache, tg,
@@ -315,6 +332,82 @@ fn get_pointer_type_metadata(cx: @crate_ctxt, t: ty::t, span: codemap::span,
315332
ret mdval;
316333
}
317334

335+
type struct_ctxt = {
336+
file: ValueRef,
337+
name: str,
338+
line: int,
339+
mutable members: [ValueRef],
340+
mutable total_size: int,
341+
align: int
342+
};
343+
344+
fn finish_structure(cx: @struct_ctxt) -> ValueRef {
345+
let lldata = [lltag(StructureTypeTag),
346+
cx.file,
347+
llstr(cx.name), // type name
348+
cx.file, // source file definition
349+
lli32(cx.line), // source line definition
350+
lli64(cx.total_size), // size of members
351+
lli64(cx.align), // align
352+
lli64(0), // offset
353+
lli32(0), // flags
354+
llnull(), // derived from
355+
llmdnode(cx.members), // members
356+
lli32(0), // runtime language
357+
llnull()
358+
];
359+
ret llmdnode(lldata);
360+
}
361+
362+
fn create_structure(file: @metadata<file_md>, name: str, line: int)
363+
-> @struct_ctxt {
364+
let cx = @{file: file.node,
365+
name: name,
366+
line: line,
367+
mutable members: [],
368+
mutable total_size: 0,
369+
align: 64 //XXX different alignment per arch?
370+
};
371+
ret cx;
372+
}
373+
374+
fn add_member(cx: @struct_ctxt, name: str, line: int, size: int, align: int,
375+
ty: ValueRef) {
376+
let lldata = [lltag(MemberTag),
377+
cx.file,
378+
llstr(name),
379+
cx.file,
380+
lli32(line),
381+
lli64(size * 8),
382+
lli64(align * 8),
383+
lli64(cx.total_size),
384+
lli32(0),
385+
ty];
386+
cx.total_size += size * 8;
387+
cx.members += [llmdnode(lldata)];
388+
}
389+
390+
fn get_record_metadata(cx: @crate_ctxt, t: ty::t, fields: [ast::ty_field],
391+
span: codemap::span) -> @metadata<tydesc_md> {
392+
let fname = filename_from_span(cx, span);
393+
let file_node = get_file_metadata(cx, fname);
394+
let scx = create_structure(file_node,
395+
option::get(cx.dbg_cx).names.next("rec"),
396+
line_from_span(cx.sess.get_codemap(),
397+
span) as int);
398+
for field in fields {
399+
//let field_t = option::get(ccx_tcx(cx).ast_ty_to_ty_cache.get(field.node.mt.ty));
400+
let field_t = ty::get_field(ccx_tcx(cx), t, field.node.ident).mt.ty;
401+
let ty_md = get_ty_metadata(cx, field_t, field.node.mt.ty);
402+
let (size, align) = member_size_and_align(field.node.mt.ty);
403+
add_member(scx, field.node.ident,
404+
line_from_span(cx.sess.get_codemap(), field.span) as int,
405+
size as int, align as int, ty_md.node);
406+
}
407+
let mdval = @{node: finish_structure(scx), data:{hash: t}};
408+
ret mdval;
409+
}
410+
318411
fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
319412
span: codemap::span, boxed: @metadata<tydesc_md>)
320413
-> @metadata<tydesc_md> {
@@ -352,7 +445,7 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
352445
lli64(0),
353446
lli32(0),
354447
refcount_type.node];
355-
let size = 64; //XXX size of inner
448+
let size = 64; //XXX member_size_and_align(???)
356449
let boxed_member = [lltag(MemberTag),
357450
file_node.node,
358451
llstr("boxed"),
@@ -379,15 +472,57 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
379472
lli32(0) // runtime language
380473
];
381474
let llnode = llmdnode(lldata);
382-
let mdval = @{node: llnode, data: {hash: ty::hash_ty(outer)}};
475+
let mdval = @{node: llnode, data: {hash: outer}};
383476
//update_cache(cache, tg, tydesc_metadata(mdval));
384477
llvm::LLVMAddNamedMetadataOperand(cx.llmod, as_buf("llvm.dbg.ty"),
385478
str::byte_len("llvm.dbg.ty"),
386479
llnode);
387480
ret mdval;
388481
}
389482

483+
fn member_size_and_align(ty: @ast::ty) -> (int, int) {
484+
alt ty.node {
485+
ast::ty_bool. { size_and_align_of::<bool>() }
486+
ast::ty_int(m) { alt m {
487+
ast::ty_char. { size_and_align_of::<char>() }
488+
ast::ty_i. { size_and_align_of::<int>() }
489+
ast::ty_i8. { size_and_align_of::<i8>() }
490+
ast::ty_i16. { size_and_align_of::<i16>() }
491+
ast::ty_i32. { size_and_align_of::<i32>() }
492+
}}
493+
ast::ty_uint(m) { alt m {
494+
ast::ty_u. { size_and_align_of::<uint>() }
495+
ast::ty_u8. { size_and_align_of::<i8>() }
496+
ast::ty_u16. { size_and_align_of::<u16>() }
497+
ast::ty_u32. { size_and_align_of::<u32>() }
498+
}}
499+
ast::ty_float(m) { alt m {
500+
ast::ty_f. { size_and_align_of::<float>() }
501+
ast::ty_f32. { size_and_align_of::<f32>() }
502+
ast::ty_f64. { size_and_align_of::<f64>() }
503+
}}
504+
ast::ty_box(_) | ast::ty_uniq(_) {
505+
size_and_align_of::<ctypes::uintptr_t>()
506+
}
507+
ast::ty_rec(fields) {
508+
let total_size = 0;
509+
for field in fields {
510+
let (size, _) = member_size_and_align(field.node.mt.ty);
511+
total_size += size;
512+
}
513+
(total_size, 64) //XXX different align for other arches?
514+
}
515+
}
516+
}
517+
390518
fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_md> {
519+
/*let cache = get_cache(cx);
520+
alt cached_metadata::<@metadata<tydesc_md>>(
521+
cache, tg, {|md| t == md.data.hash}) {
522+
option::some(md) { ret md; }
523+
option::none. {}
524+
}*/
525+
391526
fn t_to_ty(cx: @crate_ctxt, t: ty::t, span: codemap::span) -> @ast::ty {
392527
let ty = alt ty::struct(ccx_tcx(cx), t) {
393528
ty::ty_nil. { ast::ty_nil }
@@ -400,9 +535,20 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
400535
mut: mt.mut}) }
401536
ty::ty_uniq(mt) { ast::ty_uniq({ty: t_to_ty(cx, mt.ty, span),
402537
mut: mt.mut}) }
538+
ty::ty_rec(fields) {
539+
let fs = [];
540+
for field in fields {
541+
fs += [{node: {ident: field.ident,
542+
mt: {ty: t_to_ty(cx, field.mt.ty, span),
543+
mut: field.mt.mut}},
544+
span: span}];
545+
}
546+
ast::ty_rec(fs)
547+
}
403548
};
404549
ret @{node: ty, span: span};
405550
}
551+
406552
alt ty.node {
407553
ast::ty_box(mt) {
408554
let inner_t = alt ty::struct(ccx_tcx(cx), t) {
@@ -423,6 +569,9 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
423569
let inferred = t_to_ty(cx, t, ty.span);
424570
ret get_ty_metadata(cx, t, inferred);
425571
}
572+
ast::ty_rec(fields) {
573+
ret get_record_metadata(cx, t, fields, ty.span);
574+
}
426575
_ { ret get_basic_type_metadata(cx, t, ty); }
427576
};
428577
}
@@ -442,7 +591,7 @@ fn filename_from_span(cx: @crate_ctxt, sp: codemap::span) -> str {
442591
fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
443592
-> @metadata<local_var_md> unsafe {
444593
let cx = bcx_ccx(bcx);
445-
let cache = cx.llmetadata;
594+
let cache = get_cache(cx);
446595
alt cached_metadata::<@metadata<local_var_md>>(
447596
cache, AutoVariableTag, {|md| md.data.id == local.node.id}) {
448597
option::some(md) { ret md; }
@@ -540,7 +689,7 @@ fn get_arg_metadata(bcx: @block_ctxt, arg: ast::arg)
540689
-> @metadata<argument_md> unsafe {
541690
let fcx = bcx_fcx(bcx);
542691
let cx = fcx_ccx(fcx);
543-
let cache = cx.llmetadata;
692+
let cache = get_cache(cx);
544693
alt cached_metadata::<@metadata<argument_md>>(
545694
cache, ArgVariableTag, {|md| md.data.id == arg.id}) {
546695
option::some(md) { ret md; }
@@ -641,7 +790,7 @@ fn add_line_info(cx: @block_ctxt, llinstr: ValueRef) {
641790
fn get_function_metadata(fcx: @fn_ctxt, item: @ast::item,
642791
llfndecl: ValueRef) -> @metadata<subprogram_md> {
643792
let cx = fcx_ccx(fcx);
644-
let cache = cx.llmetadata;
793+
let cache = get_cache(cx);
645794
alt cached_metadata::<@metadata<subprogram_md>>(
646795
cache, SubprogramTag, {|md| md.data.name == item.ident &&
647796
/*sub.path == ??*/ true}) {
@@ -708,4 +857,4 @@ fn get_function_metadata(fcx: @fn_ctxt, item: @ast::item,
708857
_ { let _ = get_retval_metadata(fcx, ret_ty); }
709858
}*/
710859
ret mdval;
711-
}
860+
}

trunk/src/comp/middle/trans.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5673,6 +5673,12 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
56735673
let sha1s = map::mk_hashmap::<ty::t, str>(hasher, eqer);
56745674
let short_names = map::mk_hashmap::<ty::t, str>(hasher, eqer);
56755675
let crate_map = decl_crate_map(sess, link_meta.name, llmod);
5676+
let dbg_cx = if sess.get_opts().debuginfo {
5677+
option::some(@{llmetadata: map::new_int_hash(),
5678+
names: namegen(0)})
5679+
} else {
5680+
option::none
5681+
};
56765682
let ccx =
56775683
@{sess: sess,
56785684
llmod: llmod,
@@ -5723,7 +5729,7 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
57235729
shape_cx: shape::mk_ctxt(llmod),
57245730
gc_cx: gc::mk_ctxt(),
57255731
crate_map: crate_map,
5726-
llmetadata: map::new_int_hash()};
5732+
dbg_cx: dbg_cx};
57275733
let cx = new_local_ctxt(ccx);
57285734
collect_items(ccx, crate);
57295735
collect_tag_ctors(ccx, crate);

trunk/src/comp/middle/trans_common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ type crate_ctxt =
117117
shape_cx: shape::ctxt,
118118
gc_cx: gc::ctxt,
119119
crate_map: ValueRef,
120-
llmetadata: debuginfo::metadata_cache};
120+
dbg_cx: option::t<@debuginfo::debug_ctxt>};
121121

122122
type local_ctxt =
123123
{path: [str],

0 commit comments

Comments
 (0)