1
Fork 0

Fix cross-crate inlining of intrinsics

This commit is contained in:
Brian Anderson 2012-09-03 15:57:48 -07:00
parent cd15eac9cf
commit ac31fdd9c4
2 changed files with 29 additions and 3 deletions

View file

@ -2504,11 +2504,39 @@ fn lval_static_fn_inner(bcx: block, fn_id: ast::def_id, id: ast::node_id,
// Check whether this fn has an inlined copy and, if so, redirect fn_id to
// the local id of the inlined copy.
let original_crate = fn_id.crate;
let fn_id = if fn_id.crate != ast::local_crate {
maybe_instantiate_inline(ccx, fn_id)
} else { fn_id };
if fn_id.crate == ast::local_crate && tys.len() > 0u {
let must_monomorphise = {
let local_with_type_params =
fn_id.crate == ast::local_crate && tys.len() > 0u;
// Rust intrinsic functions should always be monomorphised
let inlined_rust_intrinsic = {
if fn_id.crate == ast::local_crate
&& original_crate != ast::local_crate {
let map_node = session::expect(
ccx.sess,
ccx.tcx.items.find(fn_id.node),
|| fmt!("inlined item should be in ast map"));
match map_node {
ast_map::node_foreign_item(
_, ast::foreign_abi_rust_intrinsic, _) => true,
_ => false
}
} else {
false
}
};
local_with_type_params || inlined_rust_intrinsic
};
if must_monomorphise {
let mut {val, must_cast} =
monomorphic_fn(ccx, fn_id, tys, vtables, Some(id));
if must_cast {

View file

@ -1,8 +1,6 @@
// xfail-fast - check-fast doesn't understand aux-build
// aux-build:cci_intrinsic.rs
// xfail-test
use cci_intrinsic;
import cci_intrinsic::atomic_xchg;