From 64bf5a8687c78cf7dc605cc8c8b63748a2746943 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 3 Dec 2014 20:23:15 -0500 Subject: [PATCH] Add a cache so we don't create so many shims. --- src/librustc_trans/trans/callee.rs | 8 ++++++++ src/librustc_trans/trans/context.rs | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/librustc_trans/trans/callee.rs b/src/librustc_trans/trans/callee.rs index 4bcb7b09495..176fe7096e7 100644 --- a/src/librustc_trans/trans/callee.rs +++ b/src/librustc_trans/trans/callee.rs @@ -262,6 +262,12 @@ pub fn trans_fn_pointer_shim<'a, 'tcx>( let _icx = push_ctxt("trans_fn_pointer_shim"); let tcx = ccx.tcx(); + let bare_fn_ty = ty::normalize_ty(tcx, bare_fn_ty); + match ccx.fn_pointer_shims().borrow().get(&bare_fn_ty) { + Some(&llval) => { return llval; } + None => { } + } + debug!("trans_fn_pointer_shim(bare_fn_ty={})", bare_fn_ty.repr(tcx)); @@ -345,6 +351,8 @@ pub fn trans_fn_pointer_shim<'a, 'tcx>( finish_fn(&fcx, bcx, output_ty); + ccx.fn_pointer_shims().borrow_mut().insert(bare_fn_ty, llfn); + llfn } diff --git a/src/librustc_trans/trans/context.rs b/src/librustc_trans/trans/context.rs index a0b7eb02f02..eedfd8df2c0 100644 --- a/src/librustc_trans/trans/context.rs +++ b/src/librustc_trans/trans/context.rs @@ -84,6 +84,7 @@ pub struct LocalCrateContext<'tcx> { tn: TypeNames, externs: RefCell, item_vals: RefCell>, + fn_pointer_shims: RefCell, ValueRef>>, drop_glues: RefCell, ValueRef>>, tydescs: RefCell, Rc>>>, /// Set when running emit_tydescs to enforce that no more tydescs are @@ -573,6 +574,10 @@ impl<'b, 'tcx> CrateContext<'b, 'tcx> { &self.shared.link_meta } + pub fn fn_pointer_shims(&self) -> &RefCell, ValueRef>> { + &self.local.fn_pointer_shims + } + pub fn drop_glues<'a>(&'a self) -> &'a RefCell, ValueRef>> { &self.local.drop_glues }