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_config: &ModuleConfig,
|
||||
) -> WorkItemResult<B> {
|
||||
assert!(module_config.emit_obj != EmitObj::None);
|
||||
|
||||
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| {
|
||||
@ -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 =
|
||||
module.source.saved_files.get("dwo").as_ref().and_then(|saved_dwarf_object_file| {
|
||||
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 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 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 {
|
||||
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