Skip to content

Commit 7b933ad

Browse files
committed
[WIP] build_output_filenames: Use already-'resolved' crate name in favor of manually 'resolving' it
1 parent bfedb97 commit 7b933ad

File tree

5 files changed

+59
-39
lines changed

5 files changed

+59
-39
lines changed

Diff for: compiler/rustc_attr/src/builtin.rs

-4
Original file line numberDiff line numberDiff line change
@@ -503,10 +503,6 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil
503503
}
504504
}
505505

506-
pub fn find_crate_name(attrs: &[Attribute]) -> Option<Symbol> {
507-
attr::first_attr_value_str_by_name(attrs, sym::crate_name)
508-
}
509-
510506
#[derive(Clone, Debug)]
511507
pub struct Condition {
512508
pub name: Symbol,

Diff for: compiler/rustc_driver_impl/src/lib.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -759,8 +759,12 @@ fn print_crate_info(
759759
// no crate attributes, print out an error and exit
760760
return Compilation::Continue;
761761
};
762-
let t_outputs = rustc_interface::util::build_output_filenames(attrs, sess);
763-
let crate_name = passes::get_crate_name(sess, attrs);
762+
let (crate_name, crate_name_origin) = passes::get_crate_name(sess, attrs);
763+
let t_outputs = rustc_interface::util::build_output_filenames(
764+
sess,
765+
crate_name,
766+
crate_name_origin,
767+
);
764768
let crate_types = collect_crate_types(sess, attrs);
765769
for &style in &crate_types {
766770
let fname = rustc_session::output::filename_for_input(
@@ -774,7 +778,8 @@ fn print_crate_info(
774778
// no crate attributes, print out an error and exit
775779
return Compilation::Continue;
776780
};
777-
println_info!("{}", passes::get_crate_name(sess, attrs));
781+
let (crate_name, _) = passes::get_crate_name(sess, attrs);
782+
println_info!("{crate_name}");
778783
}
779784
Cfg => {
780785
let mut cfgs = sess

Diff for: compiler/rustc_interface/src/passes.rs

+18-9
Original file line numberDiff line numberDiff line change
@@ -660,15 +660,16 @@ pub(crate) fn create_global_ctxt<'tcx>(
660660

661661
let pre_configured_attrs = rustc_expand::config::pre_configure_attrs(sess, &krate.attrs);
662662

663-
let crate_name = get_crate_name(sess, &pre_configured_attrs);
663+
let (crate_name, crate_name_origin) = get_crate_name(sess, &pre_configured_attrs);
664664
let crate_types = collect_crate_types(sess, &pre_configured_attrs);
665665
let stable_crate_id = StableCrateId::new(
666666
crate_name,
667667
crate_types.contains(&CrateType::Executable),
668668
sess.opts.cg.metadata.clone(),
669669
sess.cfg_version,
670670
);
671-
let outputs = util::build_output_filenames(&pre_configured_attrs, sess);
671+
let outputs = util::build_output_filenames(sess, crate_name, crate_name_origin);
672+
672673
let dep_graph = setup_dep_graph(sess, crate_name)?;
673674

674675
let cstore =
@@ -1044,7 +1045,7 @@ pub(crate) fn start_codegen<'tcx>(
10441045
}
10451046

10461047
/// Compute and validate the crate name.
1047-
pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol {
1048+
pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> (Symbol, CrateNameOrigin) {
10481049
// We unconditionally validate all `#![crate_name]`s even if a crate name was
10491050
// set on the command line via `--crate-name` which we prioritize over the
10501051
// crate attributes. We perform the validation here instead of later to ensure
@@ -1053,9 +1054,9 @@ pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol
10531054
let attr_crate_name =
10541055
validate_and_find_value_str_builtin_attr(sym::crate_name, sess, krate_attrs);
10551056

1056-
let validate = |name, span| {
1057+
let validate = |name, span, origin| {
10571058
rustc_session::output::validate_crate_name(sess, name, span);
1058-
name
1059+
(name, origin)
10591060
};
10601061

10611062
if let Some(crate_name) = &sess.opts.crate_name {
@@ -1069,11 +1070,11 @@ pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol
10691070
attr_crate_name,
10701071
});
10711072
}
1072-
return validate(crate_name, None);
1073+
return validate(crate_name, None, CrateNameOrigin::CliOpt);
10731074
}
10741075

10751076
if let Some((crate_name, span)) = attr_crate_name {
1076-
return validate(crate_name, Some(span));
1077+
return validate(crate_name, Some(span), CrateNameOrigin::CrateAttr);
10771078
}
10781079

10791080
if let Input::File(ref path) = sess.io.input
@@ -1082,11 +1083,19 @@ pub fn get_crate_name(sess: &Session, krate_attrs: &[ast::Attribute]) -> Symbol
10821083
if file_stem.starts_with('-') {
10831084
sess.dcx().emit_err(errors::CrateNameInvalid { crate_name: file_stem });
10841085
} else {
1085-
return validate(Symbol::intern(&file_stem.replace('-', "_")), None);
1086+
let crate_name = file_stem.replace('-', "_");
1087+
return validate(Symbol::intern(&crate_name), None, CrateNameOrigin::InputFile);
10861088
}
10871089
}
10881090

1089-
Symbol::intern("rust_out")
1091+
(Symbol::intern("rust_out"), CrateNameOrigin::Fallback)
1092+
}
1093+
1094+
pub enum CrateNameOrigin {
1095+
CliOpt,
1096+
CrateAttr,
1097+
InputFile,
1098+
Fallback,
10901099
}
10911100

10921101
fn get_recursion_limit(krate_attrs: &[ast::Attribute], sess: &Session) -> Limit {

Diff for: compiler/rustc_interface/src/util.rs

+25-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::errors;
2+
use crate::passes::CrateNameOrigin;
23
use rustc_ast as ast;
34
use rustc_codegen_ssa::traits::CodegenBackend;
45
#[cfg(parallel_compiler)]
@@ -14,8 +15,10 @@ use rustc_session::{filesearch, EarlyDiagCtxt, Session};
1415
use rustc_span::edit_distance::find_best_match_for_name;
1516
use rustc_span::edition::Edition;
1617
use rustc_span::source_map::SourceMapInputs;
17-
use rustc_span::symbol::sym;
18+
use rustc_span::{sym, Symbol};
1819
use rustc_target::spec::Target;
20+
21+
use std::borrow::Cow;
1922
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
2023
use std::path::{Path, PathBuf};
2124
use std::sync::atomic::{AtomicBool, Ordering};
@@ -453,37 +456,43 @@ fn multiple_output_types_to_stdout(
453456
}
454457
}
455458

456-
pub fn build_output_filenames(attrs: &[ast::Attribute], sess: &Session) -> OutputFilenames {
459+
pub fn build_output_filenames(
460+
sess: &Session,
461+
crate_name: Symbol,
462+
crate_name_origin: CrateNameOrigin,
463+
) -> OutputFilenames {
457464
if multiple_output_types_to_stdout(
458465
&sess.opts.output_types,
459466
sess.io.output_file == Some(OutFileName::Stdout),
460467
) {
461468
sess.dcx().emit_fatal(errors::MultipleOutputTypesToStdout);
462469
}
463470

464-
let crate_name = sess
465-
.opts
466-
.crate_name
467-
.clone()
468-
.or_else(|| rustc_attr::find_crate_name(attrs).map(|n| n.to_string()));
469-
470471
match sess.io.output_file {
471472
None => {
472473
// "-" as input file will cause the parser to read from stdin so we
473474
// have to make up a name
474475
// We want to toss everything after the final '.'
475476
let dirpath = sess.io.output_dir.clone().unwrap_or_default();
476477

477-
// If a crate name is present, we use it as the link name
478-
let stem = crate_name.clone().unwrap_or_else(|| sess.io.input.filestem().to_owned());
478+
// FIXME(fmease): Figure out a nicer way to do this. `stem` is almost
479+
// identical to `crate_name` except when it was derived
480+
// from a real(!) input file in which case they may differ
481+
// by `-`/`_` only.
482+
let stem = match crate_name_origin {
483+
CrateNameOrigin::InputFile => {
484+
Cow::Owned(sess.io.input.filestem().replace('-', "_"))
485+
}
486+
_ => Cow::Borrowed(crate_name.as_str()),
487+
};
479488

480489
OutputFilenames::new(
481490
dirpath,
482-
crate_name.unwrap_or_else(|| stem.replace('-', "_")),
483-
stem,
491+
crate_name,
492+
&stem,
484493
None,
485494
sess.io.temps_dir.clone(),
486-
sess.opts.cg.extra_filename.clone(),
495+
&sess.opts.cg.extra_filename,
487496
sess.opts.output_types.clone(),
488497
)
489498
}
@@ -504,15 +513,14 @@ pub fn build_output_filenames(attrs: &[ast::Attribute], sess: &Session) -> Outpu
504513
sess.dcx().emit_warn(errors::IgnoringOutDir);
505514
}
506515

507-
let out_filestem =
508-
out_file.filestem().unwrap_or_default().to_str().unwrap().to_string();
516+
let out_filestem = out_file.filestem().unwrap_or_default().to_str().unwrap();
509517
OutputFilenames::new(
510518
out_file.parent().unwrap_or_else(|| Path::new("")).to_path_buf(),
511-
crate_name.unwrap_or_else(|| out_filestem.replace('-', "_")),
519+
crate_name,
512520
out_filestem,
513521
ofile,
514522
sess.io.temps_dir.clone(),
515-
sess.opts.cg.extra_filename.clone(),
523+
&sess.opts.cg.extra_filename,
516524
sess.opts.output_types.clone(),
517525
)
518526
}

Diff for: compiler/rustc_session/src/config.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ use rustc_feature::UnstableFeatures;
1818
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
1919
use rustc_span::edition::{Edition, DEFAULT_EDITION, EDITION_NAME_LIST, LATEST_STABLE_EDITION};
2020
use rustc_span::source_map::FilePathMapping;
21-
use rustc_span::{FileName, FileNameDisplayPreference, RealFileName, SourceFileHashAlgorithm};
21+
use rustc_span::{
22+
FileName, FileNameDisplayPreference, RealFileName, SourceFileHashAlgorithm, Symbol,
23+
};
2224
use rustc_target::spec::{FramePointer, LinkSelfContainedComponents, LinkerFeatures};
2325
use rustc_target::spec::{SplitDebuginfo, Target, TargetTriple};
2426
use std::collections::btree_map::{
@@ -945,7 +947,7 @@ impl OutFileName {
945947
#[derive(Clone, Hash, Debug, HashStable_Generic, Encodable, Decodable)]
946948
pub struct OutputFilenames {
947949
pub(crate) out_directory: PathBuf,
948-
/// Crate name. Never contains '-'.
950+
/// Crate name (must not contain `-`) plus extra (`-Cextra-filename`).
949951
crate_stem: String,
950952
/// Typically based on `.rs` input file name. Any '-' is preserved.
951953
filestem: String,
@@ -961,19 +963,19 @@ pub const DWARF_OBJECT_EXT: &str = "dwo";
961963
impl OutputFilenames {
962964
pub fn new(
963965
out_directory: PathBuf,
964-
out_crate_name: String,
965-
out_filestem: String,
966+
crate_name: Symbol,
967+
out_filestem: &str,
966968
single_output_file: Option<OutFileName>,
967969
temps_directory: Option<PathBuf>,
968-
extra: String,
970+
extra: &str,
969971
outputs: OutputTypes,
970972
) -> Self {
971973
OutputFilenames {
972974
out_directory,
973975
single_output_file,
974976
temps_directory,
975977
outputs,
976-
crate_stem: format!("{out_crate_name}{extra}"),
978+
crate_stem: format!("{crate_name}{extra}"),
977979
filestem: format!("{out_filestem}{extra}"),
978980
}
979981
}

0 commit comments

Comments
 (0)