Skip to content

Commit e8d9b86

Browse files
committed
Attempt to lazily instantiate inline functions
1 parent 2dbf600 commit e8d9b86

File tree

2 files changed

+11
-14
lines changed

2 files changed

+11
-14
lines changed

src/librustc_trans/partitioning.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ pub fn partition<'a, 'tcx, I>(scx: &SharedCrateContext<'a, 'tcx>,
288288
// translation items have to go into each codegen unit. These additional
289289
// translation items can be drop-glue, functions from external crates, and
290290
// local functions the definition of which is marked with #[inline].
291-
let post_inlining = place_inlined_translation_items(initial_partitioning,
291+
let post_inlining = place_inlined_translation_items(scx,
292+
initial_partitioning,
292293
inlining_map);
293294

294295
debug_dump(tcx, "POST INLINING:", post_inlining.0.iter());
@@ -320,7 +321,7 @@ fn place_root_translation_items<'a, 'tcx, I>(scx: &SharedCrateContext<'a, 'tcx>,
320321
let mut codegen_units = FnvHashMap();
321322

322323
for trans_item in trans_items {
323-
let is_root = !trans_item.is_instantiated_only_on_demand();
324+
let is_root = !trans_item.is_instantiated_only_on_demand(tcx);
324325

325326
if is_root {
326327
let characteristic_def_id = characteristic_def_id_of_trans_item(scx, trans_item);
@@ -416,9 +417,11 @@ fn merge_codegen_units<'tcx>(initial_partitioning: &mut PreInliningPartitioning<
416417
}
417418
}
418419

419-
fn place_inlined_translation_items<'tcx>(initial_partitioning: PreInliningPartitioning<'tcx>,
420-
inlining_map: &InliningMap<'tcx>)
421-
-> PostInliningPartitioning<'tcx> {
420+
fn place_inlined_translation_items<'a, 'tcx>(scx: &SharedCrateContext<'a, 'tcx>,
421+
initial_partitioning: PreInliningPartitioning<'tcx>,
422+
inlining_map: &InliningMap<'tcx>)
423+
-> PostInliningPartitioning<'tcx> {
424+
let tcx = scx.tcx();
422425
let mut new_partitioning = Vec::new();
423426

424427
for codegen_unit in &initial_partitioning.codegen_units[..] {
@@ -454,7 +457,7 @@ fn place_inlined_translation_items<'tcx>(initial_partitioning: PreInliningPartit
454457
// reliably in that case.
455458
new_codegen_unit.items.insert(trans_item, llvm::InternalLinkage);
456459
} else {
457-
assert!(trans_item.is_instantiated_only_on_demand());
460+
assert!(trans_item.is_instantiated_only_on_demand(tcx));
458461
// We can't be sure if this will also be instantiated
459462
// somewhere else, so we add an instance here with
460463
// InternalLinkage so we don't get any conflicts.

src/librustc_trans/trans_item.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,8 @@ impl<'a, 'tcx> TransItem<'tcx> {
262262
}
263263
}
264264

265-
pub fn is_instantiated_only_on_demand(&self) -> bool {
266-
match *self {
267-
TransItem::Fn(ref instance) => {
268-
!instance.def.is_local() || instance.substs.types().next().is_some()
269-
}
270-
TransItem::DropGlue(..) => true,
271-
TransItem::Static(..) => false,
272-
}
265+
pub fn is_instantiated_only_on_demand(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> bool {
266+
self.requests_inline(tcx) || self.is_from_extern_crate()
273267
}
274268

275269
pub fn is_generic_fn(&self) -> bool {

0 commit comments

Comments
 (0)