Skip to content

Commit 61e8b44

Browse files
committed
Add support for vectors.
1 parent 30d019d commit 61e8b44

File tree

1 file changed

+72
-63
lines changed

1 file changed

+72
-63
lines changed

src/comp/middle/debuginfo.rs

Lines changed: 72 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ const LexicalBlockTag: int = 11;
2525
const PointerTypeTag: int = 15;
2626
const StructureTypeTag: int = 19;
2727
const MemberTag: int = 13;
28+
const ArrayTypeTag: int = 1;
29+
const SubrangeTag: int = 33;
2830

2931
const DW_ATE_boolean: int = 0x02;
3032
const DW_ATE_float: int = 0x04;
@@ -342,21 +344,9 @@ type struct_ctxt = {
342344
};
343345

344346
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);
347+
ret create_composite_type(StructureTypeTag, cx.name, cx.file, cx.line,
348+
cx.total_size, cx.align, 0, option::none,
349+
option::some(cx.members));
360350
}
361351

362352
fn create_structure(file: @metadata<file_md>, name: str, line: int)
@@ -396,7 +386,6 @@ fn get_record_metadata(cx: @crate_ctxt, t: ty::t, fields: [ast::ty_field],
396386
line_from_span(cx.sess.get_codemap(),
397387
span) as int);
398388
for field in fields {
399-
//let field_t = option::get(ccx_tcx(cx).ast_ty_to_ty_cache.get(field.node.mt.ty));
400389
let field_t = ty::get_field(ccx_tcx(cx), t, field.node.ident).mt.ty;
401390
let ty_md = get_ty_metadata(cx, field_t, field.node.mt.ty);
402391
let (size, align) = member_size_and_align(field.node.mt.ty);
@@ -418,60 +407,20 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
418407
option::some(md) { ret md; }
419408
option::none. {}
420409
}*/
421-
let (size, align) = size_and_align_of::<@int>();
422410
let fname = filename_from_span(cx, span);
423411
let file_node = get_file_metadata(cx, fname);
424412
//let cu_node = get_compile_unit_metadata(cx, fname);
425413
let tcx = ccx_tcx(cx);
426414
let uint_t = ty::mk_uint(tcx);
427415
let uint_ty = @{node: ast::ty_uint(ast::ty_u), span: span};
428416
let refcount_type = get_basic_type_metadata(cx, uint_t, uint_ty);
429-
/*let refcount_ptr_type = get_pointer_type_metadata(cx,
430-
ty::mk_imm_uniq(tcx, uint_t),
431-
span, refcount_type);*/
432-
/*let boxed_ptr_type = get_pointer_type_metadata(cx, ty::mk_imm_uniq(tcx, inner),
433-
span, boxed);*/
434-
//let ptr_size = sys::size_of::<ctypes::intptr_t>() as int;
435-
//let ptr_align = sys::align_of::<ctypes::intptr_t>() as int;
436-
let size = sys::size_of::<uint>() as int * 8;
437-
let total_size = size;
438-
let refcount = [lltag(MemberTag),
439-
file_node.node,
440-
llstr("refcnt"),
441-
file_node.node,
442-
lli32(0),
443-
lli64(size),
444-
lli64(sys::align_of::<uint>() as int * 8),
445-
lli64(0),
446-
lli32(0),
447-
refcount_type.node];
448-
let size = 64; //XXX member_size_and_align(???)
449-
let boxed_member = [lltag(MemberTag),
450-
file_node.node,
451-
llstr("boxed"),
452-
file_node.node,
453-
lli32(0),
454-
lli64(size),
455-
lli64(64), //XXX align of inner
456-
lli64(total_size),
457-
lli32(0),
458-
boxed.node];
459-
total_size += size;
460-
let members = [llmdnode(refcount), llmdnode(boxed_member)];
461-
let lldata = [lltag(tg),
462-
file_node.node,
463-
llstr(ty_to_str(ccx_tcx(cx), outer)),
464-
file_node.node,
465-
lli32(0), //XXX source line
466-
lli64(total_size), // size in bits
467-
lli64(align * 8), // alignment in bits
468-
lli64(0), //XXX offset?
469-
lli32(0), //XXX flags
470-
llnull(), // derived from
471-
llmdnode(members), // members
472-
lli32(0) // runtime language
473-
];
474-
let llnode = llmdnode(lldata);
417+
let scx = create_structure(file_node, ty_to_str(ccx_tcx(cx), outer), 0);
418+
add_member(scx, "refcnt", 0, sys::size_of::<uint>() as int,
419+
sys::align_of::<uint>() as int, refcount_type.node);
420+
add_member(scx, "boxed", 0, 8, //XXX member_size_and_align(??)
421+
8, //XXX just a guess
422+
boxed.node);
423+
let llnode = finish_structure(scx);
475424
let mdval = @{node: llnode, data: {hash: outer}};
476425
//update_cache(cache, tg, tydesc_metadata(mdval));
477426
llvm::LLVMAddNamedMetadataOperand(cx.llmod, as_buf("llvm.dbg.ty"),
@@ -480,6 +429,56 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
480429
ret mdval;
481430
}
482431

432+
fn create_composite_type(type_tag: int, name: str, file: ValueRef, line: int,
433+
size: int, align: int, offset: int,
434+
derived: option::t<ValueRef>,
435+
members: option::t<[ValueRef]>)
436+
-> ValueRef {
437+
let lldata = [lltag(type_tag),
438+
file,
439+
llstr(name), // type name
440+
file, // source file definition
441+
lli32(line), // source line definition
442+
lli64(size), // size of members
443+
lli64(align), // align
444+
lli64(offset), // offset
445+
lli32(0), // flags
446+
option::is_none(derived) ? llnull() : // derived from
447+
option::get(derived),
448+
option::is_none(members) ? llnull() : // members
449+
llmdnode(option::get(members)),
450+
lli32(0), // runtime language
451+
llnull()
452+
];
453+
ret llmdnode(lldata);
454+
}
455+
456+
fn get_vec_metadata(cx: @crate_ctxt, vec_t: ty::t, elem_t: ty::t, vec_ty: @ast::ty)
457+
-> @metadata<tydesc_md> {
458+
let fname = filename_from_span(cx, vec_ty.span);
459+
let file_node = get_file_metadata(cx, fname);
460+
let elem_ty = alt vec_ty.node { ast::ty_vec(mt) { mt.ty } };
461+
let elem_ty_md = get_ty_metadata(cx, elem_t, elem_ty);
462+
let tcx = ccx_tcx(cx);
463+
let scx = create_structure(file_node, ty_to_str(tcx, vec_t), 0);
464+
let uint_ty = @{node: ast::ty_uint(ast::ty_u), span: vec_ty.span};
465+
let size_t_type = get_basic_type_metadata(cx, ty::mk_uint(tcx), uint_ty);
466+
add_member(scx, "fill", 0, sys::size_of::<ctypes::size_t>() as int,
467+
sys::align_of::<ctypes::size_t>() as int, size_t_type.node);
468+
add_member(scx, "alloc", 0, sys::size_of::<ctypes::size_t>() as int,
469+
sys::align_of::<ctypes::size_t>() as int, size_t_type.node);
470+
let subrange = llmdnode([lltag(SubrangeTag), lli64(0), lli64(0)]);
471+
let (arr_size, arr_align) = member_size_and_align(elem_ty);
472+
let data_ptr = create_composite_type(ArrayTypeTag, "", file_node.node, 0,
473+
arr_size, arr_align, 0,
474+
option::some(elem_ty_md.node),
475+
option::some([subrange]));
476+
add_member(scx, "data", 0, 0, // according to an equivalent clang dump, the size should be 0
477+
sys::align_of::<u8>() as int, data_ptr);
478+
let llnode = finish_structure(scx);
479+
ret @{node: llnode, data: {hash: vec_t}};
480+
}
481+
483482
fn member_size_and_align(ty: @ast::ty) -> (int, int) {
484483
alt ty.node {
485484
ast::ty_bool. { size_and_align_of::<bool>() }
@@ -512,6 +511,9 @@ fn member_size_and_align(ty: @ast::ty) -> (int, int) {
512511
}
513512
(total_size, 64) //XXX different align for other arches?
514513
}
514+
ast::ty_vec(_) {
515+
size_and_align_of::<ctypes::uintptr_t>()
516+
}
515517
}
516518
}
517519

@@ -545,6 +547,8 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
545547
}
546548
ast::ty_rec(fs)
547549
}
550+
ty::ty_vec(mt) { ast::ty_vec({ty: t_to_ty(cx, mt.ty, span),
551+
mut: mt.mut}) }
548552
};
549553
ret @{node: ty, span: span};
550554
}
@@ -572,6 +576,11 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
572576
ast::ty_rec(fields) {
573577
ret get_record_metadata(cx, t, fields, ty.span);
574578
}
579+
ast::ty_vec(mt) {
580+
let inner_t = ty::sequence_element_type(ccx_tcx(cx), t);
581+
let v = get_vec_metadata(cx, t, inner_t, ty);
582+
ret get_pointer_type_metadata(cx, t, ty.span, v);
583+
}
575584
_ { ret get_basic_type_metadata(cx, t, ty); }
576585
};
577586
}

0 commit comments

Comments
 (0)