Skip to content

Commit cc9610b

Browse files
committed
Auto merge of #85810 - bjorn3:further_driver_cleanup, r=varkor
Driver improvements This PR contains a couple of cleanups for the driver and a few small improvements for the custom codegen backend interface. It also implements `--version` and `-Cpasses=list` support for custom codegen backends.
2 parents 69e2f23 + 435b540 commit cc9610b

File tree

13 files changed

+103
-135
lines changed

13 files changed

+103
-135
lines changed

compiler/rustc_codegen_cranelift/src/driver/aot.rs

-17
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,6 @@ pub(crate) fn run_aot(
177177
metadata: EncodedMetadata,
178178
need_metadata_module: bool,
179179
) -> Box<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>)> {
180-
use rustc_span::symbol::sym;
181-
182-
let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
183-
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
184-
let windows_subsystem = subsystem.map(|subsystem| {
185-
if subsystem != sym::windows && subsystem != sym::console {
186-
tcx.sess.fatal(&format!(
187-
"invalid windows subsystem `{}`, only \
188-
`windows` and `console` are allowed",
189-
subsystem
190-
));
191-
}
192-
subsystem.to_string()
193-
});
194-
195180
let mut work_products = FxHashMap::default();
196181

197182
let cgus = if tcx.sess.opts.output_types.should_codegen() {
@@ -307,12 +292,10 @@ pub(crate) fn run_aot(
307292

308293
Box::new((
309294
CodegenResults {
310-
crate_name: tcx.crate_name(LOCAL_CRATE),
311295
modules,
312296
allocator_module,
313297
metadata_module,
314298
metadata,
315-
windows_subsystem,
316299
linker_info: LinkerInfo::new(tcx, crate::target_triple(tcx.sess).to_string()),
317300
crate_info: CrateInfo::new(tcx),
318301
},

compiler/rustc_codegen_cranelift/src/lib.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ use rustc_codegen_ssa::traits::CodegenBackend;
2828
use rustc_codegen_ssa::CodegenResults;
2929
use rustc_errors::ErrorReported;
3030
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
31-
use rustc_middle::middle::cstore::{EncodedMetadata, MetadataLoader};
32-
use rustc_middle::ty::query::Providers;
31+
use rustc_middle::middle::cstore::EncodedMetadata;
3332
use rustc_session::config::OutputFilenames;
3433
use rustc_session::Session;
3534

@@ -164,17 +163,14 @@ impl CodegenBackend for CraneliftCodegenBackend {
164163
}
165164
}
166165

167-
fn metadata_loader(&self) -> Box<dyn MetadataLoader + Sync> {
168-
Box::new(rustc_codegen_ssa::back::metadata::DefaultMetadataLoader)
169-
}
170-
171-
fn provide(&self, _providers: &mut Providers) {}
172-
fn provide_extern(&self, _providers: &mut Providers) {}
173-
174166
fn target_features(&self, _sess: &Session) -> Vec<rustc_span::Symbol> {
175167
vec![]
176168
}
177169

170+
fn print_version(&self) {
171+
println!("Cranelift version: {}", cranelift_codegen::VERSION);
172+
}
173+
178174
fn codegen_crate(
179175
&self,
180176
tcx: TyCtxt<'_>,
@@ -222,7 +218,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
222218
sess,
223219
&codegen_results,
224220
outputs,
225-
&codegen_results.crate_name.as_str(),
221+
&codegen_results.crate_info.local_crate_name.as_str(),
226222
);
227223

228224
Ok(())

compiler/rustc_codegen_llvm/src/lib.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use rustc_codegen_ssa::{CodegenResults, CompiledModule};
2929
use rustc_data_structures::fx::FxHashMap;
3030
use rustc_errors::{ErrorReported, FatalError, Handler};
3131
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
32-
use rustc_middle::middle::cstore::{EncodedMetadata, MetadataLoaderDyn};
33-
use rustc_middle::ty::{self, TyCtxt};
32+
use rustc_middle::middle::cstore::EncodedMetadata;
33+
use rustc_middle::ty::TyCtxt;
3434
use rustc_session::config::{OptLevel, OutputFilenames, PrintRequest};
3535
use rustc_session::Session;
3636
use rustc_span::symbol::Symbol;
@@ -248,13 +248,6 @@ impl CodegenBackend for LlvmCodegenBackend {
248248
target_features(sess)
249249
}
250250

251-
fn metadata_loader(&self) -> Box<MetadataLoaderDyn> {
252-
Box::new(rustc_codegen_ssa::back::metadata::DefaultMetadataLoader)
253-
}
254-
255-
fn provide(&self, _providers: &mut ty::query::Providers) {}
256-
fn provide_extern(&self, _providers: &mut ty::query::Providers) {}
257-
258251
fn codegen_crate<'tcx>(
259252
&self,
260253
tcx: TyCtxt<'tcx>,
@@ -304,7 +297,7 @@ impl CodegenBackend for LlvmCodegenBackend {
304297
sess,
305298
&codegen_results,
306299
outputs,
307-
&codegen_results.crate_name.as_str(),
300+
&codegen_results.crate_info.local_crate_name.as_str(),
308301
);
309302

310303
Ok(())

compiler/rustc_codegen_ssa/src/back/link.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,7 @@ fn add_order_independent_options(
19571957
cmd.output_filename(out_filename);
19581958

19591959
if crate_type == CrateType::Executable && sess.target.is_like_windows {
1960-
if let Some(ref s) = codegen_results.windows_subsystem {
1960+
if let Some(ref s) = codegen_results.crate_info.windows_subsystem {
19611961
cmd.subsystem(s);
19621962
}
19631963
}

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

-1
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,6 @@ pub fn provide(providers: &mut Providers) {
370370
pub fn provide_extern(providers: &mut Providers) {
371371
providers.is_reachable_non_generic = is_reachable_non_generic_provider_extern;
372372
providers.upstream_monomorphizations_for = upstream_monomorphizations_for_provider;
373-
providers.wasm_import_module_map = wasm_import_module_map;
374373
}
375374

376375
fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel {

compiler/rustc_codegen_ssa/src/back/write.rs

+1-19
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use rustc_session::config::{self, CrateType, Lto, OutputFilenames, OutputType};
3131
use rustc_session::config::{Passes, SwitchWithOptPath};
3232
use rustc_session::Session;
3333
use rustc_span::source_map::SourceMap;
34-
use rustc_span::symbol::{sym, Symbol};
34+
use rustc_span::symbol::sym;
3535
use rustc_span::{BytePos, FileName, InnerSpan, Pos, Span};
3636
use rustc_target::spec::{MergeFunctions, PanicStrategy, SanitizerSet};
3737

@@ -426,21 +426,9 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
426426
let (coordinator_send, coordinator_receive) = channel();
427427
let sess = tcx.sess;
428428

429-
let crate_name = tcx.crate_name(LOCAL_CRATE);
430429
let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
431430
let no_builtins = tcx.sess.contains_name(crate_attrs, sym::no_builtins);
432431
let is_compiler_builtins = tcx.sess.contains_name(crate_attrs, sym::compiler_builtins);
433-
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
434-
let windows_subsystem = subsystem.map(|subsystem| {
435-
if subsystem != sym::windows && subsystem != sym::console {
436-
tcx.sess.fatal(&format!(
437-
"invalid windows subsystem `{}`, only \
438-
`windows` and `console` are allowed",
439-
subsystem
440-
));
441-
}
442-
subsystem.to_string()
443-
});
444432

445433
let linker_info = LinkerInfo::new(tcx, target_cpu);
446434
let crate_info = CrateInfo::new(tcx);
@@ -472,9 +460,7 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
472460

473461
OngoingCodegen {
474462
backend,
475-
crate_name,
476463
metadata,
477-
windows_subsystem,
478464
linker_info,
479465
crate_info,
480466

@@ -1812,9 +1798,7 @@ impl SharedEmitterMain {
18121798

18131799
pub struct OngoingCodegen<B: ExtraBackendMethods> {
18141800
pub backend: B,
1815-
pub crate_name: Symbol,
18161801
pub metadata: EncodedMetadata,
1817-
pub windows_subsystem: Option<String>,
18181802
pub linker_info: LinkerInfo,
18191803
pub crate_info: CrateInfo,
18201804
pub coordinator_send: Sender<Box<dyn Any + Send>>,
@@ -1857,9 +1841,7 @@ impl<B: ExtraBackendMethods> OngoingCodegen<B> {
18571841

18581842
(
18591843
CodegenResults {
1860-
crate_name: self.crate_name,
18611844
metadata: self.metadata,
1862-
windows_subsystem: self.windows_subsystem,
18631845
linker_info: self.linker_info,
18641846
crate_info: self.crate_info,
18651847

compiler/rustc_codegen_ssa/src/base.rs

+17
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
3030
use rustc_session::cgu_reuse_tracker::CguReuse;
3131
use rustc_session::config::{self, EntryFnType};
3232
use rustc_session::Session;
33+
use rustc_span::symbol::sym;
3334
use rustc_target::abi::{Align, LayoutOf, VariantIdx};
3435

3536
use std::ops::{Deref, DerefMut};
@@ -755,7 +756,22 @@ impl<B: ExtraBackendMethods> Drop for AbortCodegenOnDrop<B> {
755756

756757
impl CrateInfo {
757758
pub fn new(tcx: TyCtxt<'_>) -> CrateInfo {
759+
let local_crate_name = tcx.crate_name(LOCAL_CRATE);
760+
let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
761+
let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem);
762+
let windows_subsystem = subsystem.map(|subsystem| {
763+
if subsystem != sym::windows && subsystem != sym::console {
764+
tcx.sess.fatal(&format!(
765+
"invalid windows subsystem `{}`, only \
766+
`windows` and `console` are allowed",
767+
subsystem
768+
));
769+
}
770+
subsystem.to_string()
771+
});
772+
758773
let mut info = CrateInfo {
774+
local_crate_name,
759775
panic_runtime: None,
760776
compiler_builtins: None,
761777
profiler_runtime: None,
@@ -769,6 +785,7 @@ impl CrateInfo {
769785
lang_item_to_crate: Default::default(),
770786
missing_lang_items: Default::default(),
771787
dependency_formats: tcx.dependency_formats(()),
788+
windows_subsystem,
772789
};
773790
let lang_items = tcx.lang_items();
774791

compiler/rustc_codegen_ssa/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ impl From<&cstore::NativeLib> for NativeLib {
135135
/// and the corresponding properties without referencing information outside of a `CrateInfo`.
136136
#[derive(Debug, Encodable, Decodable)]
137137
pub struct CrateInfo {
138+
pub local_crate_name: Symbol,
138139
pub panic_runtime: Option<CrateNum>,
139140
pub compiler_builtins: Option<CrateNum>,
140141
pub profiler_runtime: Option<CrateNum>,
@@ -148,16 +149,15 @@ pub struct CrateInfo {
148149
pub lang_item_to_crate: FxHashMap<LangItem, CrateNum>,
149150
pub missing_lang_items: FxHashMap<CrateNum, Vec<LangItem>>,
150151
pub dependency_formats: Lrc<Dependencies>,
152+
pub windows_subsystem: Option<String>,
151153
}
152154

153155
#[derive(Encodable, Decodable)]
154156
pub struct CodegenResults {
155-
pub crate_name: Symbol,
156157
pub modules: Vec<CompiledModule>,
157158
pub allocator_module: Option<CompiledModule>,
158159
pub metadata_module: Option<CompiledModule>,
159160
pub metadata: rustc_middle::middle::cstore::EncodedMetadata,
160-
pub windows_subsystem: Option<String>,
161161
pub linker_info: back::linker::LinkerInfo,
162162
pub crate_info: CrateInfo,
163163
}

compiler/rustc_codegen_ssa/src/traits/backend.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,16 @@ pub trait CodegenBackend {
6363
None
6464
}
6565

66-
fn metadata_loader(&self) -> Box<MetadataLoaderDyn>;
67-
fn provide(&self, _providers: &mut Providers);
68-
fn provide_extern(&self, _providers: &mut Providers);
66+
/// The metadata loader used to load rlib and dylib metadata.
67+
///
68+
/// Alternative codegen backends may want to use different rlib or dylib formats than the
69+
/// default native static archives and dynamic libraries.
70+
fn metadata_loader(&self) -> Box<MetadataLoaderDyn> {
71+
Box::new(crate::back::metadata::DefaultMetadataLoader)
72+
}
73+
74+
fn provide(&self, _providers: &mut Providers) {}
75+
fn provide_extern(&self, _providers: &mut Providers) {}
6976
fn codegen_crate<'tcx>(
7077
&self,
7178
tcx: TyCtxt<'tcx>,

compiler/rustc_driver/src/lib.rs

+22-10
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_data_structures::sync::SeqCst;
2121
use rustc_errors::registry::{InvalidErrorCode, Registry};
2222
use rustc_errors::{ErrorReported, PResult};
2323
use rustc_feature::find_gated_cfg;
24-
use rustc_interface::util::{self, collect_crate_types, get_builtin_codegen_backend};
24+
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
2525
use rustc_interface::{interface, Queries};
2626
use rustc_lint::LintStore;
2727
use rustc_metadata::locator;
@@ -499,7 +499,7 @@ fn make_input(
499499
}
500500
}
501501

502-
// Whether to stop or continue compilation.
502+
/// Whether to stop or continue compilation.
503503
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
504504
pub enum Compilation {
505505
Stop,
@@ -765,9 +765,16 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
765765
println!("commit-date: {}", unw(util::commit_date_str()));
766766
println!("host: {}", config::host_triple());
767767
println!("release: {}", unw(util::release_str()));
768-
if cfg!(feature = "llvm") {
769-
get_builtin_codegen_backend(&None, "llvm")().print_version();
770-
}
768+
769+
let debug_flags = matches.opt_strs("Z");
770+
let backend_name = debug_flags.iter().find_map(|x| {
771+
if x.starts_with("codegen-backend=") {
772+
Some(&x["codegen-backends=".len()..])
773+
} else {
774+
None
775+
}
776+
});
777+
get_codegen_backend(&None, backend_name).print_version();
771778
}
772779
}
773780

@@ -1039,8 +1046,8 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
10391046
}
10401047

10411048
// Don't handle -W help here, because we might first load plugins.
1042-
let r = matches.opt_strs("Z");
1043-
if r.iter().any(|x| *x == "help") {
1049+
let debug_flags = matches.opt_strs("Z");
1050+
if debug_flags.iter().any(|x| *x == "help") {
10441051
describe_debug_flags();
10451052
return None;
10461053
}
@@ -1060,9 +1067,14 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
10601067
}
10611068

10621069
if cg_flags.iter().any(|x| *x == "passes=list") {
1063-
if cfg!(feature = "llvm") {
1064-
get_builtin_codegen_backend(&None, "llvm")().print_passes();
1065-
}
1070+
let backend_name = debug_flags.iter().find_map(|x| {
1071+
if x.starts_with("codegen-backend=") {
1072+
Some(&x["codegen-backends=".len()..])
1073+
} else {
1074+
None
1075+
}
1076+
});
1077+
get_codegen_backend(&None, backend_name).print_passes();
10661078
return None;
10671079
}
10681080

compiler/rustc_interface/src/queries.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,7 @@ impl<'tcx> Queries<'tcx> {
245245
self.prepare_outputs.compute(|| {
246246
let expansion_result = self.expansion()?;
247247
let (krate, boxed_resolver, _) = &*expansion_result.peek();
248-
let crate_name = self.crate_name()?;
249-
let crate_name = crate_name.peek();
248+
let crate_name = self.crate_name()?.peek();
250249
passes::prepare_outputs(
251250
self.session(),
252251
self.compiler,
@@ -343,32 +342,36 @@ impl<'tcx> Queries<'tcx> {
343342
}
344343

345344
pub fn linker(&'tcx self) -> Result<Linker> {
346-
let dep_graph = self.dep_graph()?;
347-
let prepare_outputs = self.prepare_outputs()?;
348-
let crate_hash = self.global_ctxt()?.peek_mut().enter(|tcx| tcx.crate_hash(LOCAL_CRATE));
349-
let ongoing_codegen = self.ongoing_codegen()?;
350-
351345
let sess = self.session().clone();
352346
let codegen_backend = self.codegen_backend().clone();
353347

348+
let dep_graph = self.dep_graph()?.peek().clone();
349+
let prepare_outputs = self.prepare_outputs()?.take();
350+
let crate_hash = self.global_ctxt()?.peek_mut().enter(|tcx| tcx.crate_hash(LOCAL_CRATE));
351+
let ongoing_codegen = self.ongoing_codegen()?.take();
352+
354353
Ok(Linker {
355354
sess,
356-
dep_graph: dep_graph.peek().clone(),
357-
prepare_outputs: prepare_outputs.take(),
358-
crate_hash,
359-
ongoing_codegen: ongoing_codegen.take(),
360355
codegen_backend,
356+
357+
dep_graph,
358+
prepare_outputs,
359+
crate_hash,
360+
ongoing_codegen,
361361
})
362362
}
363363
}
364364

365365
pub struct Linker {
366+
// compilation inputs
366367
sess: Lrc<Session>,
368+
codegen_backend: Lrc<Box<dyn CodegenBackend>>,
369+
370+
// compilation outputs
367371
dep_graph: DepGraph,
368372
prepare_outputs: OutputFilenames,
369373
crate_hash: Svh,
370374
ongoing_codegen: Box<dyn Any>,
371-
codegen_backend: Lrc<Box<dyn CodegenBackend>>,
372375
}
373376

374377
impl Linker {

0 commit comments

Comments
 (0)