@@ -4,10 +4,10 @@ import lib::llvm::llvm;
4
4
import lib:: llvm:: llvm:: ValueRef ;
5
5
import middle:: trans_common:: * ;
6
6
import middle:: ty;
7
- import ast:: ty;
8
7
import syntax:: { ast, codemap} ;
8
+ import ast:: ty;
9
9
10
- const LLVMDebugVersion : int = ( 9 << 16 ) ; //& 0xffff0000; // 0x80000 ?
10
+ const LLVMDebugVersion : int = ( 9 << 16 ) ;
11
11
12
12
const DW_LANG_RUST : int = 0x9000 ;
13
13
const DW_VIRTUALITY_none : int = 0 ;
@@ -78,6 +78,8 @@ type subprogram_md = {name: str, file: str};
78
78
type local_var_md = { id : ast:: node_id } ;
79
79
type tydesc_md = { hash : uint } ;
80
80
type block_md = { start : codemap:: loc , end : codemap:: loc } ;
81
+ type argument_md = { id : ast:: node_id } ;
82
+ type retval_md = { id : ast:: node_id } ;
81
83
82
84
type metadata_cache = hashmap < int , [ debug_metadata ] > ;
83
85
@@ -88,9 +90,11 @@ tag debug_metadata {
88
90
local_var_metadata ( @metadata<local_var_md>) ;
89
91
tydesc_metadata ( @metadata<tydesc_md>) ;
90
92
block_metadata ( @metadata<block_md>) ;
93
+ argument_metadata ( @metadata<argument_md>) ;
94
+ retval_metadata ( @metadata<retval_md>) ;
91
95
}
92
96
93
- fn cast_safely < T , U > ( val : T ) -> U unsafe {
97
+ fn cast_safely < copy T , U > ( val : T ) -> U unsafe {
94
98
let val2 = val;
95
99
let val3 = unsafe :: reinterpret_cast ( val2) ;
96
100
unsafe :: leak ( val2) ;
@@ -105,11 +109,13 @@ fn md_from_metadata<T>(val: debug_metadata) -> T unsafe {
105
109
local_var_metadata ( md) { cast_safely ( md) }
106
110
tydesc_metadata ( md) { cast_safely ( md) }
107
111
block_metadata ( md) { cast_safely ( md) }
112
+ argument_metadata ( md) { cast_safely ( md) }
113
+ retval_metadata ( md) { cast_safely ( md) }
108
114
}
109
115
}
110
116
111
- fn cached_metadata < T > ( cache : metadata_cache , mdtag : int ,
112
- eq : block ( md : T ) -> bool ) -> option:: t < T > unsafe {
117
+ fn cached_metadata < copy T > ( cache : metadata_cache , mdtag : int ,
118
+ eq : block ( md : T ) -> bool ) -> option:: t < T > unsafe {
113
119
if cache. contains_key ( mdtag) {
114
120
let items = cache. get ( mdtag) ;
115
121
for item in items {
@@ -270,7 +276,7 @@ fn function_metadata_from_block(bcx: @block_ctxt) -> @metadata<subprogram_md> {
270
276
let fcx = bcx_fcx ( bcx) ;
271
277
let fn_node = cx. ast_map . get ( fcx. id ) ;
272
278
let fn_item = alt fn_node { ast_map : : node_item ( item) { item } } ;
273
- get_function_metadata ( cx , fn_item, fcx. llfn )
279
+ get_function_metadata ( fcx , fn_item, fcx. llfn )
274
280
}
275
281
276
282
fn filename_from_span ( cx : @crate_ctxt , sp : codemap:: span ) -> str {
@@ -323,6 +329,98 @@ fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
323
329
ret mdval;
324
330
}
325
331
332
+ //FIXME: consolidate with get_local_var_metadata
333
+ /*fn get_retval_metadata(bcx: @block_ctxt)
334
+ -> @metadata<retval_md> unsafe {
335
+ let fcx = bcx_fcx(bcx);
336
+ let cx = fcx_ccx(fcx);
337
+ let cache = cx.llmetadata;
338
+ alt cached_metadata::<@metadata<retval_md>>(
339
+ cache, ReturnVariableTag, {|md| md.data.id == fcx.id}) {
340
+ option::some(md) { ret md; }
341
+ option::none. {}
342
+ }
343
+ let item = alt option::get(cx.ast_map.find(fcx.id)) {
344
+ ast_map::node_item(item) { item }
345
+ };
346
+ let loc = codemap::lookup_char_pos(cx.sess.get_codemap(),
347
+ fcx.sp.lo);
348
+ let ret_ty = alt item.node {
349
+ ast::item_fn(f, _) { f.decl.output }
350
+ };
351
+ let ty_node = alt ret_ty.node {
352
+ ast::ty_nil. { llnull() }
353
+ _ { get_ty_metadata(cx, ty::node_id_to_type(ccx_tcx(cx), item.id),
354
+ ret_ty).node }
355
+ };
356
+ /*let ty_node = get_ty_metadata(cx, ty::node_id_to_type(ccx_tcx(cx), fcx.id),
357
+ ty).node;*/
358
+ //let ty = trans::node_id_type(cx, arg.id);
359
+ //let tymd = get_ty_metadata(cx, ty, arg.ty);
360
+ let filemd = get_file_metadata(cx, loc.filename);
361
+ let fn_node = cx.ast_map.get(fcx.id);
362
+ let fn_item = alt fn_node { ast_map::node_item(item) { item } };
363
+ let context = get_function_metadata(fcx, fn_item, fcx.llfn);
364
+ let lldata = [lltag(ReturnVariableTag),
365
+ context.node, // context
366
+ llstr("%0"), // name
367
+ filemd.node,
368
+ lli32(loc.line as int), // line
369
+ ty_node,
370
+ lli32(0) //XXX flags
371
+ ];
372
+ let mdnode = llmdnode(lldata);
373
+ let mdval = @{node: mdnode, data: {id: fcx.id}};
374
+ update_cache(cache, ReturnVariableTag, retval_metadata(mdval));
375
+ let llptr = fcx.llretptr;
376
+ let declargs = [llmdnode([llptr]), mdnode];
377
+ trans_build::Call(bcx, cx.intrinsics.get("llvm.dbg.declare"),
378
+ declargs);
379
+ ret mdval;
380
+ }*/
381
+
382
+ //FIXME: consolidate with get_local_var_metadata
383
+ fn get_arg_metadata ( bcx : @block_ctxt , arg : ast:: arg )
384
+ -> @metadata < argument_md > unsafe {
385
+ let fcx = bcx_fcx ( bcx) ;
386
+ let cx = fcx_ccx ( fcx) ;
387
+ let cache = cx. llmetadata ;
388
+ alt cached_metadata :: < @metadata < argument_md > > (
389
+ cache, ArgVariableTag , { |md| md. data . id == arg. id } ) {
390
+ option:: some ( md) { ret md; }
391
+ option:: none. { }
392
+ }
393
+ let arg_n = alt cx. ast_map . get ( arg. id ) {
394
+ ast_map:: node_arg ( _, n) { n - 2 u }
395
+ } ;
396
+ let loc = codemap:: lookup_char_pos ( cx. sess . get_codemap ( ) ,
397
+ fcx. sp . lo ) ;
398
+ let ty = trans:: node_id_type ( cx, arg. id ) ;
399
+ let tymd = get_ty_metadata ( cx, ty, arg. ty ) ;
400
+ let filemd = get_file_metadata ( cx, loc. filename ) ;
401
+ let fn_node = cx. ast_map . get ( fcx. id ) ;
402
+ let fn_item = alt fn_node { ast_map : : node_item ( item) { item } } ;
403
+ let context = get_function_metadata ( fcx, fn_item, fcx. llfn ) ;
404
+ let lldata = [ lltag ( ArgVariableTag ) ,
405
+ context. node , // context
406
+ llstr ( arg. ident ) , // name
407
+ filemd. node ,
408
+ lli32 ( loc. line as int ) , // line
409
+ tymd. node ,
410
+ lli32 ( 0 ) //XXX flags
411
+ ] ;
412
+ let mdnode = llmdnode ( lldata) ;
413
+ let mdval = @{ node: mdnode, data : { id : arg. id } } ;
414
+ update_cache ( cache, ArgVariableTag , argument_metadata ( mdval) ) ;
415
+ let llptr = alt fcx. llargs . get ( arg. id ) {
416
+ local_mem ( v) | local_imm ( v) { v }
417
+ } ;
418
+ let declargs = [ llmdnode ( [ llptr] ) , mdnode] ;
419
+ trans_build:: Call ( bcx, cx. intrinsics . get ( "llvm.dbg.declare" ) ,
420
+ declargs) ;
421
+ ret mdval;
422
+ }
423
+
326
424
fn update_source_pos ( cx : @block_ctxt , s : codemap:: span ) -> @debug_source_pos {
327
425
let dsp = @debug_source_pos ( cx) ;
328
426
if !bcx_ccx ( cx) . sess . get_opts ( ) . debuginfo {
@@ -384,8 +482,9 @@ fn add_line_info(cx: @block_ctxt, llinstr: ValueRef) {
384
482
llvm:: LLVMSetMetadata ( llinstr, kind_id, dbgscope) ;
385
483
}
386
484
387
- fn get_function_metadata ( cx : @crate_ctxt , item : @ast:: item ,
485
+ fn get_function_metadata ( fcx : @fn_ctxt , item : @ast:: item ,
388
486
llfndecl : ValueRef ) -> @metadata < subprogram_md > {
487
+ let cx = fcx_ccx ( fcx) ;
389
488
let cache = cx. llmetadata ;
390
489
alt cached_metadata :: < @metadata < subprogram_md > > (
391
490
cache, SubprogramTag , { |md| md. data . name == item. ident &&
@@ -448,5 +547,9 @@ fn get_function_metadata(cx: @crate_ctxt, item: @ast::item,
448
547
let mdval = @{ node: val, data : { name : item. ident ,
449
548
file : loc. filename } } ;
450
549
update_cache ( cache, SubprogramTag , subprogram_metadata ( mdval) ) ;
550
+ /*alt ret_ty.node {
551
+ ast::ty_nil. {}
552
+ _ { let _ = get_retval_metadata(fcx, ret_ty); }
553
+ }*/
451
554
ret mdval;
452
555
}
0 commit comments