about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2016-11-16 12:27:43 +0200
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2016-11-18 12:25:00 +0200
commit4fc02f689380b9f330d4aa92bcb833c60da92aad (patch)
tree1e7a0a1e524bc5d216c307f823391fc2f7960096 /src
parent509d14fc70d673bd01c7721481f63cb1bc503103 (diff)
downloadrust-4fc02f689380b9f330d4aa92bcb833c60da92aad.tar.gz
rust-4fc02f689380b9f330d4aa92bcb833c60da92aad.zip
instantiate closures on demand
this should fix compilation with `-C codegen-units=4` - tested locally
with `RUSTFLAGS='-C codegen-units=4' ../x.py test`
Diffstat (limited to 'src')
-rw-r--r--src/librustc_trans/common.rs5
-rw-r--r--src/librustc_trans/trans_item.rs2
2 files changed, 7 insertions, 0 deletions
diff --git a/src/librustc_trans/common.rs b/src/librustc_trans/common.rs
index a0fac9cc659..df70a6e8116 100644
--- a/src/librustc_trans/common.rs
+++ b/src/librustc_trans/common.rs
@@ -18,6 +18,7 @@ use llvm::{ValueRef, BasicBlockRef, BuilderRef, ContextRef, TypeKind};
 use llvm::{True, False, Bool, OperandBundleDef};
 use rustc::hir::def::Def;
 use rustc::hir::def_id::DefId;
+use rustc::hir::map::DefPathData;
 use rustc::infer::TransNormalize;
 use rustc::mir::Mir;
 use rustc::util::common::MemoizationMap;
@@ -1100,3 +1101,7 @@ pub fn ty_fn_ty<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
         _ => bug!("unexpected type {:?} to ty_fn_sig", ty)
     }
 }
+
+pub fn is_closure(tcx: TyCtxt, def_id: DefId) -> bool {
+    tcx.def_key(def_id).disambiguated_data.data == DefPathData::ClosureExpr
+}
diff --git a/src/librustc_trans/trans_item.rs b/src/librustc_trans/trans_item.rs
index 94a68de7f86..7fa59127704 100644
--- a/src/librustc_trans/trans_item.rs
+++ b/src/librustc_trans/trans_item.rs
@@ -18,6 +18,7 @@ use attributes;
 use base;
 use consts;
 use context::{CrateContext, SharedCrateContext};
+use common;
 use declare;
 use glue::DropGlueKind;
 use llvm;
@@ -245,6 +246,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
             TransItem::Fn(ref instance) => {
                 !instance.def.is_local() ||
                 instance.substs.types().next().is_some() ||
+                common::is_closure(tcx, instance.def) ||
                 attr::requests_inline(&tcx.get_attrs(instance.def)[..])
             }
             TransItem::DropGlue(..) => true,