about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2020-08-08 16:14:11 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2020-08-08 16:14:11 +0200
commit240e1785324ba33d3f116d0b733236d967888224 (patch)
tree4b7748225dcb90129d6daf06a506af87803f0d86
parent5afffb823c3e8af9b77c877af78cf3753d1e7072 (diff)
downloadrust-240e1785324ba33d3f116d0b733236d967888224.tar.gz
rust-240e1785324ba33d3f116d0b733236d967888224.zip
Don't panic on io errors
Fixes #920
-rw-r--r--src/archive.rs23
-rw-r--r--src/driver/aot.rs8
-rw-r--r--src/lib.rs2
-rw-r--r--src/pretty_clif.rs25
4 files changed, 35 insertions, 23 deletions
diff --git a/src/archive.rs b/src/archive.rs
index 0e5820936bc..0878e54545e 100644
--- a/src/archive.rs
+++ b/src/archive.rs
@@ -149,6 +149,8 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
             Gnu(ar::GnuBuilder<File>),
         }
 
+        let sess = self.config.sess;
+
         let mut symbol_table = BTreeMap::new();
 
         let mut entries = Vec::new();
@@ -169,10 +171,11 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
                     let mut data = Vec::new();
                     entry.read_to_end(&mut data).unwrap();
                     data
-
                 }
                 ArchiveEntry::File(file) => {
-                    std::fs::read(file).unwrap()
+                    std::fs::read(file).unwrap_or_else(|err| {
+                        sess.fatal(&format!("error while reading object file during archive building: {}", err));
+                    })
                 }
             };
 
@@ -192,7 +195,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
                         if err == "Unknown file magic" {
                             // Not an object file; skip it.
                         } else {
-                            self.config.sess.fatal(&format!("Error parsing `{}` during archive creation: {}", entry_name, err));
+                            sess.fatal(&format!("error parsing `{}` during archive creation: {}", entry_name, err));
                         }
                     }
                 }
@@ -203,7 +206,9 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
 
         let mut builder = if self.config.use_gnu_style_archive {
             BuilderKind::Gnu(ar::GnuBuilder::new(
-                File::create(&self.config.dst).unwrap(),
+                File::create(&self.config.dst).unwrap_or_else(|err| {
+                    sess.fatal(&format!("error opening destination during archive building: {}", err));
+                }),
                 entries
                     .iter()
                     .map(|(name, _)| name.as_bytes().to_vec())
@@ -213,7 +218,9 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
             ).unwrap())
         } else {
             BuilderKind::Bsd(ar::Builder::new(
-                File::create(&self.config.dst).unwrap(),
+                File::create(&self.config.dst).unwrap_or_else(|err| {
+                    sess.fatal(&format!("error opening destination during archive building: {}", err));
+                }),
                 symbol_table,
             ).unwrap())
         };
@@ -260,8 +267,10 @@ impl<'a> ArArchiveBuilder<'a> {
 
         let mut i = 0;
         while let Some(entry) = archive.next_entry() {
-            let entry = entry.unwrap();
-            let file_name = String::from_utf8(entry.header().identifier().to_vec()).unwrap();
+            let entry = entry?;
+            let file_name = String::from_utf8(entry.header().identifier().to_vec()).map_err(|err| {
+                std::io::Error::new(std::io::ErrorKind::InvalidData, err)
+            })?;
             if !skip(&file_name) {
                 self.entries.push((
                     file_name,
diff --git a/src/driver/aot.rs b/src/driver/aot.rs
index d6d62598efb..9f6b0c51475 100644
--- a/src/driver/aot.rs
+++ b/src/driver/aot.rs
@@ -54,7 +54,9 @@ fn emit_module<B: Backend>(
         .output_filenames(LOCAL_CRATE)
         .temp_path(OutputType::Object, Some(&name));
     let obj = product.emit();
-    std::fs::write(&tmp_file, obj).unwrap();
+    if let Err(err) = std::fs::write(&tmp_file, obj) {
+        tcx.sess.fatal(&format!("error writing object file: {}", err));
+    }
 
     let work_product = if std::env::var("CG_CLIF_INCR_CACHE_DISABLED").is_ok() {
         None
@@ -254,7 +256,9 @@ pub(super) fn run_aot(
                 crate::metadata::write_metadata(tcx, object);
             });
 
-            std::fs::write(&tmp_file, obj).unwrap();
+            if let Err(err) = std::fs::write(&tmp_file, obj) {
+                tcx.sess.fatal(&format!("error writing metadata object file: {}", err));
+            }
 
             (metadata_cgu_name, tmp_file)
         });
diff --git a/src/lib.rs b/src/lib.rs
index d389248c012..bc0bae9c28d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,4 @@
-#![feature(rustc_private, decl_macro, type_alias_impl_trait, associated_type_bounds, never_type)]
+#![feature(rustc_private, decl_macro, type_alias_impl_trait, associated_type_bounds, never_type, try_blocks)]
 #![warn(rust_2018_idioms)]
 #![warn(unused_lifetimes)]
 
diff --git a/src/pretty_clif.rs b/src/pretty_clif.rs
index 64346c423c8..ef48a9f358e 100644
--- a/src/pretty_clif.rs
+++ b/src/pretty_clif.rs
@@ -243,19 +243,18 @@ pub(crate) fn write_clif_file<'tcx>(
     )
     .unwrap();
 
-    match ::std::fs::File::create(clif_file_name) {
-        Ok(mut file) => {
-            let target_triple = crate::target_triple(tcx.sess);
-            writeln!(file, "test compile").unwrap();
-            writeln!(file, "set is_pic").unwrap();
-            writeln!(file, "set enable_simd").unwrap();
-            writeln!(file, "target {} haswell", target_triple).unwrap();
-            writeln!(file, "").unwrap();
-            file.write(clif.as_bytes()).unwrap();
-        }
-        Err(e) => {
-            tcx.sess.warn(&format!("err opening clif file: {:?}", e));
-        }
+    let res: std::io::Result<()> = try {
+        let mut file = std::fs::File::create(clif_file_name)?;
+        let target_triple = crate::target_triple(tcx.sess);
+        writeln!(file, "test compile")?;
+        writeln!(file, "set is_pic")?;
+        writeln!(file, "set enable_simd")?;
+        writeln!(file, "target {} haswell", target_triple)?;
+        writeln!(file, "")?;
+        file.write(clif.as_bytes())?;
+    };
+    if let Err(err) = res {
+        tcx.sess.warn(&format!("err writing clif file: {}", err));
     }
 }