Fix cross-crate inlining of intrinsics
This commit is contained in:
parent
cd15eac9cf
commit
ac31fdd9c4
2 changed files with 29 additions and 3 deletions
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue