Skip to content

Commit ac31fdd

Browse files
committed
Fix cross-crate inlining of intrinsics
1 parent cd15eac commit ac31fdd

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/rustc/middle/trans/base.rs

+29-1
Original file line numberDiff line numberDiff line change
@@ -2504,11 +2504,39 @@ fn lval_static_fn_inner(bcx: block, fn_id: ast::def_id, id: ast::node_id,
25042504

25052505
// Check whether this fn has an inlined copy and, if so, redirect fn_id to
25062506
// the local id of the inlined copy.
2507+
let original_crate = fn_id.crate;
25072508
let fn_id = if fn_id.crate != ast::local_crate {
25082509
maybe_instantiate_inline(ccx, fn_id)
25092510
} else { fn_id };
25102511

2511-
if fn_id.crate == ast::local_crate && tys.len() > 0u {
2512+
let must_monomorphise = {
2513+
let local_with_type_params =
2514+
fn_id.crate == ast::local_crate && tys.len() > 0u;
2515+
2516+
// Rust intrinsic functions should always be monomorphised
2517+
let inlined_rust_intrinsic = {
2518+
if fn_id.crate == ast::local_crate
2519+
&& original_crate != ast::local_crate {
2520+
2521+
let map_node = session::expect(
2522+
ccx.sess,
2523+
ccx.tcx.items.find(fn_id.node),
2524+
|| fmt!("inlined item should be in ast map"));
2525+
2526+
match map_node {
2527+
ast_map::node_foreign_item(
2528+
_, ast::foreign_abi_rust_intrinsic, _) => true,
2529+
_ => false
2530+
}
2531+
} else {
2532+
false
2533+
}
2534+
};
2535+
2536+
local_with_type_params || inlined_rust_intrinsic
2537+
};
2538+
2539+
if must_monomorphise {
25122540
let mut {val, must_cast} =
25132541
monomorphic_fn(ccx, fn_id, tys, vtables, Some(id));
25142542
if must_cast {

src/test/run-pass/intrinsic-atomics-cc.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// xfail-fast - check-fast doesn't understand aux-build
22
// aux-build:cci_intrinsic.rs
33

4-
// xfail-test
5-
64
use cci_intrinsic;
75
import cci_intrinsic::atomic_xchg;
86

0 commit comments

Comments
 (0)