Skip to content

Commit 4059118

Browse files
committed
Allow codegen backends to indicate which crate types they support
This way cargo will drop the unsupported crate types for crates that specify multiple crate types.
1 parent 3ce89e2 commit 4059118

File tree

5 files changed

+35
-16
lines changed

5 files changed

+35
-16
lines changed

compiler/rustc_codegen_ssa/src/traits/backend.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
1010
use rustc_middle::ty::TyCtxt;
1111
use rustc_middle::util::Providers;
1212
use rustc_session::Session;
13-
use rustc_session::config::{self, OutputFilenames, PrintRequest};
13+
use rustc_session::config::{self, CrateType, OutputFilenames, PrintRequest};
1414
use rustc_span::Symbol;
1515

1616
use super::CodegenObject;
@@ -62,6 +62,18 @@ pub trait CodegenBackend {
6262
}
6363
}
6464

65+
fn supported_crate_types(&self, _sess: &Session) -> Vec<CrateType> {
66+
vec![
67+
CrateType::Executable,
68+
CrateType::Dylib,
69+
CrateType::Rlib,
70+
CrateType::Staticlib,
71+
CrateType::Cdylib,
72+
CrateType::ProcMacro,
73+
CrateType::Sdylib,
74+
]
75+
}
76+
6577
fn print_passes(&self) {}
6678

6779
fn print_version(&self) {}

compiler/rustc_driver_impl/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,8 @@ fn print_crate_info(
686686
};
687687
let t_outputs = rustc_interface::util::build_output_filenames(attrs, sess);
688688
let crate_name = passes::get_crate_name(sess, attrs);
689-
let crate_types = collect_crate_types(sess, attrs);
689+
let crate_types =
690+
collect_crate_types(sess, &codegen_backend.supported_crate_types(sess), attrs);
690691
for &style in &crate_types {
691692
let fname = rustc_session::output::filename_for_input(
692693
sess, style, crate_name, &t_outputs,

compiler/rustc_interface/src/passes.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,11 @@ pub fn create_and_enter_global_ctxt<T, F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> T>(
925925
let pre_configured_attrs = rustc_expand::config::pre_configure_attrs(sess, &krate.attrs);
926926

927927
let crate_name = get_crate_name(sess, &pre_configured_attrs);
928-
let crate_types = collect_crate_types(sess, &pre_configured_attrs);
928+
let crate_types = collect_crate_types(
929+
sess,
930+
&compiler.codegen_backend.supported_crate_types(sess),
931+
&pre_configured_attrs,
932+
);
929933
let stable_crate_id = StableCrateId::new(
930934
crate_name,
931935
crate_types.contains(&CrateType::Executable),

compiler/rustc_interface/src/util.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ impl CodegenBackend for DummyCodegenBackend {
354354
"dummy"
355355
}
356356

357+
fn supported_crate_types(&self, _sess: &Session) -> Vec<CrateType> {
358+
vec![CrateType::Rlib]
359+
}
360+
357361
fn codegen_crate<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Box<dyn Any> {
358362
Box::new(CodegenResults {
359363
modules: vec![],
@@ -378,17 +382,6 @@ impl CodegenBackend for DummyCodegenBackend {
378382
metadata: EncodedMetadata,
379383
outputs: &OutputFilenames,
380384
) {
381-
// JUSTIFICATION: TyCtxt no longer available here
382-
#[allow(rustc::bad_opt_access)]
383-
if sess.opts.crate_types.iter().any(|&crate_type| crate_type != CrateType::Rlib) {
384-
#[allow(rustc::untranslatable_diagnostic)]
385-
#[allow(rustc::diagnostic_outside_of_impl)]
386-
sess.dcx().fatal(format!(
387-
"crate type {} not supported by the dummy codegen backend",
388-
sess.opts.crate_types[0],
389-
));
390-
}
391-
392385
link_binary(
393386
sess,
394387
&ArArchiveBuilderBuilder,

compiler/rustc_session/src/output.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,11 @@ pub fn categorize_crate_type(s: Symbol) -> Option<CrateType> {
174174
Some(CRATE_TYPES.iter().find(|(key, _)| *key == s)?.1)
175175
}
176176

177-
pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<CrateType> {
177+
pub fn collect_crate_types(
178+
session: &Session,
179+
backend_crate_types: &[CrateType],
180+
attrs: &[ast::Attribute],
181+
) -> Vec<CrateType> {
178182
// If we're generating a test executable, then ignore all other output
179183
// styles at all other locations
180184
if session.opts.test {
@@ -219,7 +223,12 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<C
219223
}
220224

221225
base.retain(|crate_type| {
222-
if invalid_output_for_target(session, *crate_type) {
226+
if invalid_output_for_target(session, *crate_type)
227+
|| !backend_crate_types.contains(crate_type)
228+
{
229+
// FIXME provide a better warning for the case where the codegen
230+
// backend doesn't support it once cargo doesn't hard code this
231+
// warning message.
223232
session.dcx().emit_warn(errors::UnsupportedCrateTypeForTarget {
224233
crate_type: *crate_type,
225234
target_triple: &session.opts.target_triple,

0 commit comments

Comments
 (0)