@@ -74,6 +74,15 @@ fn update_cache(cache: metadata_cache, mdtag: int, val: debug_metadata) {
74
74
75
75
////////////////
76
76
77
+ type debug_ctxt = {
78
+ llmetadata : metadata_cache ,
79
+ //llmod: ValueRef,
80
+ //opt: bool,
81
+ names : trans_common:: namegen
82
+ } ;
83
+
84
+ ////////////////
85
+
77
86
type metadata < T > = { node : ValueRef , data : T } ;
78
87
79
88
type file_md = { path: str } ;
@@ -134,7 +143,7 @@ fn cached_metadata<copy T>(cache: metadata_cache, mdtag: int,
134
143
135
144
fn get_compile_unit_metadata ( cx : @crate_ctxt , full_path : str )
136
145
-> @metadata < compile_unit_md > {
137
- let cache = cx . llmetadata ;
146
+ let cache = get_cache ( cx ) ;
138
147
alt cached_metadata :: < @metadata < compile_unit_md > > ( cache, CompileUnitTag ,
139
148
{ |md| md. data . path == full_path} ) {
140
149
option:: some ( md) { ret md; }
@@ -166,37 +175,45 @@ fn get_compile_unit_metadata(cx: @crate_ctxt, full_path: str)
166
175
ret mdval;
167
176
}
168
177
178
+ fn get_cache ( cx : @crate_ctxt ) -> metadata_cache {
179
+ option:: get ( cx. dbg_cx ) . llmetadata
180
+ }
181
+
169
182
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 ;
171
185
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. { }
177
189
}
178
190
let fname = fs:: basename ( full_path) ;
179
191
let path = fs:: dirname ( full_path) ;
180
192
let unit_node = get_compile_unit_metadata ( cx, full_path) . node ;
181
- let file_md = [ lltag ( FileDescriptorTag ) ,
193
+ let file_md = [ lltag ( tg ) ,
182
194
llstr ( fname) ,
183
195
llstr ( path) ,
184
196
unit_node] ;
185
197
let val = llmdnode ( file_md) ;
186
198
let mdval = @{ node: val, data : { path : full_path} } ;
187
- update_cache ( cache, FileDescriptorTag , file_metadata ( mdval) ) ;
199
+ update_cache ( cache, tg , file_metadata ( mdval) ) ;
188
200
ret mdval;
189
201
}
190
202
203
+ fn line_from_span ( cm : codemap:: codemap , sp : codemap:: span ) -> uint {
204
+ codemap:: lookup_char_pos ( cm, sp. lo ) . line
205
+ }
206
+
191
207
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) ) ;
193
209
let start = codemap:: lookup_char_pos ( bcx_ccx ( cx) . sess . get_codemap ( ) ,
194
210
cx. sp . lo ) ;
195
211
let fname = start. filename ;
196
212
let end = codemap:: lookup_char_pos ( bcx_ccx ( cx) . sess . get_codemap ( ) ,
197
213
cx. sp . hi ) ;
214
+ let tg = LexicalBlockTag ;
198
215
alt cached_metadata :: < @metadata < block_md > > (
199
- cache, LexicalBlockTag ,
216
+ cache, tg ,
200
217
{ |md| start == md. data . start && end == md. data . end } ) {
201
218
option:: some ( md) { ret md; }
202
219
option:: none. { }
@@ -210,7 +227,7 @@ fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
210
227
option:: some ( v) { vec:: len ( v) as int }
211
228
option:: none. { 0 }
212
229
} ;
213
- let lldata = [ lltag ( LexicalBlockTag ) ,
230
+ let lldata = [ lltag ( tg ) ,
214
231
parent,
215
232
lli32 ( start. line as int ) ,
216
233
lli32 ( start. col as int ) ,
@@ -219,7 +236,7 @@ fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
219
236
] ;
220
237
let val = llmdnode ( lldata) ;
221
238
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) ) ;
223
240
ret mdval;
224
241
}
225
242
@@ -229,7 +246,7 @@ fn size_and_align_of<T>() -> (int, int) {
229
246
230
247
fn get_basic_type_metadata ( cx : @crate_ctxt , t : ty:: t , ty : @ast:: ty )
231
248
-> @metadata < tydesc_md > {
232
- let cache = cx . llmetadata ;
249
+ let cache = get_cache ( cx ) ;
233
250
let tg = BasicTypeDescriptorTag ;
234
251
alt cached_metadata :: < @metadata < tydesc_md > > (
235
252
cache, tg,
@@ -315,6 +332,82 @@ fn get_pointer_type_metadata(cx: @crate_ctxt, t: ty::t, span: codemap::span,
315
332
ret mdval;
316
333
}
317
334
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
+
318
411
fn get_boxed_type_metadata ( cx : @crate_ctxt , outer : ty:: t , inner : ty:: t ,
319
412
span : codemap:: span , boxed : @metadata < tydesc_md > )
320
413
-> @metadata < tydesc_md > {
@@ -352,7 +445,7 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
352
445
lli64 ( 0 ) ,
353
446
lli32 ( 0 ) ,
354
447
refcount_type. node ] ;
355
- let size = 64 ; //XXX size of inner
448
+ let size = 64 ; //XXX member_size_and_align(???)
356
449
let boxed_member = [ lltag ( MemberTag ) ,
357
450
file_node. node ,
358
451
llstr ( "boxed" ) ,
@@ -379,15 +472,57 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
379
472
lli32 ( 0 ) // runtime language
380
473
] ;
381
474
let llnode = llmdnode ( lldata) ;
382
- let mdval = @{ node: llnode, data : { hash : ty :: hash_ty ( outer) } } ;
475
+ let mdval = @{ node: llnode, data : { hash : outer} } ;
383
476
//update_cache(cache, tg, tydesc_metadata(mdval));
384
477
llvm:: LLVMAddNamedMetadataOperand ( cx. llmod , as_buf ( "llvm.dbg.ty" ) ,
385
478
str:: byte_len ( "llvm.dbg.ty" ) ,
386
479
llnode) ;
387
480
ret mdval;
388
481
}
389
482
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
+
390
518
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
+
391
526
fn t_to_ty ( cx : @crate_ctxt , t : ty:: t , span : codemap:: span ) -> @ast:: ty {
392
527
let ty = alt ty:: struct ( ccx_tcx ( cx) , t) {
393
528
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_
400
535
mut: mt. mut } ) }
401
536
ty:: ty_uniq ( mt) { ast:: ty_uniq ( { ty: t_to_ty ( cx, mt. ty , span) ,
402
537
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
+ }
403
548
} ;
404
549
ret @{ node : ty, span : span} ;
405
550
}
551
+
406
552
alt ty. node {
407
553
ast:: ty_box ( mt) {
408
554
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_
423
569
let inferred = t_to_ty ( cx, t, ty. span ) ;
424
570
ret get_ty_metadata ( cx, t, inferred) ;
425
571
}
572
+ ast:: ty_rec ( fields) {
573
+ ret get_record_metadata ( cx, t, fields, ty. span ) ;
574
+ }
426
575
_ { ret get_basic_type_metadata( cx, t, ty) ; }
427
576
} ;
428
577
}
@@ -442,7 +591,7 @@ fn filename_from_span(cx: @crate_ctxt, sp: codemap::span) -> str {
442
591
fn get_local_var_metadata ( bcx : @block_ctxt , local : @ast:: local )
443
592
-> @metadata < local_var_md > unsafe {
444
593
let cx = bcx_ccx ( bcx) ;
445
- let cache = cx . llmetadata ;
594
+ let cache = get_cache ( cx ) ;
446
595
alt cached_metadata :: < @metadata < local_var_md > > (
447
596
cache, AutoVariableTag , { |md| md. data . id == local. node . id } ) {
448
597
option:: some ( md) { ret md; }
@@ -540,7 +689,7 @@ fn get_arg_metadata(bcx: @block_ctxt, arg: ast::arg)
540
689
-> @metadata < argument_md > unsafe {
541
690
let fcx = bcx_fcx ( bcx) ;
542
691
let cx = fcx_ccx ( fcx) ;
543
- let cache = cx . llmetadata ;
692
+ let cache = get_cache ( cx ) ;
544
693
alt cached_metadata :: < @metadata < argument_md > > (
545
694
cache, ArgVariableTag , { |md| md. data . id == arg. id } ) {
546
695
option:: some ( md) { ret md; }
@@ -641,7 +790,7 @@ fn add_line_info(cx: @block_ctxt, llinstr: ValueRef) {
641
790
fn get_function_metadata ( fcx : @fn_ctxt , item : @ast:: item ,
642
791
llfndecl : ValueRef ) -> @metadata < subprogram_md > {
643
792
let cx = fcx_ccx ( fcx) ;
644
- let cache = cx . llmetadata ;
793
+ let cache = get_cache ( cx ) ;
645
794
alt cached_metadata :: < @metadata < subprogram_md > > (
646
795
cache, SubprogramTag , { |md| md. data . name == item. ident &&
647
796
/*sub.path == ??*/ true } ) {
@@ -708,4 +857,4 @@ fn get_function_metadata(fcx: @fn_ctxt, item: @ast::item,
708
857
_ { let _ = get_retval_metadata(fcx, ret_ty); }
709
858
}*/
710
859
ret mdval;
711
- }
860
+ }
0 commit comments