Auto merge of #30208 - pnkfelix:fix-issue-30063, r=alexcrichton
When given `rustc -C codegen-units=4 --emit=obj`, reset units back to 1. Fix #30063 Note: while this code is careful to handle the case of mutliple emit types (e.g. `--emit=asm,obj`) by reporting all the emit types that conflict with codegen units in its warnings, an invocation with multiple emit types *and* `-o PATH` will continue to ignore the requested target path (with a warning), as it already does today, since the code that checks for that is further downstream. (Multiple emit types without `-o PATH` will "work", though it will downgrade codegen-units to 1 just like all the other cases.) r? @alexcrichton
This commit is contained in:
commit
56a1f51ef0
@ -71,6 +71,30 @@ pub enum OutputType {
|
||||
DepInfo,
|
||||
}
|
||||
|
||||
impl OutputType {
|
||||
fn is_compatible_with_codegen_units_and_single_output_file(&self) -> bool {
|
||||
match *self {
|
||||
OutputType::Exe |
|
||||
OutputType::DepInfo => true,
|
||||
OutputType::Bitcode |
|
||||
OutputType::Assembly |
|
||||
OutputType::LlvmAssembly |
|
||||
OutputType::Object => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn shorthand(&self) -> &'static str {
|
||||
match *self {
|
||||
OutputType::Bitcode => "llvm-bc",
|
||||
OutputType::Assembly => "asm",
|
||||
OutputType::LlvmAssembly => "llvm-ir",
|
||||
OutputType::Object => "obj",
|
||||
OutputType::Exe => "link",
|
||||
OutputType::DepInfo => "dep-info",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Options {
|
||||
// The crate config requested for the session, which may be combined
|
||||
@ -933,7 +957,28 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
||||
output_types.insert(OutputType::Exe, None);
|
||||
}
|
||||
|
||||
let cg = build_codegen_options(matches, color);
|
||||
let mut cg = build_codegen_options(matches, color);
|
||||
|
||||
// Issue #30063: if user requests llvm-related output to one
|
||||
// particular path, disable codegen-units.
|
||||
if matches.opt_present("o") && cg.codegen_units != 1 {
|
||||
let incompatible: Vec<_> = output_types.iter()
|
||||
.map(|ot_path| ot_path.0)
|
||||
.filter(|ot| {
|
||||
!ot.is_compatible_with_codegen_units_and_single_output_file()
|
||||
}).collect();
|
||||
if !incompatible.is_empty() {
|
||||
for ot in &incompatible {
|
||||
early_warn(color, &format!("--emit={} with -o incompatible with \
|
||||
-C codegen-units=N for N > 1",
|
||||
ot.shorthand()));
|
||||
}
|
||||
early_warn(color, "resetting to default -C codegen-units=1");
|
||||
cg.codegen_units = 1;
|
||||
}
|
||||
}
|
||||
|
||||
let cg = cg;
|
||||
|
||||
let sysroot_opt = matches.opt_str("sysroot").map(|m| PathBuf::from(&m));
|
||||
let target = matches.opt_str("target").unwrap_or(
|
||||
|
35
src/test/run-make/issue-30063/Makefile
Normal file
35
src/test/run-make/issue-30063/Makefile
Normal file
@ -0,0 +1,35 @@
|
||||
-include ../tools.mk
|
||||
|
||||
all:
|
||||
rm -f $(TMPDIR)/foo-output
|
||||
$(RUSTC) -C codegen-units=4 -o $(TMPDIR)/foo-output foo.rs
|
||||
rm $(TMPDIR)/foo-output
|
||||
|
||||
rm -f $(TMPDIR)/asm-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=asm -o $(TMPDIR)/asm-output foo.rs
|
||||
rm $(TMPDIR)/asm-output
|
||||
|
||||
rm -f $(TMPDIR)/bc-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=llvm-bc -o $(TMPDIR)/bc-output foo.rs
|
||||
rm $(TMPDIR)/bc-output
|
||||
|
||||
rm -f $(TMPDIR)/ir-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=llvm-ir -o $(TMPDIR)/ir-output foo.rs
|
||||
rm $(TMPDIR)/ir-output
|
||||
|
||||
rm -f $(TMPDIR)/link-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=link -o $(TMPDIR)/link-output foo.rs
|
||||
rm $(TMPDIR)/link-output
|
||||
|
||||
rm -f $(TMPDIR)/obj-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=obj -o $(TMPDIR)/obj-output foo.rs
|
||||
rm $(TMPDIR)/obj-output
|
||||
|
||||
rm -f $(TMPDIR)/dep-output
|
||||
$(RUSTC) -C codegen-units=4 --emit=dep-info -o $(TMPDIR)/dep-output foo.rs
|
||||
rm $(TMPDIR)/dep-output
|
||||
|
||||
# # (This case doesn't work yet, and may be fundamentally wrong-headed anyway.)
|
||||
# rm -f $(TMPDIR)/multi-output
|
||||
# $(RUSTC) -C codegen-units=4 --emit=asm,obj -o $(TMPDIR)/multi-output foo.rs
|
||||
# rm $(TMPDIR)/multi-output
|
11
src/test/run-make/issue-30063/foo.rs
Normal file
11
src/test/run-make/issue-30063/foo.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2015 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() { }
|
Loading…
Reference in New Issue
Block a user