Skip to content

Commit 8d1aeed

Browse files
authored
Rollup merge of rust-lang#121764 - Zoxc:incr-sess-no-source, r=oli-obk
Make incremental sessions identity no longer depend on the crate names provided by source code This makes incremental sessions identity no longer depend on the crate names provided by source code, implementing rust-lang/compiler-team#726. r? ```@oli-obk```
2 parents 060e364 + 12cd322 commit 8d1aeed

File tree

10 files changed

+101
-99
lines changed

10 files changed

+101
-99
lines changed

compiler/rustc_driver_impl/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use rustc_errors::{
2828
markdown, ColorConfig, DiagCtxt, ErrCode, ErrorGuaranteed, FatalError, PResult,
2929
};
3030
use rustc_feature::find_gated_cfg;
31-
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
31+
use rustc_interface::util::{self, get_codegen_backend};
3232
use rustc_interface::{interface, Queries};
3333
use rustc_lint::unerased_lint_store;
3434
use rustc_metadata::creader::MetadataLoader;
@@ -37,6 +37,7 @@ use rustc_session::config::{nightly_options, CG_OPTIONS, Z_OPTIONS};
3737
use rustc_session::config::{ErrorOutputType, Input, OutFileName, OutputType};
3838
use rustc_session::getopts::{self, Matches};
3939
use rustc_session::lint::{Lint, LintId};
40+
use rustc_session::output::collect_crate_types;
4041
use rustc_session::{config, filesearch, EarlyDiagCtxt, Session};
4142
use rustc_span::def_id::LOCAL_CRATE;
4243
use rustc_span::source_map::FileLoader;

compiler/rustc_incremental/src/persist/fs.rs

+14-8
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,9 @@ use rustc_data_structures::unord::{UnordMap, UnordSet};
110110
use rustc_data_structures::{base_n, flock};
111111
use rustc_errors::ErrorGuaranteed;
112112
use rustc_fs_util::{link_or_copy, try_canonicalize, LinkOrCopy};
113+
use rustc_session::config::CrateType;
114+
use rustc_session::output::{collect_crate_types, find_crate_name};
113115
use rustc_session::{Session, StableCrateId};
114-
use rustc_span::Symbol;
115116

116117
use std::fs as std_fs;
117118
use std::io::{self, ErrorKind};
@@ -205,11 +206,7 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu
205206
/// The garbage collection will take care of it.
206207
///
207208
/// [`rustc_interface::queries::dep_graph`]: ../../rustc_interface/struct.Queries.html#structfield.dep_graph
208-
pub(crate) fn prepare_session_directory(
209-
sess: &Session,
210-
crate_name: Symbol,
211-
stable_crate_id: StableCrateId,
212-
) -> Result<(), ErrorGuaranteed> {
209+
pub(crate) fn prepare_session_directory(sess: &Session) -> Result<(), ErrorGuaranteed> {
213210
if sess.opts.incremental.is_none() {
214211
return Ok(());
215212
}
@@ -219,7 +216,7 @@ pub(crate) fn prepare_session_directory(
219216
debug!("prepare_session_directory");
220217

221218
// {incr-comp-dir}/{crate-name-and-disambiguator}
222-
let crate_dir = crate_path(sess, crate_name, stable_crate_id);
219+
let crate_dir = crate_path(sess);
223220
debug!("crate-dir: {}", crate_dir.display());
224221
create_dir(sess, &crate_dir, "crate")?;
225222

@@ -604,9 +601,18 @@ fn string_to_timestamp(s: &str) -> Result<SystemTime, &'static str> {
604601
Ok(UNIX_EPOCH + duration)
605602
}
606603

607-
fn crate_path(sess: &Session, crate_name: Symbol, stable_crate_id: StableCrateId) -> PathBuf {
604+
fn crate_path(sess: &Session) -> PathBuf {
608605
let incr_dir = sess.opts.incremental.as_ref().unwrap().clone();
609606

607+
let crate_name = find_crate_name(sess, &[]);
608+
let crate_types = collect_crate_types(sess, &[]);
609+
let stable_crate_id = StableCrateId::new(
610+
crate_name,
611+
crate_types.contains(&CrateType::Executable),
612+
sess.opts.cg.metadata.clone(),
613+
sess.cfg_version,
614+
);
615+
610616
let stable_crate_id = base_n::encode(stable_crate_id.as_u64() as u128, INT_ENCODE_BASE);
611617

612618
let crate_name = format!("{crate_name}-{stable_crate_id}");

compiler/rustc_incremental/src/persist/load.rs

+4-8
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use rustc_middle::query::on_disk_cache::OnDiskCache;
88
use rustc_serialize::opaque::MemDecoder;
99
use rustc_serialize::Decodable;
1010
use rustc_session::config::IncrementalStateAssertion;
11-
use rustc_session::{Session, StableCrateId};
12-
use rustc_span::{ErrorGuaranteed, Symbol};
11+
use rustc_session::Session;
12+
use rustc_span::ErrorGuaranteed;
1313
use std::path::{Path, PathBuf};
1414

1515
use super::data::*;
@@ -190,13 +190,9 @@ pub fn load_query_result_cache(sess: &Session) -> Option<OnDiskCache<'_>> {
190190

191191
/// Setups the dependency graph by loading an existing graph from disk and set up streaming of a
192192
/// new graph to an incremental session directory.
193-
pub fn setup_dep_graph(
194-
sess: &Session,
195-
crate_name: Symbol,
196-
stable_crate_id: StableCrateId,
197-
) -> Result<DepGraph, ErrorGuaranteed> {
193+
pub fn setup_dep_graph(sess: &Session) -> Result<DepGraph, ErrorGuaranteed> {
198194
// `load_dep_graph` can only be called after `prepare_session_directory`.
199-
prepare_session_directory(sess, crate_name, stable_crate_id)?;
195+
prepare_session_directory(sess)?;
200196

201197
let res = sess.opts.build_dep_graph().then(|| load_dep_graph(sess));
202198

compiler/rustc_interface/messages.ftl

-3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,3 @@ interface_rustc_error_unexpected_annotation =
4848
4949
interface_temps_dir_error =
5050
failed to find or create the directory specified by `--temps-dir`
51-
52-
interface_unsupported_crate_type_for_target =
53-
dropping unsupported crate type `{$crate_type}` for target `{$target_triple}`

compiler/rustc_interface/src/errors.rs

-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use rustc_macros::Diagnostic;
2-
use rustc_session::config::CrateType;
32
use rustc_span::{Span, Symbol};
4-
use rustc_target::spec::TargetTriple;
53

64
use std::io;
75
use std::path::Path;
@@ -90,13 +88,6 @@ pub struct FailedWritingFile<'a> {
9088
#[diag(interface_proc_macro_crate_panic_abort)]
9189
pub struct ProcMacroCratePanicAbort;
9290

93-
#[derive(Diagnostic)]
94-
#[diag(interface_unsupported_crate_type_for_target)]
95-
pub struct UnsupportedCrateTypeForTarget<'a> {
96-
pub crate_type: CrateType,
97-
pub target_triple: &'a TargetTriple,
98-
}
99-
10091
#[derive(Diagnostic)]
10192
#[diag(interface_multiple_output_types_adaption)]
10293
pub struct MultipleOutputTypesAdaption;

compiler/rustc_interface/src/queries.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc_middle::ty::{GlobalCtxt, TyCtxt};
1818
use rustc_serialize::opaque::FileEncodeResult;
1919
use rustc_session::config::{self, CrateType, OutputFilenames, OutputType};
2020
use rustc_session::cstore::Untracked;
21-
use rustc_session::output::find_crate_name;
21+
use rustc_session::output::{collect_crate_types, find_crate_name};
2222
use rustc_session::Session;
2323
use rustc_span::symbol::sym;
2424
use std::any::Any;
@@ -128,15 +128,15 @@ impl<'tcx> Queries<'tcx> {
128128

129129
// parse `#[crate_name]` even if `--crate-name` was passed, to make sure it matches.
130130
let crate_name = find_crate_name(sess, &pre_configured_attrs);
131-
let crate_types = util::collect_crate_types(sess, &pre_configured_attrs);
131+
let crate_types = collect_crate_types(sess, &pre_configured_attrs);
132132
let stable_crate_id = StableCrateId::new(
133133
crate_name,
134134
crate_types.contains(&CrateType::Executable),
135135
sess.opts.cg.metadata.clone(),
136136
sess.cfg_version,
137137
);
138138
let outputs = util::build_output_filenames(&pre_configured_attrs, sess);
139-
let dep_graph = setup_dep_graph(sess, crate_name, stable_crate_id)?;
139+
let dep_graph = setup_dep_graph(sess)?;
140140

141141
let cstore = FreezeLock::new(Box::new(CStore::new(
142142
self.compiler.codegen_backend.metadata_loader(),

compiler/rustc_interface/src/util.rs

+4-64
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ use rustc_data_structures::sync;
77
use rustc_metadata::{load_symbol_from_dylib, DylibError};
88
use rustc_parse::validate_attr;
99
use rustc_session as session;
10-
use rustc_session::config::{self, Cfg, CrateType, OutFileName, OutputFilenames, OutputTypes};
10+
use rustc_session::config::{Cfg, OutFileName, OutputFilenames, OutputTypes};
1111
use rustc_session::filesearch::sysroot_candidates;
1212
use rustc_session::lint::{self, BuiltinLintDiag, LintBuffer};
13-
use rustc_session::{filesearch, output, Session};
13+
use rustc_session::{filesearch, Session};
1414
use rustc_span::edit_distance::find_best_match_for_name;
1515
use rustc_span::edition::Edition;
16-
use rustc_span::symbol::{sym, Symbol};
16+
use rustc_span::symbol::sym;
1717
use rustc_target::spec::Target;
18+
use session::output::{categorize_crate_type, CRATE_TYPES};
1819
use session::EarlyDiagCtxt;
1920
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
2021
use std::path::{Path, PathBuf};
@@ -399,67 +400,6 @@ pub(crate) fn check_attr_crate_type(
399400
}
400401
}
401402

402-
const CRATE_TYPES: &[(Symbol, CrateType)] = &[
403-
(sym::rlib, CrateType::Rlib),
404-
(sym::dylib, CrateType::Dylib),
405-
(sym::cdylib, CrateType::Cdylib),
406-
(sym::lib, config::default_lib_output()),
407-
(sym::staticlib, CrateType::Staticlib),
408-
(sym::proc_dash_macro, CrateType::ProcMacro),
409-
(sym::bin, CrateType::Executable),
410-
];
411-
412-
fn categorize_crate_type(s: Symbol) -> Option<CrateType> {
413-
Some(CRATE_TYPES.iter().find(|(key, _)| *key == s)?.1)
414-
}
415-
416-
pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<CrateType> {
417-
// If we're generating a test executable, then ignore all other output
418-
// styles at all other locations
419-
if session.opts.test {
420-
return vec![CrateType::Executable];
421-
}
422-
423-
// Only check command line flags if present. If no types are specified by
424-
// command line, then reuse the empty `base` Vec to hold the types that
425-
// will be found in crate attributes.
426-
// JUSTIFICATION: before wrapper fn is available
427-
#[allow(rustc::bad_opt_access)]
428-
let mut base = session.opts.crate_types.clone();
429-
if base.is_empty() {
430-
let attr_types = attrs.iter().filter_map(|a| {
431-
if a.has_name(sym::crate_type)
432-
&& let Some(s) = a.value_str()
433-
{
434-
categorize_crate_type(s)
435-
} else {
436-
None
437-
}
438-
});
439-
base.extend(attr_types);
440-
if base.is_empty() {
441-
base.push(output::default_output_for_target(session));
442-
} else {
443-
base.sort();
444-
base.dedup();
445-
}
446-
}
447-
448-
base.retain(|crate_type| {
449-
if output::invalid_output_for_target(session, *crate_type) {
450-
session.dcx().emit_warn(errors::UnsupportedCrateTypeForTarget {
451-
crate_type: *crate_type,
452-
target_triple: &session.opts.target_triple,
453-
});
454-
false
455-
} else {
456-
true
457-
}
458-
});
459-
460-
base
461-
}
462-
463403
fn multiple_output_types_to_stdout(
464404
output_types: &OutputTypes,
465405
single_output_file_is_stdout: bool,

compiler/rustc_session/messages.ftl

+3
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,7 @@ session_unleashed_feature_help_unnamed = skipping check that does not even have
111111
112112
session_unstable_virtual_function_elimination = `-Zvirtual-function-elimination` requires `-Clto`
113113
114+
session_unsupported_crate_type_for_target =
115+
dropping unsupported crate type `{$crate_type}` for target `{$target_triple}`
116+
114117
session_unsupported_dwarf_version = requested DWARF version {$dwarf_version} is greater than 5

compiler/rustc_session/src/errors.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_macros::Diagnostic;
1010
use rustc_span::{Span, Symbol};
1111
use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTriple};
1212

13-
use crate::parse::ParseSess;
13+
use crate::{config::CrateType, parse::ParseSess};
1414

1515
pub struct FeatureGateError {
1616
pub span: MultiSpan,
@@ -345,6 +345,13 @@ pub(crate) struct BinaryFloatLiteralNotSupported {
345345
pub span: Span,
346346
}
347347

348+
#[derive(Diagnostic)]
349+
#[diag(session_unsupported_crate_type_for_target)]
350+
pub struct UnsupportedCrateTypeForTarget<'a> {
351+
pub crate_type: CrateType,
352+
pub target_triple: &'a TargetTriple,
353+
}
354+
348355
pub fn report_lit_error(
349356
psess: &ParseSess,
350357
err: LitError,

compiler/rustc_session/src/output.rs

+63-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Related to out filenames of compilation (e.g. binaries).
2-
use crate::config::{CrateType, Input, OutFileName, OutputFilenames, OutputType};
2+
use crate::config::{self, CrateType, Input, OutFileName, OutputFilenames, OutputType};
33
use crate::errors::{
4-
CrateNameDoesNotMatch, CrateNameEmpty, CrateNameInvalid, FileIsNotWriteable,
4+
self, CrateNameDoesNotMatch, CrateNameEmpty, CrateNameInvalid, FileIsNotWriteable,
55
InvalidCharacterInCrateName, InvalidCrateNameHelp,
66
};
77
use crate::Session;
@@ -200,3 +200,64 @@ pub fn invalid_output_for_target(sess: &Session, crate_type: CrateType) -> bool
200200

201201
false
202202
}
203+
204+
pub const CRATE_TYPES: &[(Symbol, CrateType)] = &[
205+
(sym::rlib, CrateType::Rlib),
206+
(sym::dylib, CrateType::Dylib),
207+
(sym::cdylib, CrateType::Cdylib),
208+
(sym::lib, config::default_lib_output()),
209+
(sym::staticlib, CrateType::Staticlib),
210+
(sym::proc_dash_macro, CrateType::ProcMacro),
211+
(sym::bin, CrateType::Executable),
212+
];
213+
214+
pub fn categorize_crate_type(s: Symbol) -> Option<CrateType> {
215+
Some(CRATE_TYPES.iter().find(|(key, _)| *key == s)?.1)
216+
}
217+
218+
pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<CrateType> {
219+
// If we're generating a test executable, then ignore all other output
220+
// styles at all other locations
221+
if session.opts.test {
222+
return vec![CrateType::Executable];
223+
}
224+
225+
// Only check command line flags if present. If no types are specified by
226+
// command line, then reuse the empty `base` Vec to hold the types that
227+
// will be found in crate attributes.
228+
// JUSTIFICATION: before wrapper fn is available
229+
#[allow(rustc::bad_opt_access)]
230+
let mut base = session.opts.crate_types.clone();
231+
if base.is_empty() {
232+
let attr_types = attrs.iter().filter_map(|a| {
233+
if a.has_name(sym::crate_type)
234+
&& let Some(s) = a.value_str()
235+
{
236+
categorize_crate_type(s)
237+
} else {
238+
None
239+
}
240+
});
241+
base.extend(attr_types);
242+
if base.is_empty() {
243+
base.push(default_output_for_target(session));
244+
} else {
245+
base.sort();
246+
base.dedup();
247+
}
248+
}
249+
250+
base.retain(|crate_type| {
251+
if invalid_output_for_target(session, *crate_type) {
252+
session.dcx().emit_warn(errors::UnsupportedCrateTypeForTarget {
253+
crate_type: *crate_type,
254+
target_triple: &session.opts.target_triple,
255+
});
256+
false
257+
} else {
258+
true
259+
}
260+
});
261+
262+
base
263+
}

0 commit comments

Comments
 (0)