From 82fb85a15223bf2e7345197bbbc96c399292d54f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 15 Jul 2014 09:13:58 -0700 Subject: [PATCH] rustc: Mix extra-filename in temp outputs When invoking the compiler in parallel, the intermediate output of the object files and bytecode can stomp over one another if two crates with the same name are being compiled. The output file is already being disambiguated with `-C extra-filename`, so this commit alters the naming of the temporary files to also mix in the extra filename to ensure that file names don't clash. --- src/librustc/back/link.rs | 12 +++++++----- src/librustc/back/lto.rs | 8 +++++--- src/librustc/driver/driver.rs | 12 +++++++++--- src/test/compile-fail/crate-name-mismatch.rs | 2 +- src/test/run-make/crate-name-priority/Makefile | 4 +--- .../extra-filename-with-temp-outputs/Makefile | 6 ++++++ .../run-make/extra-filename-with-temp-outputs/foo.rs | 11 +++++++++++ src/test/run-pass/crate-name-attr-used.rs | 2 +- 8 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 src/test/run-make/extra-filename-with-temp-outputs/Makefile create mode 100644 src/test/run-make/extra-filename-with-temp-outputs/foo.rs diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index ab3e158b00a8e..cc73cdce6a8c3 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -571,8 +571,9 @@ pub fn find_crate_name(sess: Option<&Session>, }; // Look in attributes 100% of the time to make sure the attribute is marked - // as used. After doing this, however, favor crate names from the command - // line. + // as used. After doing this, however, we still prioritize a crate name from + // the command line over one found in the #[crate_name] attribute. If we + // find both we ensure that they're the same later on as well. let attr_crate_name = attrs.iter().find(|at| at.check_name("crate_name")) .and_then(|at| at.value_str().map(|s| (at, s))); @@ -1558,7 +1559,7 @@ fn add_upstream_rust_crates(cmd: &mut Command, sess: &Session, add_dynamic_crate(cmd, sess, src.dylib.unwrap()) } cstore::RequireStatic => { - add_static_crate(cmd, sess, tmpdir, cnum, src.rlib.unwrap()) + add_static_crate(cmd, sess, tmpdir, src.rlib.unwrap()) } } @@ -1575,7 +1576,7 @@ fn add_upstream_rust_crates(cmd: &mut Command, sess: &Session, // Adds the static "rlib" versions of all crates to the command line. fn add_static_crate(cmd: &mut Command, sess: &Session, tmpdir: &Path, - cnum: ast::CrateNum, cratepath: Path) { + cratepath: Path) { // When performing LTO on an executable output, all of the // bytecode from the upstream libraries has already been // included in our object file output. We need to modify all of @@ -1591,7 +1592,8 @@ fn add_upstream_rust_crates(cmd: &mut Command, sess: &Session, // If we're not doing LTO, then our job is simply to just link // against the archive. if sess.lto() { - let name = sess.cstore.get_crate_data(cnum).name.clone(); + let name = cratepath.filename_str().unwrap(); + let name = name.slice(3, name.len() - 5); // chop off lib/.rlib time(sess.time_passes(), format!("altering {}.rlib", name).as_slice(), (), |()| { diff --git a/src/librustc/back/lto.rs b/src/librustc/back/lto.rs index 6184ea4591f08..c51f1615d5980 100644 --- a/src/librustc/back/lto.rs +++ b/src/librustc/back/lto.rs @@ -54,17 +54,19 @@ pub fn run(sess: &session::Session, llmod: ModuleRef, }; let archive = ArchiveRO::open(&path).expect("wanted an rlib"); - debug!("reading {}", name); + let file = path.filename_str().unwrap(); + let file = file.slice(3, file.len() - 5); // chop off lib/.rlib + debug!("reading {}", file); let bc = time(sess.time_passes(), format!("read {}.bytecode.deflate", name).as_slice(), (), |_| { archive.read(format!("{}.bytecode.deflate", - name).as_slice()) + file).as_slice()) }); let bc = bc.expect("missing compressed bytecode in archive!"); let bc = time(sess.time_passes(), - format!("inflate {}.bc", name).as_slice(), + format!("inflate {}.bc", file).as_slice(), (), |_| { match flate::inflate_bytes(bc) { diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index 43aa3f9041fd9..81ace4d015c85 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -936,6 +936,7 @@ pub struct OutputFilenames { pub out_directory: Path, pub out_filestem: String, pub single_output_file: Option, + extra: String, } impl OutputFilenames { @@ -948,7 +949,7 @@ impl OutputFilenames { } pub fn temp_path(&self, flavor: link::OutputType) -> Path { - let base = self.out_directory.join(self.out_filestem.as_slice()); + let base = self.out_directory.join(self.filestem()); match flavor { link::OutputTypeBitcode => base.with_extension("bc"), link::OutputTypeAssembly => base.with_extension("s"), @@ -959,8 +960,11 @@ impl OutputFilenames { } pub fn with_extension(&self, extension: &str) -> Path { - let stem = self.out_filestem.as_slice(); - self.out_directory.join(stem).with_extension(extension) + self.out_directory.join(self.filestem()).with_extension(extension) + } + + fn filestem(&self) -> String { + format!("{}{}", self.out_filestem, self.extra) } } @@ -1000,6 +1004,7 @@ pub fn build_output_filenames(input: &Input, out_directory: dirpath, out_filestem: stem, single_output_file: None, + extra: sess.opts.cg.extra_filename.clone(), } } @@ -1018,6 +1023,7 @@ pub fn build_output_filenames(input: &Input, out_directory: out_file.dir_path(), out_filestem: out_file.filestem_str().unwrap().to_string(), single_output_file: ofile, + extra: sess.opts.cg.extra_filename.clone(), } } } diff --git a/src/test/compile-fail/crate-name-mismatch.rs b/src/test/compile-fail/crate-name-mismatch.rs index 387bda5f10fe1..589c0beb76059 100644 --- a/src/test/compile-fail/crate-name-mismatch.rs +++ b/src/test/compile-fail/crate-name-mismatch.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-args: --crate-name foo +// compile-flags: --crate-name foo #![crate_name = "bar"] //~^ ERROR: --crate-name and #[crate_name] are required to match, but `foo` != `bar` diff --git a/src/test/run-make/crate-name-priority/Makefile b/src/test/run-make/crate-name-priority/Makefile index 250602710f57d..2fe5183243361 100644 --- a/src/test/run-make/crate-name-priority/Makefile +++ b/src/test/run-make/crate-name-priority/Makefile @@ -7,7 +7,5 @@ all: rm $(TMPDIR)/$(call BIN,bar) $(RUSTC) foo1.rs rm $(TMPDIR)/$(call BIN,foo) - $(RUSTC) foo1.rs --crate-name bar - rm $(TMPDIR)/$(call BIN,bar) - $(RUSTC) foo1.rs --crate-name bar -o $(TMPDIR)/bar1 + $(RUSTC) foo1.rs -o $(TMPDIR)/bar1 rm $(TMPDIR)/$(call BIN,bar1) diff --git a/src/test/run-make/extra-filename-with-temp-outputs/Makefile b/src/test/run-make/extra-filename-with-temp-outputs/Makefile new file mode 100644 index 0000000000000..28c22a173cca0 --- /dev/null +++ b/src/test/run-make/extra-filename-with-temp-outputs/Makefile @@ -0,0 +1,6 @@ +-include ../tools.mk + +all: + $(RUSTC) -C extra-filename=bar foo.rs -C save-temps + rm $(TMPDIR)/foobar.o + rm $(TMPDIR)/$(call BIN,foobar) diff --git a/src/test/run-make/extra-filename-with-temp-outputs/foo.rs b/src/test/run-make/extra-filename-with-temp-outputs/foo.rs new file mode 100644 index 0000000000000..8ae3d072362ed --- /dev/null +++ b/src/test/run-make/extra-filename-with-temp-outputs/foo.rs @@ -0,0 +1,11 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() {} diff --git a/src/test/run-pass/crate-name-attr-used.rs b/src/test/run-pass/crate-name-attr-used.rs index abc565d31758f..95c7d331264e1 100644 --- a/src/test/run-pass/crate-name-attr-used.rs +++ b/src/test/run-pass/crate-name-attr-used.rs @@ -10,6 +10,6 @@ // compile-flags:--crate-name crate-name-attr-used -F unused-attribute -#![crate_name = "test"] +#![crate_name = "crate-name-attr-used"] fn main() {}