Allow workproducts without object files.
This pull request partially reverts changes from e16c3b4a44
Original motivation for this assert was described with "A WorkProduct without a saved file is useless"
which was true at the time but now it is possible to have work products with other types of files
(llvm-ir, asm, etc) and there are bugreports for this failure:
For example: https://github.com/rust-lang/rust/issues/123695
Fixes https://github.com/rust-lang/rust/issues/123234
Now existing `assert` and `.unwrap_or_else` are unified into a single
check that emits slightly more user friendly error message if an object
files was meant to be produced but it's missing
This commit is contained in:
parent
4e1f5d90bc
commit
a03aeca99a
@ -907,8 +907,6 @@ fn execute_copy_from_cache_work_item<B: ExtraBackendMethods>(
|
|||||||
module: CachedModuleCodegen,
|
module: CachedModuleCodegen,
|
||||||
module_config: &ModuleConfig,
|
module_config: &ModuleConfig,
|
||||||
) -> WorkItemResult<B> {
|
) -> WorkItemResult<B> {
|
||||||
assert!(module_config.emit_obj != EmitObj::None);
|
|
||||||
|
|
||||||
let incr_comp_session_dir = cgcx.incr_comp_session_dir.as_ref().unwrap();
|
let incr_comp_session_dir = cgcx.incr_comp_session_dir.as_ref().unwrap();
|
||||||
|
|
||||||
let load_from_incr_comp_dir = |output_path: PathBuf, saved_path: &str| {
|
let load_from_incr_comp_dir = |output_path: PathBuf, saved_path: &str| {
|
||||||
@ -928,12 +926,6 @@ fn execute_copy_from_cache_work_item<B: ExtraBackendMethods>(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let object = load_from_incr_comp_dir(
|
|
||||||
cgcx.output_filenames.temp_path(OutputType::Object, Some(&module.name)),
|
|
||||||
module.source.saved_files.get("o").unwrap_or_else(|| {
|
|
||||||
cgcx.create_dcx().emit_fatal(errors::NoSavedObjectFile { cgu_name: &module.name })
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
let dwarf_object =
|
let dwarf_object =
|
||||||
module.source.saved_files.get("dwo").as_ref().and_then(|saved_dwarf_object_file| {
|
module.source.saved_files.get("dwo").as_ref().and_then(|saved_dwarf_object_file| {
|
||||||
let dwarf_obj_out = cgcx
|
let dwarf_obj_out = cgcx
|
||||||
@ -955,9 +947,14 @@ fn execute_copy_from_cache_work_item<B: ExtraBackendMethods>(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let should_emit_obj = module_config.emit_obj != EmitObj::None;
|
||||||
let assembly = load_from_incr_cache(module_config.emit_asm, OutputType::Assembly);
|
let assembly = load_from_incr_cache(module_config.emit_asm, OutputType::Assembly);
|
||||||
let llvm_ir = load_from_incr_cache(module_config.emit_ir, OutputType::LlvmAssembly);
|
let llvm_ir = load_from_incr_cache(module_config.emit_ir, OutputType::LlvmAssembly);
|
||||||
let bytecode = load_from_incr_cache(module_config.emit_bc, OutputType::Bitcode);
|
let bytecode = load_from_incr_cache(module_config.emit_bc, OutputType::Bitcode);
|
||||||
|
let object = load_from_incr_cache(should_emit_obj, OutputType::Object);
|
||||||
|
if should_emit_obj && object.is_none() {
|
||||||
|
cgcx.create_dcx().emit_fatal(errors::NoSavedObjectFile { cgu_name: &module.name })
|
||||||
|
}
|
||||||
|
|
||||||
WorkItemResult::Finished(CompiledModule {
|
WorkItemResult::Finished(CompiledModule {
|
||||||
name: module.name,
|
name: module.name,
|
||||||
|
6
tests/run-make/artifact-incr-cache-no-obj/lib.rs
Normal file
6
tests/run-make/artifact-incr-cache-no-obj/lib.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
pub fn add(a: u32, b: u32) -> u32 {
|
||||||
|
a + b
|
||||||
|
}
|
23
tests/run-make/artifact-incr-cache-no-obj/rmake.rs
Normal file
23
tests/run-make/artifact-incr-cache-no-obj/rmake.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// emitting an object file is not necessary if user didn't ask for one
|
||||||
|
//
|
||||||
|
// This test is similar to run-make/artifact-incr-cache but it doesn't
|
||||||
|
// require to emit an object file
|
||||||
|
//
|
||||||
|
// Fixes: rust-lang/rust#123234
|
||||||
|
|
||||||
|
extern crate run_make_support;
|
||||||
|
|
||||||
|
use run_make_support::{rustc, tmp_dir};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let inc_dir = tmp_dir();
|
||||||
|
|
||||||
|
for _ in 0..=1 {
|
||||||
|
rustc()
|
||||||
|
.input("lib.rs")
|
||||||
|
.crate_type("lib")
|
||||||
|
.emit("asm,dep-info,link,mir,llvm-ir,llvm-bc")
|
||||||
|
.incremental(&inc_dir)
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user