Skip to content

Commit

Permalink
Don't fail to remove files if they are missing
Browse files Browse the repository at this point in the history
In the backend we may want to remove certain temporary files, but in
certain other situations these files might not be produced in the first
place. We don't exactly care about that, and the intent is really that
these files are gone after a certain point in the backend.

Here we unify the backend file removing calls to use `ensure_removed`
which will attempt to delete a file, but will not fail if it does not
exist (anymore).

The tradeoff to this approach is, of course, that we may miss instances
were we are attempting to remove files at wrong paths due to some bug –
compilation would silently succeed but the temporary files would remain
there somewhere.
  • Loading branch information
nagisa committed Feb 14, 2021
1 parent b86674e commit fa3621b
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 14 deletions.
5 changes: 2 additions & 3 deletions compiler/rustc_codegen_llvm/src/back/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use crate::llvm_util;
use crate::type_::Type;
use crate::LlvmCodegenBackend;
use crate::ModuleLlvm;
use rustc_codegen_ssa::back::link::ensure_removed;
use rustc_codegen_ssa::back::write::{
BitcodeSection, CodegenContext, EmitObj, ModuleConfig, TargetMachineFactoryConfig,
TargetMachineFactoryFn,
Expand Down Expand Up @@ -879,9 +880,7 @@ pub(crate) unsafe fn codegen(

if !config.emit_bc {
debug!("removing_bitcode {:?}", bc_out);
if let Err(e) = fs::remove_file(&bc_out) {
diag_handler.err(&format!("failed to remove bitcode: {}", e));
}
ensure_removed(diag_handler, &bc_out);
}
}

Expand Down
11 changes: 7 additions & 4 deletions compiler/rustc_codegen_ssa/src/back/link.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::temp_dir::MaybeTempDir;
use rustc_errors::Handler;
use rustc_fs_util::fix_windows_verbatim_for_gcc;
use rustc_hir::def_id::CrateNum;
use rustc_middle::middle::cstore::{EncodedMetadata, LibSource};
Expand Down Expand Up @@ -34,9 +35,11 @@ use std::path::{Path, PathBuf};
use std::process::{ExitStatus, Output, Stdio};
use std::{ascii, char, env, fmt, fs, io, mem, str};

pub fn remove(sess: &Session, path: &Path) {
pub fn ensure_removed(diag_handler: &Handler, path: &Path) {
if let Err(e) = fs::remove_file(path) {
sess.err(&format!("failed to remove {}: {}", path.display(), e));
if e.kind() != io::ErrorKind::NotFound {
diag_handler.err(&format!("failed to remove {}: {}", path.display(), e));
}
}
}

Expand Down Expand Up @@ -112,11 +115,11 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
if !sess.opts.cg.save_temps {
let remove_temps_from_module = |module: &CompiledModule| {
if let Some(ref obj) = module.object {
remove(sess, obj);
ensure_removed(sess.diagnostic(), obj);
}

if let Some(ref obj) = module.dwarf_object {
remove(sess, obj);
ensure_removed(sess.diagnostic(), obj);
}
};

Expand Down
14 changes: 7 additions & 7 deletions compiler/rustc_codegen_ssa/src/back/write.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use super::link::{self, remove};
use super::link::{self, ensure_removed};
use super::linker::LinkerInfo;
use super::lto::{self, SerializedModule};
use super::symbol_export::symbol_name_for_instance_in_crate;
Expand Down Expand Up @@ -543,7 +543,7 @@ fn produce_final_output_artifacts(
copy_gracefully(&path, &crate_output.path(output_type));
if !sess.opts.cg.save_temps && !keep_numbered {
// The user just wants `foo.x`, not `foo.#module-name#.x`.
remove(sess, &path);
ensure_removed(sess.diagnostic(), &path);
}
} else {
let ext = crate_output
Expand Down Expand Up @@ -642,33 +642,33 @@ fn produce_final_output_artifacts(
for module in compiled_modules.modules.iter() {
if let Some(ref path) = module.object {
if !keep_numbered_objects {
remove(sess, path);
ensure_removed(sess.diagnostic(), path);
}
}

if let Some(ref path) = module.dwarf_object {
if !keep_numbered_objects {
remove(sess, path);
ensure_removed(sess.diagnostic(), path);
}
}

if let Some(ref path) = module.bytecode {
if !keep_numbered_bitcode {
remove(sess, path);
ensure_removed(sess.diagnostic(), path);
}
}
}

if !user_wants_bitcode {
if let Some(ref metadata_module) = compiled_modules.metadata_module {
if let Some(ref path) = metadata_module.bytecode {
remove(sess, &path);
ensure_removed(sess.diagnostic(), &path);
}
}

if let Some(ref allocator_module) = compiled_modules.allocator_module {
if let Some(ref path) = allocator_module.bytecode {
remove(sess, path);
ensure_removed(sess.diagnostic(), path);
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/debuginfo-emit-llvm-ir-and-split-debuginfo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// build-pass
//
// compile-flags: -g --emit=llvm-ir -Zunstable-options -Csplit-debuginfo=unpacked
//
// Make sure that we don't explode with an error if we don't actually end up emitting any `dwo`s,
// as would be the case if we don't actually codegen anything.
#![crate_type="rlib"]

0 comments on commit fa3621b

Please sign in to comment.