Skip to content

Commit faf5eac

Browse files
committed
Move metadata encoding earlier.
This commit separates metadata encoding (`tcx.encode_metadata`) from the creation of the metadata module (which is now handled by `write_compressed_metadata`, formerly `write_metadata`). The metadata encoding now occurs slightly earlier in the pipeline, at the very start of code generation within `start_codegen`. Metadata *writing* still occurs near the end of compilation; that will be moved forward in subsequent commits.
1 parent 03122e1 commit faf5eac

File tree

7 files changed

+85
-76
lines changed

7 files changed

+85
-76
lines changed

src/librustc_codegen_llvm/base.rs

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use rustc::mir::mono::{Linkage, Visibility, Stats};
2828
use rustc::middle::cstore::{EncodedMetadata};
2929
use rustc::ty::TyCtxt;
3030
use rustc::middle::exported_symbols;
31-
use rustc::session::config::{self, DebugInfo};
31+
use rustc::session::config::DebugInfo;
3232
use rustc_codegen_ssa::mono_item::MonoItemExt;
3333
use rustc_data_structures::small_c_str::SmallCStr;
3434

@@ -42,47 +42,16 @@ use rustc::hir::CodegenFnAttrs;
4242

4343
use crate::value::Value;
4444

45-
46-
pub fn write_metadata<'a, 'gcx>(
45+
pub fn write_compressed_metadata<'a, 'gcx>(
4746
tcx: TyCtxt<'a, 'gcx, 'gcx>,
47+
metadata: &EncodedMetadata,
4848
llvm_module: &mut ModuleLlvm
49-
) -> EncodedMetadata {
49+
) {
5050
use std::io::Write;
5151
use flate2::Compression;
5252
use flate2::write::DeflateEncoder;
5353

5454
let (metadata_llcx, metadata_llmod) = (&*llvm_module.llcx, llvm_module.llmod());
55-
56-
#[derive(PartialEq, Eq, PartialOrd, Ord)]
57-
enum MetadataKind {
58-
None,
59-
Uncompressed,
60-
Compressed
61-
}
62-
63-
let kind = tcx.sess.crate_types.borrow().iter().map(|ty| {
64-
match *ty {
65-
config::CrateType::Executable |
66-
config::CrateType::Staticlib |
67-
config::CrateType::Cdylib => MetadataKind::None,
68-
69-
config::CrateType::Rlib => MetadataKind::Uncompressed,
70-
71-
config::CrateType::Dylib |
72-
config::CrateType::ProcMacro => MetadataKind::Compressed,
73-
}
74-
}).max().unwrap_or(MetadataKind::None);
75-
76-
if kind == MetadataKind::None {
77-
return EncodedMetadata::new();
78-
}
79-
80-
let metadata = tcx.encode_metadata();
81-
if kind == MetadataKind::Uncompressed {
82-
return metadata;
83-
}
84-
85-
assert!(kind == MetadataKind::Compressed);
8655
let mut compressed = tcx.metadata_encoding_version();
8756
DeflateEncoder::new(&mut compressed, Compression::fast())
8857
.write_all(&metadata.raw_data).unwrap();
@@ -107,7 +76,6 @@ pub fn write_metadata<'a, 'gcx>(
10776
let directive = CString::new(directive).unwrap();
10877
llvm::LLVMSetModuleInlineAsm(metadata_llmod, directive.as_ptr())
10978
}
110-
return metadata;
11179
}
11280

11381
pub struct ValueIter<'ll> {

src/librustc_codegen_llvm/lib.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,13 @@ impl ExtraBackendMethods for LlvmCodegenBackend {
110110
ModuleLlvm::new_metadata(tcx, mod_name)
111111
}
112112

113-
fn write_metadata<'b, 'gcx>(
113+
fn write_compressed_metadata<'b, 'gcx>(
114114
&self,
115115
tcx: TyCtxt<'b, 'gcx, 'gcx>,
116-
metadata: &mut ModuleLlvm
117-
) -> EncodedMetadata {
118-
base::write_metadata(tcx, metadata)
116+
metadata: &EncodedMetadata,
117+
llvm_module: &mut ModuleLlvm
118+
) {
119+
base::write_compressed_metadata(tcx, metadata, llvm_module)
119120
}
120121
fn codegen_allocator<'b, 'gcx>(
121122
&self,
@@ -289,9 +290,12 @@ impl CodegenBackend for LlvmCodegenBackend {
289290
fn codegen_crate<'b, 'tcx>(
290291
&self,
291292
tcx: TyCtxt<'b, 'tcx, 'tcx>,
293+
metadata: EncodedMetadata,
294+
need_metadata_module: bool,
292295
rx: mpsc::Receiver<Box<dyn Any + Send>>
293296
) -> Box<dyn Any> {
294-
box rustc_codegen_ssa::base::codegen_crate(LlvmCodegenBackend(()), tcx, rx)
297+
box rustc_codegen_ssa::base::codegen_crate(
298+
LlvmCodegenBackend(()), tcx, metadata, need_metadata_module, rx)
295299
}
296300

297301
fn join_codegen_and_link(

src/librustc_codegen_ssa/base.rs

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::{ModuleCodegen, ModuleKind, CachedModuleCodegen};
1717

1818
use rustc::dep_graph::cgu_reuse_tracker::CguReuse;
1919
use rustc::hir::def_id::{DefId, LOCAL_CRATE};
20+
use rustc::middle::cstore::EncodedMetadata;
2021
use rustc::middle::lang_items::StartFnLangItem;
2122
use rustc::middle::weak_lang_items;
2223
use rustc::mir::mono::{Stats, CodegenUnitNameBuilder};
@@ -25,7 +26,7 @@ use rustc::ty::layout::{self, Align, TyLayout, LayoutOf, VariantIdx, HasTyCtxt};
2526
use rustc::ty::query::Providers;
2627
use rustc::middle::cstore::{self, LinkagePreference};
2728
use rustc::util::common::{time, print_time_passes_entry};
28-
use rustc::session::config::{self, CrateType, EntryFnType, Lto};
29+
use rustc::session::config::{self, EntryFnType, Lto};
2930
use rustc::session::Session;
3031
use rustc_mir::monomorphize::item::DefPathBasedNames;
3132
use rustc_mir::monomorphize::Instance;
@@ -530,26 +531,13 @@ pub const CODEGEN_WORKER_ID: usize = ::std::usize::MAX;
530531
pub fn codegen_crate<B: ExtraBackendMethods>(
531532
backend: B,
532533
tcx: TyCtxt<'a, 'tcx, 'tcx>,
534+
metadata: EncodedMetadata,
535+
need_metadata_module: bool,
533536
rx: mpsc::Receiver<Box<dyn Any + Send>>
534537
) -> OngoingCodegen<B> {
535538

536539
check_for_rustc_errors_attr(tcx);
537540

538-
let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx);
539-
540-
// Codegen the metadata.
541-
tcx.sess.profiler(|p| p.start_activity("codegen crate metadata"));
542-
543-
let metadata_cgu_name = cgu_name_builder.build_cgu_name(LOCAL_CRATE,
544-
&["crate"],
545-
Some("metadata")).as_str()
546-
.to_string();
547-
let mut metadata_llvm_module = backend.new_metadata(tcx, &metadata_cgu_name);
548-
let metadata = time(tcx.sess, "write metadata", || {
549-
backend.write_metadata(tcx, &mut metadata_llvm_module)
550-
});
551-
tcx.sess.profiler(|p| p.end_activity("codegen crate metadata"));
552-
553541
// Skip crate items and just output metadata in -Z no-codegen mode.
554542
if tcx.sess.opts.debugging_opts.no_codegen ||
555543
!tcx.sess.opts.output_types.should_codegen() {
@@ -569,6 +557,8 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
569557
return ongoing_codegen;
570558
}
571559

560+
let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx);
561+
572562
// Run the monomorphization collector and partition the collected items into
573563
// codegen units.
574564
let codegen_units = tcx.collect_and_partition_mono_items(LOCAL_CRATE).1;
@@ -632,17 +622,21 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
632622
ongoing_codegen.submit_pre_codegened_module_to_llvm(tcx, allocator_module);
633623
}
634624

635-
let needs_metadata_module = tcx.sess.crate_types.borrow().iter().any(|ct| {
636-
match *ct {
637-
CrateType::Dylib |
638-
CrateType::ProcMacro => true,
639-
CrateType::Executable |
640-
CrateType::Rlib |
641-
CrateType::Staticlib |
642-
CrateType::Cdylib => false,
643-
}
644-
});
645-
if needs_metadata_module {
625+
if need_metadata_module {
626+
// Codegen the encoded metadata.
627+
tcx.sess.profiler(|p| p.start_activity("codegen crate metadata"));
628+
629+
let metadata_cgu_name = cgu_name_builder.build_cgu_name(LOCAL_CRATE,
630+
&["crate"],
631+
Some("metadata")).as_str()
632+
.to_string();
633+
let mut metadata_llvm_module = backend.new_metadata(tcx, &metadata_cgu_name);
634+
time(tcx.sess, "write compressed metadata", || {
635+
backend.write_compressed_metadata(tcx, &ongoing_codegen.metadata,
636+
&mut metadata_llvm_module);
637+
});
638+
tcx.sess.profiler(|p| p.end_activity("codegen crate metadata"));
639+
646640
let metadata_module = ModuleCodegen {
647641
name: metadata_cgu_name,
648642
module_llvm: metadata_llvm_module,

src/librustc_codegen_ssa/traits/backend.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ impl<'tcx, T> Backend<'tcx> for T where
3333

3434
pub trait ExtraBackendMethods: CodegenBackend + WriteBackendMethods + Sized + Send {
3535
fn new_metadata(&self, sess: TyCtxt<'_, '_, '_>, mod_name: &str) -> Self::Module;
36-
fn write_metadata<'b, 'gcx>(
36+
fn write_compressed_metadata<'b, 'gcx>(
3737
&self,
3838
tcx: TyCtxt<'b, 'gcx, 'gcx>,
39-
metadata: &mut Self::Module,
40-
) -> EncodedMetadata;
39+
metadata: &EncodedMetadata,
40+
llvm_module: &mut Self::Module,
41+
);
4142
fn codegen_allocator<'b, 'gcx>(
4243
&self,
4344
tcx: TyCtxt<'b, 'gcx, 'gcx>,

src/librustc_codegen_utils/codegen_backend.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc::util::common::ErrorReported;
1818
use rustc::session::config::{OutputFilenames, PrintRequest};
1919
use rustc::ty::TyCtxt;
2020
use rustc::ty::query::Providers;
21-
use rustc::middle::cstore::MetadataLoader;
21+
use rustc::middle::cstore::{EncodedMetadata, MetadataLoader};
2222
use rustc::dep_graph::DepGraph;
2323

2424
pub use rustc_data_structures::sync::MetadataRef;
@@ -37,6 +37,8 @@ pub trait CodegenBackend {
3737
fn codegen_crate<'a, 'tcx>(
3838
&self,
3939
tcx: TyCtxt<'a, 'tcx, 'tcx>,
40+
metadata: EncodedMetadata,
41+
need_metadata_module: bool,
4042
rx: mpsc::Receiver<Box<dyn Any + Send>>
4143
) -> Box<dyn Any>;
4244

src/librustc_interface/passes.rs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc::traits;
1616
use rustc::util::common::{time, ErrorReported};
1717
use rustc::util::profiling::ProfileCategory;
1818
use rustc::session::{CompileResult, CrateDisambiguator, Session};
19-
use rustc::session::config::{self, Input, OutputFilenames, OutputType};
19+
use rustc::session::config::{self, CrateType, Input, OutputFilenames, OutputType};
2020
use rustc::session::search_paths::PathKind;
2121
use rustc_allocator as allocator;
2222
use rustc_borrowck as borrowck;
@@ -999,6 +999,38 @@ fn analysis<'tcx>(
999999
Ok(())
10001000
}
10011001

1002+
fn encode_metadata<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) -> (middle::cstore::EncodedMetadata, bool) {
1003+
#[derive(PartialEq, Eq, PartialOrd, Ord)]
1004+
enum MetadataKind {
1005+
None,
1006+
Uncompressed,
1007+
Compressed
1008+
}
1009+
1010+
let metadata_kind = tcx.sess.crate_types.borrow().iter().map(|ty| {
1011+
match *ty {
1012+
CrateType::Executable |
1013+
CrateType::Staticlib |
1014+
CrateType::Cdylib => MetadataKind::None,
1015+
1016+
CrateType::Rlib => MetadataKind::Uncompressed,
1017+
1018+
CrateType::Dylib |
1019+
CrateType::ProcMacro => MetadataKind::Compressed,
1020+
}
1021+
}).max().unwrap_or(MetadataKind::None);
1022+
1023+
let need_metadata_module = metadata_kind == MetadataKind::Compressed;
1024+
1025+
let metadata = match metadata_kind {
1026+
MetadataKind::None => middle::cstore::EncodedMetadata::new(),
1027+
MetadataKind::Uncompressed |
1028+
MetadataKind::Compressed => tcx.encode_metadata(),
1029+
};
1030+
1031+
(metadata, need_metadata_module)
1032+
}
1033+
10021034
/// Runs the codegen backend, after which the AST and analysis can
10031035
/// be discarded.
10041036
pub fn start_codegen<'tcx>(
@@ -1013,11 +1045,17 @@ pub fn start_codegen<'tcx>(
10131045
}
10141046

10151047
time(tcx.sess, "resolving dependency formats", || {
1016-
::rustc::middle::dependency_format::calculate(tcx)
1048+
middle::dependency_format::calculate(tcx)
1049+
});
1050+
1051+
let (metadata, need_metadata_module) = time(tcx.sess, "metadata encoding", || {
1052+
encode_metadata(tcx)
10171053
});
10181054

10191055
tcx.sess.profiler(|p| p.start_activity("codegen crate"));
1020-
let codegen = time(tcx.sess, "codegen", move || codegen_backend.codegen_crate(tcx, rx));
1056+
let codegen = time(tcx.sess, "codegen", move || {
1057+
codegen_backend.codegen_crate(tcx, metadata, need_metadata_module, rx)
1058+
});
10211059
tcx.sess.profiler(|p| p.end_activity("codegen crate"));
10221060

10231061
if log_enabled!(::log::Level::Info) {

src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc::session::Session;
1515
use rustc::session::config::OutputFilenames;
1616
use rustc::ty::TyCtxt;
1717
use rustc::ty::query::Providers;
18-
use rustc::middle::cstore::MetadataLoader;
18+
use rustc::middle::cstore::{EncodedMetadata, MetadataLoader};
1919
use rustc::dep_graph::DepGraph;
2020
use rustc::util::common::ErrorReported;
2121
use rustc_codegen_utils::codegen_backend::CodegenBackend;
@@ -61,6 +61,8 @@ impl CodegenBackend for TheBackend {
6161
fn codegen_crate<'a, 'tcx>(
6262
&self,
6363
tcx: TyCtxt<'a, 'tcx, 'tcx>,
64+
_metadata: EncodedMetadata,
65+
_need_metadata_module: bool,
6466
_rx: mpsc::Receiver<Box<Any + Send>>
6567
) -> Box<Any> {
6668
use rustc::hir::def_id::LOCAL_CRATE;

0 commit comments

Comments
 (0)