Skip to content

Commit a9f929a

Browse files
authored
Unrolled build for #148177
Rollup merge of #148177 - bjorn3:codegen_backend_crate_types, r=WaffleLapkin 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. This is a prerequisite for rust-lang/miri#4648.
2 parents bc1d727 + 9fc1378 commit a9f929a

File tree

7 files changed

+62
-25
lines changed

7 files changed

+62
-25
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_incremental/src/persist/fs.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@ use rustc_data_structures::unord::{UnordMap, UnordSet};
116116
use rustc_data_structures::{base_n, flock};
117117
use rustc_fs_util::{LinkOrCopy, link_or_copy, try_canonicalize};
118118
use rustc_middle::bug;
119-
use rustc_session::config::CrateType;
120-
use rustc_session::output::collect_crate_types;
121119
use rustc_session::{Session, StableCrateId};
122120
use rustc_span::Symbol;
123121
use tracing::debug;
@@ -212,7 +210,11 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu
212210
/// The garbage collection will take care of it.
213211
///
214212
/// [`rustc_interface::queries::dep_graph`]: ../../rustc_interface/struct.Queries.html#structfield.dep_graph
215-
pub(crate) fn prepare_session_directory(sess: &Session, crate_name: Symbol) {
213+
pub(crate) fn prepare_session_directory(
214+
sess: &Session,
215+
crate_name: Symbol,
216+
stable_crate_id: StableCrateId,
217+
) {
216218
if sess.opts.incremental.is_none() {
217219
return;
218220
}
@@ -222,7 +224,7 @@ pub(crate) fn prepare_session_directory(sess: &Session, crate_name: Symbol) {
222224
debug!("prepare_session_directory");
223225

224226
// {incr-comp-dir}/{crate-name-and-disambiguator}
225-
let crate_dir = crate_path(sess, crate_name);
227+
let crate_dir = crate_path(sess, crate_name, stable_crate_id);
226228
debug!("crate-dir: {}", crate_dir.display());
227229
create_dir(sess, &crate_dir, "crate");
228230

@@ -595,17 +597,9 @@ fn string_to_timestamp(s: &str) -> Result<SystemTime, &'static str> {
595597
Ok(UNIX_EPOCH + duration)
596598
}
597599

598-
fn crate_path(sess: &Session, crate_name: Symbol) -> PathBuf {
600+
fn crate_path(sess: &Session, crate_name: Symbol, stable_crate_id: StableCrateId) -> PathBuf {
599601
let incr_dir = sess.opts.incremental.as_ref().unwrap().clone();
600602

601-
let crate_types = collect_crate_types(sess, &[]);
602-
let stable_crate_id = StableCrateId::new(
603-
crate_name,
604-
crate_types.contains(&CrateType::Executable),
605-
sess.opts.cg.metadata.clone(),
606-
sess.cfg_version,
607-
);
608-
609603
let crate_name =
610604
format!("{crate_name}-{}", stable_crate_id.as_u64().to_base_fixed_len(CASE_INSENSITIVE));
611605
incr_dir.join(crate_name)

compiler/rustc_incremental/src/persist/load.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use rustc_middle::dep_graph::{DepGraph, DepsType, SerializedDepGraph, WorkProduc
1010
use rustc_middle::query::on_disk_cache::OnDiskCache;
1111
use rustc_serialize::Decodable;
1212
use rustc_serialize::opaque::MemDecoder;
13-
use rustc_session::Session;
1413
use rustc_session::config::IncrementalStateAssertion;
14+
use rustc_session::{Session, StableCrateId};
1515
use rustc_span::Symbol;
1616
use tracing::{debug, warn};
1717

@@ -208,9 +208,14 @@ pub fn load_query_result_cache(sess: &Session) -> Option<OnDiskCache> {
208208

209209
/// Setups the dependency graph by loading an existing graph from disk and set up streaming of a
210210
/// new graph to an incremental session directory.
211-
pub fn setup_dep_graph(sess: &Session, crate_name: Symbol, deps: &DepsType) -> DepGraph {
211+
pub fn setup_dep_graph(
212+
sess: &Session,
213+
crate_name: Symbol,
214+
stable_crate_id: StableCrateId,
215+
deps: &DepsType,
216+
) -> DepGraph {
212217
// `load_dep_graph` can only be called after `prepare_session_directory`.
213-
prepare_session_directory(sess, crate_name);
218+
prepare_session_directory(sess, crate_name, stable_crate_id);
214219

215220
let res = sess.opts.build_dep_graph().then(|| load_dep_graph(sess, deps));
216221

compiler/rustc_interface/src/passes.rs

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

928928
let crate_name = get_crate_name(sess, &pre_configured_attrs);
929-
let crate_types = collect_crate_types(sess, &pre_configured_attrs);
929+
let crate_types = collect_crate_types(
930+
sess,
931+
&compiler.codegen_backend.supported_crate_types(sess),
932+
&pre_configured_attrs,
933+
);
930934
let stable_crate_id = StableCrateId::new(
931935
crate_name,
932936
crate_types.contains(&CrateType::Executable),
@@ -937,7 +941,7 @@ pub fn create_and_enter_global_ctxt<T, F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> T>(
937941
let outputs = util::build_output_filenames(&pre_configured_attrs, sess);
938942

939943
let dep_type = DepsType { dep_names: rustc_query_impl::dep_kind_names() };
940-
let dep_graph = setup_dep_graph(sess, crate_name, &dep_type);
944+
let dep_graph = setup_dep_graph(sess, crate_name, stable_crate_id, &dep_type);
941945

942946
let cstore =
943947
FreezeLock::new(Box::new(CStore::new(compiler.codegen_backend.metadata_loader())) as _);

compiler/rustc_interface/src/util.rs

Lines changed: 15 additions & 3 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,16 @@ 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 let Some(&crate_type) = codegen_results
392+
.crate_info
393+
.crate_types
394+
.iter()
395+
.find(|&&crate_type| crate_type != CrateType::Rlib)
396+
{
384397
#[allow(rustc::untranslatable_diagnostic)]
385398
#[allow(rustc::diagnostic_outside_of_impl)]
386399
sess.dcx().fatal(format!(
387-
"crate type {} not supported by the dummy codegen backend",
388-
sess.opts.crate_types[0],
400+
"crate type {crate_type} not supported by the dummy codegen backend"
389401
));
390402
}
391403

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)