Skip to content

Commit 3faf023

Browse files
committed
Make incremental sessions identity no longer depend on the crate names provided by source code
1 parent bf9c7a6 commit 3faf023

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
@@ -26,7 +26,7 @@ use rustc_errors::{
2626
markdown, ColorConfig, DiagCtxt, ErrCode, ErrorGuaranteed, FatalError, PResult,
2727
};
2828
use rustc_feature::find_gated_cfg;
29-
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
29+
use rustc_interface::util::{self, get_codegen_backend};
3030
use rustc_interface::{interface, Queries};
3131
use rustc_lint::unerased_lint_store;
3232
use rustc_metadata::creader::MetadataLoader;
@@ -35,6 +35,7 @@ use rustc_session::config::{nightly_options, CG_OPTIONS, Z_OPTIONS};
3535
use rustc_session::config::{ErrorOutputType, Input, OutFileName, OutputType};
3636
use rustc_session::getopts::{self, Matches};
3737
use rustc_session::lint::{Lint, LintId};
38+
use rustc_session::output::collect_crate_types;
3839
use rustc_session::{config, EarlyDiagCtxt, Session};
3940
use rustc_span::def_id::LOCAL_CRATE;
4041
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
@@ -19,7 +19,7 @@ use rustc_middle::ty::{GlobalCtxt, TyCtxt};
1919
use rustc_serialize::opaque::FileEncodeResult;
2020
use rustc_session::config::{self, CrateType, OutputFilenames, OutputType};
2121
use rustc_session::cstore::Untracked;
22-
use rustc_session::output::find_crate_name;
22+
use rustc_session::output::{collect_crate_types, find_crate_name};
2323
use rustc_session::Session;
2424
use rustc_span::symbol::sym;
2525
use std::any::Any;
@@ -129,15 +129,15 @@ impl<'tcx> Queries<'tcx> {
129129

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

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

compiler/rustc_interface/src/util.rs

+4-64
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ 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, BuiltinLintDiagnostics, 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;
17+
use session::output::{categorize_crate_type, CRATE_TYPES};
1718
use session::EarlyDiagCtxt;
1819
use std::env;
1920
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
@@ -378,67 +379,6 @@ pub(crate) fn check_attr_crate_type(
378379
}
379380
}
380381

381-
const CRATE_TYPES: &[(Symbol, CrateType)] = &[
382-
(sym::rlib, CrateType::Rlib),
383-
(sym::dylib, CrateType::Dylib),
384-
(sym::cdylib, CrateType::Cdylib),
385-
(sym::lib, config::default_lib_output()),
386-
(sym::staticlib, CrateType::Staticlib),
387-
(sym::proc_dash_macro, CrateType::ProcMacro),
388-
(sym::bin, CrateType::Executable),
389-
];
390-
391-
fn categorize_crate_type(s: Symbol) -> Option<CrateType> {
392-
Some(CRATE_TYPES.iter().find(|(key, _)| *key == s)?.1)
393-
}
394-
395-
pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<CrateType> {
396-
// If we're generating a test executable, then ignore all other output
397-
// styles at all other locations
398-
if session.opts.test {
399-
return vec![CrateType::Executable];
400-
}
401-
402-
// Only check command line flags if present. If no types are specified by
403-
// command line, then reuse the empty `base` Vec to hold the types that
404-
// will be found in crate attributes.
405-
// JUSTIFICATION: before wrapper fn is available
406-
#[allow(rustc::bad_opt_access)]
407-
let mut base = session.opts.crate_types.clone();
408-
if base.is_empty() {
409-
let attr_types = attrs.iter().filter_map(|a| {
410-
if a.has_name(sym::crate_type)
411-
&& let Some(s) = a.value_str()
412-
{
413-
categorize_crate_type(s)
414-
} else {
415-
None
416-
}
417-
});
418-
base.extend(attr_types);
419-
if base.is_empty() {
420-
base.push(output::default_output_for_target(session));
421-
} else {
422-
base.sort();
423-
base.dedup();
424-
}
425-
}
426-
427-
base.retain(|crate_type| {
428-
if output::invalid_output_for_target(session, *crate_type) {
429-
session.dcx().emit_warn(errors::UnsupportedCrateTypeForTarget {
430-
crate_type: *crate_type,
431-
target_triple: &session.opts.target_triple,
432-
});
433-
false
434-
} else {
435-
true
436-
}
437-
});
438-
439-
base
440-
}
441-
442382
fn multiple_output_types_to_stdout(
443383
output_types: &OutputTypes,
444384
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
sess: &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)