From 91efb2a67f387773750b4ebc2290f16b14bf8e13 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Fri, 13 Dec 2013 17:46:10 +0100 Subject: [PATCH] debuginfo: Set correct source position for function calls. --- src/librustc/middle/trans/base.rs | 22 +++++++++++++++++++--- src/librustc/middle/trans/callee.rs | 2 +- src/librustc/middle/trans/glue.rs | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 00cd3d86437..abb3e22edb7 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -875,8 +875,11 @@ pub fn trans_external_path(ccx: &mut CrateContext, did: ast::DefId, t: ty::t) -> } } -pub fn invoke(bcx: @mut Block, llfn: ValueRef, llargs: ~[ValueRef], - attributes: &[(uint, lib::llvm::Attribute)]) +pub fn invoke(bcx: @mut Block, + llfn: ValueRef, + llargs: ~[ValueRef], + attributes: &[(uint, lib::llvm::Attribute)], + call_info: Option) -> (ValueRef, @mut Block) { let _icx = push_ctxt("invoke_"); if bcx.unreachable { @@ -899,11 +902,18 @@ pub fn invoke(bcx: @mut Block, llfn: ValueRef, llargs: ~[ValueRef], } } let normal_bcx = sub_block(bcx, "normal return"); + let landing_pad = get_landing_pad(bcx); + + match call_info { + Some(info) => debuginfo::set_source_location(bcx.fcx, info.id, info.span), + None => debuginfo::clear_source_location(bcx.fcx) + }; + let llresult = Invoke(bcx, llfn, llargs, normal_bcx.llbb, - get_landing_pad(bcx), + landing_pad, attributes); return (llresult, normal_bcx); } else { @@ -913,6 +923,12 @@ pub fn invoke(bcx: @mut Block, llfn: ValueRef, llargs: ~[ValueRef], debug!("arg: {}", llarg); } } + + match call_info { + Some(info) => debuginfo::set_source_location(bcx.fcx, info.id, info.span), + None => debuginfo::clear_source_location(bcx.fcx) + }; + let llresult = Call(bcx, llfn, llargs, attributes); return (llresult, bcx); } diff --git a/src/librustc/middle/trans/callee.rs b/src/librustc/middle/trans/callee.rs index 5230a5c81b2..db193b9200a 100644 --- a/src/librustc/middle/trans/callee.rs +++ b/src/librustc/middle/trans/callee.rs @@ -697,7 +697,7 @@ pub fn trans_call_inner(in_cx: @mut Block, } // Invoke the actual rust fn and update bcx/llresult. - let (llret, b) = base::invoke(bcx, llfn, llargs, attrs); + let (llret, b) = base::invoke(bcx, llfn, llargs, attrs, call_info); bcx = b; llresult = llret; diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index 2a27a7cee3c..acbe2d13d12 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -429,7 +429,7 @@ pub fn trans_struct_drop(bcx: @mut Block, t: ty::t, v0: ValueRef, dtor_did: ast: add_clean(bcx, llfld_a, fld.mt.ty); } - let (_, bcx) = invoke(bcx, dtor_addr, args, []); + let (_, bcx) = invoke(bcx, dtor_addr, args, [], None); bcx }) }