Skip to content

Commit

Permalink
rustc: Mix extra-filename in temp outputs
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
alexcrichton committed Jul 19, 2014
1 parent 50868db commit 82fb85a
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 16 deletions.
12 changes: 7 additions & 5 deletions src/librustc/back/link.rs
Expand Up @@ -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)));

Expand Down Expand Up @@ -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())
}
}

Expand All @@ -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
Expand All @@ -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(),
(), |()| {
Expand Down
8 changes: 5 additions & 3 deletions src/librustc/back/lto.rs
Expand Up @@ -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) {
Expand Down
12 changes: 9 additions & 3 deletions src/librustc/driver/driver.rs
Expand Up @@ -936,6 +936,7 @@ pub struct OutputFilenames {
pub out_directory: Path,
pub out_filestem: String,
pub single_output_file: Option<Path>,
extra: String,
}

impl OutputFilenames {
Expand All @@ -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"),
Expand All @@ -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)
}
}

Expand Down Expand Up @@ -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(),
}
}

Expand All @@ -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(),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/crate-name-mismatch.rs
Expand Up @@ -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`
Expand Down
4 changes: 1 addition & 3 deletions src/test/run-make/crate-name-priority/Makefile
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions 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)
11 changes: 11 additions & 0 deletions 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() {}
2 changes: 1 addition & 1 deletion src/test/run-pass/crate-name-attr-used.rs
Expand Up @@ -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() {}

5 comments on commit 82fb85a

@bors
Copy link
Contributor

@bors bors commented on 82fb85a Jul 19, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from kballard
at alexcrichton@82fb85a

@bors
Copy link
Contributor

@bors bors commented on 82fb85a Jul 19, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging alexcrichton/rust/same-crate-name = 82fb85a into auto

@bors
Copy link
Contributor

@bors bors commented on 82fb85a Jul 19, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alexcrichton/rust/same-crate-name = 82fb85a merged ok, testing candidate = 44a71de

@bors
Copy link
Contributor

@bors bors commented on 82fb85a Jul 19, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = 44a71de

Please sign in to comment.