@@ -15,6 +15,7 @@ const DW_VIRTUALITY_none: int = 0;
15
15
const CompileUnitTag : int = 17 ;
16
16
const FileDescriptorTag : int = 41 ;
17
17
const SubprogramTag : int = 46 ;
18
+ const SubroutineTag : int = 21 ;
18
19
const BasicTypeDescriptorTag : int = 36 ;
19
20
const AutoVariableTag : int = 256 ;
20
21
const ArgVariableTag : int = 257 ;
@@ -54,8 +55,8 @@ fn llmdnode(elems: [ValueRef]) -> ValueRef unsafe {
54
55
fn llunused ( ) -> ValueRef {
55
56
lli32 ( 0x0 )
56
57
}
57
- fn llnull ( ) -> ValueRef {
58
- C_null ( T_ptr ( T_nil ( ) ) )
58
+ fn llnull ( ) -> ValueRef unsafe {
59
+ unsafe :: reinterpret_cast ( std :: ptr :: null :: < ValueRef > ( ) )
59
60
}
60
61
61
62
fn update_cache ( cache : metadata_cache , mdtag : int , val : debug_metadata ) {
@@ -191,10 +192,8 @@ fn get_block_metadata(cx: @block_ctxt) -> @metadata<block_md> {
191
192
option:: none. { }
192
193
}
193
194
let parent = alt cx. parent {
194
- trans_common:: parent_none. { llnull ( ) }
195
- trans_common:: parent_some ( bcx) {
196
- get_block_metadata ( bcx) . node
197
- }
195
+ trans_common:: parent_none. { function_metadata_from_block ( cx) . node }
196
+ trans_common:: parent_some ( bcx) { get_block_metadata ( cx) . node }
198
197
} ;
199
198
let file_node = get_file_metadata ( bcx_ccx ( cx) , fname) ;
200
199
let unique_id = alt cache. find ( LexicalBlockTag ) {
@@ -259,6 +258,14 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
259
258
ret mdval;
260
259
}
261
260
261
+ fn function_metadata_from_block ( bcx : @block_ctxt ) -> @metadata < subprogram_md > {
262
+ let cx = bcx_ccx ( bcx) ;
263
+ let fcx = bcx_fcx ( bcx) ;
264
+ let fn_node = cx. ast_map . get ( fcx. id ) ;
265
+ let fn_item = alt fn_node { ast_map : : node_item ( item) { item } } ;
266
+ get_function_metadata ( cx, fn_item, fcx. llfn )
267
+ }
268
+
262
269
fn get_local_var_metadata ( bcx : @block_ctxt , local : @ast:: local )
263
270
-> @metadata < local_var_md > unsafe {
264
271
let cx = bcx_ccx ( bcx) ;
@@ -276,9 +283,12 @@ fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
276
283
let ty = trans:: node_id_type ( cx, local. node . id ) ;
277
284
let tymd = get_ty_metadata ( cx, ty, local. node . ty ) ;
278
285
let filemd = get_file_metadata ( cx, loc. filename ) ;
279
- let blockmd = get_block_metadata ( bcx) ;
286
+ let context = alt bcx. parent {
287
+ trans_common:: parent_none. { function_metadata_from_block ( bcx) . node }
288
+ trans_common:: parent_some ( _) { get_block_metadata ( bcx) . node }
289
+ } ;
280
290
let lldata = [ lltag ( AutoVariableTag ) ,
281
- blockmd . node , //XXX block context (maybe subprogram if possible?)
291
+ context , // context
282
292
llstr ( name) , // name
283
293
filemd. node ,
284
294
lli32 ( loc. line as int ) , // line
@@ -388,6 +398,21 @@ fn get_function_metadata(cx: @crate_ctxt, item: @ast::item,
388
398
_ { get_ty_metadata( cx, ty:: node_id_to_type ( ccx_tcx ( cx) , item. id ) ,
389
399
ret_ty) . node }
390
400
} ;
401
+ let sub_type = llmdnode ( [ ty_node] ) ;
402
+ let sub_metadata = [ lltag ( SubroutineTag ) ,
403
+ file_node,
404
+ llstr ( "" ) ,
405
+ file_node,
406
+ lli32 ( 0 ) ,
407
+ lli64 ( 0 ) ,
408
+ lli64 ( 0 ) ,
409
+ lli64 ( 0 ) ,
410
+ lli32 ( 0 ) ,
411
+ llnull ( ) ,
412
+ sub_type,
413
+ lli32 ( 0 ) ,
414
+ llnull ( ) ] ;
415
+ let sub_node = llmdnode ( sub_metadata) ;
391
416
let fn_metadata = [ lltag ( SubprogramTag ) ,
392
417
llunused ( ) ,
393
418
file_node,
@@ -396,7 +421,7 @@ fn get_function_metadata(cx: @crate_ctxt, item: @ast::item,
396
421
llstr ( mangled) , //XXX MIPS name?????
397
422
file_node,
398
423
lli32 ( loc. line as int ) ,
399
- ty_node ,
424
+ sub_node ,
400
425
lli1 ( false ) , //XXX static (check export)
401
426
lli1 ( true ) , // not extern
402
427
lli32 ( DW_VIRTUALITY_none ) , // virtual-ness
0 commit comments