Skip to content

Commit b443a59

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 b443a59

File tree

5 files changed

+46
-7
lines changed

5 files changed

+46
-7
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: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ impl CodegenBackend for DummyCodegenBackend {
354354
"dummy"
355355
}
356356

357+
fn supported_crate_types(&self, _sess: &Session) -> Vec<CrateType> {
358+
// This includes bin despite failing on the link step to ensure that you
359+
// can still get the frontend handling for binaries. For all library
360+
// like crate types cargo will fallback to rlib unless you specifically
361+
// say that only a different crate type must be used.
362+
vec![CrateType::Rlib, CrateType::Executable]
363+
}
364+
357365
fn codegen_crate<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Box<dyn Any> {
358366
Box::new(CodegenResults {
359367
modules: vec![],
@@ -380,12 +388,17 @@ impl CodegenBackend for DummyCodegenBackend {
380388
) {
381389
// JUSTIFICATION: TyCtxt no longer available here
382390
#[allow(rustc::bad_opt_access)]
383-
if sess.opts.crate_types.iter().any(|&crate_type| crate_type != CrateType::Rlib) {
391+
if codegen_results
392+
.crate_info
393+
.crate_types
394+
.iter()
395+
.any(|&crate_type| crate_type != CrateType::Rlib)
396+
{
384397
#[allow(rustc::untranslatable_diagnostic)]
385398
#[allow(rustc::diagnostic_outside_of_impl)]
386399
sess.dcx().fatal(format!(
387400
"crate type {} not supported by the dummy codegen backend",
388-
sess.opts.crate_types[0],
401+
codegen_results.crate_info.crate_types[0],
389402
));
390403
}
391404

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)