]> git.lizzy.rs Git - rust.git/commitdiff
Use multiple codegen units
authorbjorn3 <bjorn3@users.noreply.github.com>
Sat, 7 Mar 2020 11:45:55 +0000 (12:45 +0100)
committerbjorn3 <bjorn3@users.noreply.github.com>
Sat, 7 Mar 2020 11:45:55 +0000 (12:45 +0100)
src/driver.rs

index b6cc3a98257f04347c6af8f8ac8d9c001aade3f9..29e498db750061fa89c6e5636b8653b524ec207d 100644 (file)
@@ -72,7 +72,9 @@ fn run_jit(tcx: TyCtxt<'_>) -> ! {
         .iter()
         .map(|cgu| cgu.items_in_deterministic_order(tcx).into_iter())
         .flatten()
-        .collect::<FxHashMap<_, (_, _)>>();
+        .collect::<FxHashMap<_, (_, _)>>()
+        .into_iter()
+        .collect::<Vec<(_, (_, _))>>();
 
     time(tcx.sess, "codegen mono items", || {
         codegen_mono_items(tcx, &mut jit_module, None, mono_items);
@@ -208,36 +210,35 @@ fn emit_module<B: Backend>(
         };
 
     let (_, cgus) = tcx.collect_and_partition_mono_items(LOCAL_CRATE);
-    let mono_items = cgus
-        .iter()
-        .map(|cgu| cgu.items_in_deterministic_order(tcx).into_iter())
-        .flatten()
-        .collect::<FxHashMap<_, (_, _)>>();
 
-    let mut module = new_module("some_file".to_string());
+    let modules = time(tcx.sess, "codegen mono items", move || {
+        cgus.iter().map(|cgu| {
+            let mono_items = cgu.items_in_deterministic_order(tcx);
 
-    let mut debug = if tcx.sess.opts.debuginfo != DebugInfo::None {
-        let debug = DebugContext::new(
-            tcx,
-            module.target_config().pointer_type().bytes() as u8,
-        );
-        Some(debug)
-    } else {
-        None
-    };
+            let mut module = new_module(cgu.name().as_str().to_string());
 
-    time(tcx.sess, "codegen mono items", || {
-        codegen_mono_items(tcx, &mut module, debug.as_mut(), mono_items);
-    });
-    crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module);
+            let mut debug = if tcx.sess.opts.debuginfo != DebugInfo::None {
+                let debug = DebugContext::new(
+                    tcx,
+                    module.target_config().pointer_type().bytes() as u8,
+                );
+                Some(debug)
+            } else {
+                None
+            };
 
-    let modules = vec![emit_module(
-        tcx,
-        "some_file".to_string(),
-        ModuleKind::Regular,
-        module,
-        debug,
-    )];
+            codegen_mono_items(tcx, &mut module, debug.as_mut(), mono_items);
+            crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module);
+
+            emit_module(
+                tcx,
+                cgu.name().as_str().to_string(),
+                ModuleKind::Regular,
+                module,
+                debug,
+            )
+        }).collect::<Vec<_>>()
+    });
 
     tcx.sess.abort_if_errors();
 
@@ -310,12 +311,12 @@ fn codegen_mono_items<'tcx>(
     tcx: TyCtxt<'tcx>,
     module: &mut Module<impl Backend + 'static>,
     debug_context: Option<&mut DebugContext<'tcx>>,
-    mono_items: FxHashMap<MonoItem<'tcx>, (RLinkage, Visibility)>,
+    mono_items: Vec<(MonoItem<'tcx>, (RLinkage, Visibility))>,
 ) {
     let mut cx = CodegenCx::new(tcx, module, debug_context);
 
     tcx.sess.time("predefine functions", || {
-        for (&mono_item, &(linkage, visibility)) in &mono_items {
+        for &(mono_item, (linkage, visibility)) in &mono_items {
             match mono_item {
                 MonoItem::Fn(instance) => {
                     let (name, sig) =