rustc: Refactor middle::trans::inline
This commit is contained in:
parent
20c0ba1279
commit
10935de0cd
@ -508,11 +508,7 @@ pub fn get_res_dtor(ccx: &CrateContext,
|
||||
substs: &subst::Substs)
|
||||
-> ValueRef {
|
||||
let _icx = push_ctxt("trans_res_dtor");
|
||||
let did = if did.krate != ast::LOCAL_CRATE {
|
||||
inline::maybe_instantiate_inline(ccx, did)
|
||||
} else {
|
||||
did
|
||||
};
|
||||
let did = inline::maybe_instantiate_inline(ccx, did);
|
||||
|
||||
if !substs.types.is_empty() {
|
||||
assert_eq!(did.krate, ast::LOCAL_CRATE);
|
||||
|
@ -141,11 +141,7 @@ fn trans<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
||||
let expr_ty = node_id_type(bcx, ref_expr.id);
|
||||
match def {
|
||||
def::DefFn(did, _) if {
|
||||
let def_id = if did.krate != ast::LOCAL_CRATE {
|
||||
inline::maybe_instantiate_inline(bcx.ccx(), did)
|
||||
} else {
|
||||
did
|
||||
};
|
||||
let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did);
|
||||
match bcx.tcx().map.find(def_id.node) {
|
||||
Some(ast_map::NodeStructCtor(_)) => true,
|
||||
_ => false
|
||||
@ -162,11 +158,7 @@ fn trans<'a>(bcx: &'a Block<'a>, expr: &ast::Expr) -> Callee<'a> {
|
||||
_ => false
|
||||
} => {
|
||||
let substs = node_id_substs(bcx, ExprId(ref_expr.id));
|
||||
let def_id = if did.krate != ast::LOCAL_CRATE {
|
||||
inline::maybe_instantiate_inline(bcx.ccx(), did)
|
||||
} else {
|
||||
did
|
||||
};
|
||||
let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did);
|
||||
Callee { bcx: bcx, data: Intrinsic(def_id.node, substs) }
|
||||
}
|
||||
def::DefFn(did, _) |
|
||||
@ -524,13 +516,7 @@ pub fn trans_fn_ref_with_vtables(
|
||||
|
||||
// Check whether this fn has an inlined copy and, if so, redirect
|
||||
// def_id to the local id of the inlined copy.
|
||||
let def_id = {
|
||||
if def_id.krate != ast::LOCAL_CRATE {
|
||||
inline::maybe_instantiate_inline(ccx, def_id)
|
||||
} else {
|
||||
def_id
|
||||
}
|
||||
};
|
||||
let def_id = inline::maybe_instantiate_inline(ccx, def_id);
|
||||
|
||||
// We must monomorphise if the fn has type parameters, is a default method,
|
||||
// or is a named tuple constructor.
|
||||
|
@ -830,19 +830,6 @@ fn trans_def<'a>(bcx: &'a Block<'a>,
|
||||
// an external global, and return a pointer to that.
|
||||
let const_ty = expr_ty(bcx, ref_expr);
|
||||
|
||||
fn get_did(ccx: &CrateContext, did: ast::DefId)
|
||||
-> ast::DefId {
|
||||
if did.krate != ast::LOCAL_CRATE {
|
||||
// Case 2 or 3. Which one we're in is determined by
|
||||
// whether the DefId produced by `maybe_instantiate_inline`
|
||||
// is in the LOCAL_CRATE or not.
|
||||
inline::maybe_instantiate_inline(ccx, did)
|
||||
} else {
|
||||
// Case 1.
|
||||
did
|
||||
}
|
||||
}
|
||||
|
||||
fn get_val<'a>(bcx: &'a Block<'a>, did: ast::DefId, const_ty: ty::t)
|
||||
-> ValueRef {
|
||||
// For external constants, we don't inline.
|
||||
@ -881,8 +868,9 @@ fn trans_def<'a>(bcx: &'a Block<'a>,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let did = get_did(bcx.ccx(), did);
|
||||
// The DefId produced by `maybe_instantiate_inline`
|
||||
// may be in the LOCAL_CRATE or not.
|
||||
let did = inline::maybe_instantiate_inline(bcx.ccx(), did);
|
||||
let val = get_val(bcx, did, const_ty);
|
||||
DatumBlock::new(bcx, Datum::new(val, const_ty, LvalueExpr))
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
@ -19,18 +19,18 @@ use syntax::ast;
|
||||
use syntax::ast_util::{local_def, PostExpansionMethod};
|
||||
use syntax::ast_util;
|
||||
|
||||
pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
|
||||
-> ast::DefId {
|
||||
fn instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
|
||||
-> Option<ast::DefId> {
|
||||
let _icx = push_ctxt("maybe_instantiate_inline");
|
||||
match ccx.external().borrow().find(&fn_id) {
|
||||
Some(&Some(node_id)) => {
|
||||
// Already inline
|
||||
debug!("maybe_instantiate_inline({}): already inline as node id {}",
|
||||
ty::item_path_str(ccx.tcx(), fn_id), node_id);
|
||||
return local_def(node_id);
|
||||
return Some(local_def(node_id));
|
||||
}
|
||||
Some(&None) => {
|
||||
return fn_id; // Not inlinable
|
||||
return None; // Not inlinable
|
||||
}
|
||||
None => {
|
||||
// Not seen yet
|
||||
@ -41,10 +41,11 @@ pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
|
||||
csearch::maybe_get_item_ast(
|
||||
ccx.tcx(), fn_id,
|
||||
|a,b,c,d| astencode::decode_inlined_item(a, b, c, d));
|
||||
return match csearch_result {
|
||||
|
||||
let inline_def = match csearch_result {
|
||||
csearch::not_found => {
|
||||
ccx.external().borrow_mut().insert(fn_id, None);
|
||||
fn_id
|
||||
return None;
|
||||
}
|
||||
csearch::found(ast::IIItem(item)) => {
|
||||
ccx.external().borrow_mut().insert(fn_id, Some(item.id));
|
||||
@ -182,4 +183,19 @@ pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return Some(inline_def);
|
||||
}
|
||||
|
||||
pub fn get_local_instance(ccx: &CrateContext, fn_id: ast::DefId)
|
||||
-> Option<ast::DefId> {
|
||||
if fn_id.krate == ast::LOCAL_CRATE {
|
||||
Some(fn_id)
|
||||
} else {
|
||||
instantiate_inline(ccx, fn_id)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn maybe_instantiate_inline(ccx: &CrateContext, fn_id: ast::DefId) -> ast::DefId {
|
||||
get_local_instance(ccx, fn_id).unwrap_or(fn_id)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user