Skip to content

Commit 0b249d3

Browse files
authored
Rollup merge of #141769 - bjorn3:codegen_metadata_module_rework, r=workingjubilee,saethlin
Move metadata object generation for dylibs to the linker code This deduplicates some code between codegen backends and may in the future allow adding extra metadata that is only known at link time. Prerequisite of #96708.
2 parents b79d3b1 + 0bd7aa1 commit 0b249d3

File tree

19 files changed

+161
-290
lines changed

19 files changed

+161
-290
lines changed

compiler/rustc_codegen_cranelift/src/driver/aot.rs

Lines changed: 1 addition & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ use std::thread::JoinHandle;
1111
use cranelift_object::{ObjectBuilder, ObjectModule};
1212
use rustc_codegen_ssa::assert_module_sources::CguReuse;
1313
use rustc_codegen_ssa::back::link::ensure_removed;
14-
use rustc_codegen_ssa::back::metadata::create_compressed_metadata_file;
1514
use rustc_codegen_ssa::base::determine_cgu_reuse;
1615
use rustc_codegen_ssa::{
1716
CodegenResults, CompiledModule, CrateInfo, ModuleKind, errors as ssa_errors,
1817
};
1918
use rustc_data_structures::profiling::SelfProfilerRef;
2019
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
2120
use rustc_data_structures::sync::{IntoDynSyncSend, par_map};
22-
use rustc_metadata::EncodedMetadata;
2321
use rustc_metadata::fs::copy_to_stdout;
2422
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
2523
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
@@ -61,8 +59,6 @@ impl<HCX> HashStable<HCX> for OngoingModuleCodegen {
6159
pub(crate) struct OngoingCodegen {
6260
modules: Vec<OngoingModuleCodegen>,
6361
allocator_module: Option<CompiledModule>,
64-
metadata_module: Option<CompiledModule>,
65-
metadata: EncodedMetadata,
6662
crate_info: CrateInfo,
6763
concurrency_limiter: ConcurrencyLimiter,
6864
}
@@ -134,8 +130,6 @@ impl OngoingCodegen {
134130
let codegen_results = CodegenResults {
135131
modules,
136132
allocator_module: self.allocator_module,
137-
metadata_module: self.metadata_module,
138-
metadata: self.metadata,
139133
crate_info: self.crate_info,
140134
};
141135

@@ -646,42 +640,6 @@ fn module_codegen(
646640
}))
647641
}
648642

649-
fn emit_metadata_module(tcx: TyCtxt<'_>, metadata: &EncodedMetadata) -> CompiledModule {
650-
use rustc_middle::mir::mono::CodegenUnitNameBuilder;
651-
652-
let _timer = tcx.sess.timer("write compressed metadata");
653-
654-
let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx);
655-
let metadata_cgu_name = cgu_name_builder
656-
.build_cgu_name(LOCAL_CRATE, ["crate"], Some("metadata"))
657-
.as_str()
658-
.to_string();
659-
660-
let tmp_file = tcx.output_filenames(()).temp_path_for_cgu(
661-
OutputType::Metadata,
662-
&metadata_cgu_name,
663-
tcx.sess.invocation_temp.as_deref(),
664-
);
665-
666-
let symbol_name = rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx);
667-
let obj = create_compressed_metadata_file(tcx.sess, metadata, &symbol_name);
668-
669-
if let Err(err) = std::fs::write(&tmp_file, obj) {
670-
tcx.dcx().fatal(format!("error writing metadata object file: {}", err));
671-
}
672-
673-
CompiledModule {
674-
name: metadata_cgu_name,
675-
kind: ModuleKind::Metadata,
676-
object: Some(tmp_file),
677-
dwarf_object: None,
678-
bytecode: None,
679-
assembly: None,
680-
llvm_ir: None,
681-
links_from_incr_cache: Vec::new(),
682-
}
683-
}
684-
685643
fn emit_allocator_module(tcx: TyCtxt<'_>) -> Option<CompiledModule> {
686644
let mut allocator_module = make_module(tcx.sess, "allocator_shim".to_string());
687645
let created_alloc_shim = crate::allocator::codegen(tcx, &mut allocator_module);
@@ -706,11 +664,7 @@ fn emit_allocator_module(tcx: TyCtxt<'_>) -> Option<CompiledModule> {
706664
}
707665
}
708666

709-
pub(crate) fn run_aot(
710-
tcx: TyCtxt<'_>,
711-
metadata: EncodedMetadata,
712-
need_metadata_module: bool,
713-
) -> Box<OngoingCodegen> {
667+
pub(crate) fn run_aot(tcx: TyCtxt<'_>) -> Box<OngoingCodegen> {
714668
// FIXME handle `-Ctarget-cpu=native`
715669
let target_cpu = match tcx.sess.opts.cg.target_cpu {
716670
Some(ref name) => name,
@@ -726,8 +680,6 @@ pub(crate) fn run_aot(
726680
return Box::new(OngoingCodegen {
727681
modules: vec![],
728682
allocator_module: None,
729-
metadata_module: None,
730-
metadata,
731683
crate_info: CrateInfo::new(tcx, target_cpu),
732684
concurrency_limiter: ConcurrencyLimiter::new(0),
733685
});
@@ -787,14 +739,9 @@ pub(crate) fn run_aot(
787739

788740
let allocator_module = emit_allocator_module(tcx);
789741

790-
let metadata_module =
791-
if need_metadata_module { Some(emit_metadata_module(tcx, &metadata)) } else { None };
792-
793742
Box::new(OngoingCodegen {
794743
modules,
795744
allocator_module,
796-
metadata_module,
797-
metadata,
798745
crate_info: CrateInfo::new(tcx, target_cpu),
799746
concurrency_limiter: concurrency_limiter.0,
800747
})

compiler/rustc_codegen_cranelift/src/lib.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ use cranelift_codegen::isa::TargetIsa;
4646
use cranelift_codegen::settings::{self, Configurable};
4747
use rustc_codegen_ssa::traits::CodegenBackend;
4848
use rustc_codegen_ssa::{CodegenResults, TargetConfig};
49-
use rustc_metadata::EncodedMetadata;
5049
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
5150
use rustc_session::Session;
5251
use rustc_session::config::OutputFilenames;
@@ -238,12 +237,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
238237
println!("Cranelift version: {}", cranelift_codegen::VERSION);
239238
}
240239

241-
fn codegen_crate(
242-
&self,
243-
tcx: TyCtxt<'_>,
244-
metadata: EncodedMetadata,
245-
need_metadata_module: bool,
246-
) -> Box<dyn Any> {
240+
fn codegen_crate(&self, tcx: TyCtxt<'_>) -> Box<dyn Any> {
247241
info!("codegen crate {}", tcx.crate_name(LOCAL_CRATE));
248242
let config = self.config.clone().unwrap_or_else(|| {
249243
BackendConfig::from_opts(&tcx.sess.opts.cg.llvm_args)
@@ -256,7 +250,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
256250
#[cfg(not(feature = "jit"))]
257251
tcx.dcx().fatal("jit support was disabled when compiling rustc_codegen_cranelift");
258252
} else {
259-
driver::aot::run_aot(tcx, metadata, need_metadata_module)
253+
driver::aot::run_aot(tcx)
260254
}
261255
}
262256

compiler/rustc_codegen_gcc/src/lib.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ extern crate rustc_index;
4848
#[cfg(feature = "master")]
4949
extern crate rustc_interface;
5050
extern crate rustc_macros;
51-
extern crate rustc_metadata;
5251
extern crate rustc_middle;
5352
extern crate rustc_session;
5453
extern crate rustc_span;
@@ -106,7 +105,6 @@ use rustc_codegen_ssa::{CodegenResults, CompiledModule, ModuleCodegen, TargetCon
106105
use rustc_data_structures::fx::FxIndexMap;
107106
use rustc_data_structures::sync::IntoDynSyncSend;
108107
use rustc_errors::DiagCtxtHandle;
109-
use rustc_metadata::EncodedMetadata;
110108
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
111109
use rustc_middle::ty::TyCtxt;
112110
use rustc_middle::util::Providers;
@@ -230,20 +228,9 @@ impl CodegenBackend for GccCodegenBackend {
230228
providers.global_backend_features = |tcx, ()| gcc_util::global_gcc_features(tcx.sess, true)
231229
}
232230

233-
fn codegen_crate(
234-
&self,
235-
tcx: TyCtxt<'_>,
236-
metadata: EncodedMetadata,
237-
need_metadata_module: bool,
238-
) -> Box<dyn Any> {
231+
fn codegen_crate(&self, tcx: TyCtxt<'_>) -> Box<dyn Any> {
239232
let target_cpu = target_cpu(tcx.sess);
240-
let res = codegen_crate(
241-
self.clone(),
242-
tcx,
243-
target_cpu.to_string(),
244-
metadata,
245-
need_metadata_module,
246-
);
233+
let res = codegen_crate(self.clone(), tcx, target_cpu.to_string());
247234

248235
Box::new(res)
249236
}

compiler/rustc_codegen_llvm/src/lib.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -340,18 +340,11 @@ impl CodegenBackend for LlvmCodegenBackend {
340340
target_config(sess)
341341
}
342342

343-
fn codegen_crate<'tcx>(
344-
&self,
345-
tcx: TyCtxt<'tcx>,
346-
metadata: EncodedMetadata,
347-
need_metadata_module: bool,
348-
) -> Box<dyn Any> {
343+
fn codegen_crate<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Box<dyn Any> {
349344
Box::new(rustc_codegen_ssa::base::codegen_crate(
350345
LlvmCodegenBackend(()),
351346
tcx,
352347
crate::llvm_util::target_cpu(tcx.sess).to_string(),
353-
metadata,
354-
need_metadata_module,
355348
))
356349
}
357350

@@ -376,14 +369,20 @@ impl CodegenBackend for LlvmCodegenBackend {
376369
(codegen_results, work_products)
377370
}
378371

379-
fn link(&self, sess: &Session, codegen_results: CodegenResults, outputs: &OutputFilenames) {
372+
fn link(
373+
&self,
374+
sess: &Session,
375+
codegen_results: CodegenResults,
376+
metadata: EncodedMetadata,
377+
outputs: &OutputFilenames,
378+
) {
380379
use rustc_codegen_ssa::back::link::link_binary;
381380

382381
use crate::back::archive::LlvmArchiveBuilderBuilder;
383382

384383
// Run the linker on any artifacts that resulted from the LLVM run.
385384
// This should produce either a finished executable or library.
386-
link_binary(sess, &LlvmArchiveBuilderBuilder, codegen_results, outputs);
385+
link_binary(sess, &LlvmArchiveBuilderBuilder, codegen_results, metadata, outputs);
387386
}
388387
}
389388

compiler/rustc_codegen_ssa/messages.ftl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ codegen_ssa_linking_failed = linking with `{$linker_path}` failed: {$exit_status
198198
codegen_ssa_malformed_cgu_name =
199199
found malformed codegen unit name `{$user_path}`. codegen units names must always start with the name of the crate (`{$crate_name}` in this case).
200200
201-
codegen_ssa_metadata_object_file_write = error writing metadata object file: {$error}
202-
203201
codegen_ssa_missing_cpp_build_tool_component = or a necessary component may be missing from the "C++ build tools" workload
204202
205203
codegen_ssa_missing_features = add the missing features in a `target_feature` attribute

compiler/rustc_codegen_ssa/src/back/archive.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ use object::read::macho::FatArch;
1414
use rustc_data_structures::fx::FxIndexSet;
1515
use rustc_data_structures::memmap::Mmap;
1616
use rustc_fs_util::TempDirBuilder;
17+
use rustc_metadata::EncodedMetadata;
1718
use rustc_session::Session;
1819
use rustc_span::Symbol;
1920
use tracing::trace;
2021

21-
use super::metadata::search_for_section;
22+
use super::metadata::{create_compressed_metadata_file, search_for_section};
2223
use crate::common;
2324
// Re-exporting for rustc_codegen_llvm::back::archive
2425
pub use crate::errors::{ArchiveBuildFailure, ExtractBundledLibsError, UnknownArchiveKind};
@@ -58,6 +59,15 @@ impl From<ImportLibraryItem> for COFFShortExport {
5859
pub trait ArchiveBuilderBuilder {
5960
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder + 'a>;
6061

62+
fn create_dylib_metadata_wrapper(
63+
&self,
64+
sess: &Session,
65+
metadata: &EncodedMetadata,
66+
symbol_name: &str,
67+
) -> Vec<u8> {
68+
create_compressed_metadata_file(sess, metadata, symbol_name)
69+
}
70+
6171
/// Creates a DLL Import Library <https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-creation#creating-an-import-library>.
6272
/// and returns the path on disk to that import library.
6373
/// This functions doesn't take `self` so that it can be called from

0 commit comments

Comments
 (0)