about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/helpers.rs88
1 files changed, 45 insertions, 43 deletions
diff --git a/src/helpers.rs b/src/helpers.rs
index ee2c39b5115..8523af84d06 100644
--- a/src/helpers.rs
+++ b/src/helpers.rs
@@ -23,49 +23,51 @@ use crate::*;
 
 impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
 
-// This mapping is the reverse of `decode_error_kind` in
-// <https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/mod.rs>
-// and should be kept in sync.
-const UNIX_IO_ERROR_TABLE: &[(std::io::ErrorKind, &str)] = {
+// This mapping should match `decode_error_kind` in
+// <https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/mod.rs>.
+const UNIX_IO_ERROR_TABLE: &[(&str, std::io::ErrorKind)] = {
     use std::io::ErrorKind::*;
     &[
-        (ArgumentListTooLong, "E2BIG"),
-        (AddrInUse, "EADDRINUSE"),
-        (AddrNotAvailable, "EADDRNOTAVAIL"),
-        (ResourceBusy, "EBUSY"),
-        (ConnectionAborted, "ECONNABORTED"),
-        (ConnectionRefused, "ECONNREFUSED"),
-        (ConnectionReset, "ECONNRESET"),
-        (Deadlock, "EDEADLK"),
-        (FilesystemQuotaExceeded, "EDQUOT"),
-        (AlreadyExists, "EEXIST"),
-        (FileTooLarge, "EFBIG"),
-        (HostUnreachable, "EHOSTUNREACH"),
-        (Interrupted, "EINTR"),
-        (InvalidInput, "EINVAL"),
-        (IsADirectory, "EISDIR"),
-        (FilesystemLoop, "ELOOP"),
-        (NotFound, "ENOENT"),
-        (OutOfMemory, "ENOMEM"),
-        (StorageFull, "ENOSPC"),
-        (Unsupported, "ENOSYS"),
-        (TooManyLinks, "EMLINK"),
-        (InvalidFilename, "ENAMETOOLONG"),
-        (NetworkDown, "ENETDOWN"),
-        (NetworkUnreachable, "ENETUNREACH"),
-        (NotConnected, "ENOTCONN"),
-        (NotADirectory, "ENOTDIR"),
-        (DirectoryNotEmpty, "ENOTEMPTY"),
-        (BrokenPipe, "EPIPE"),
-        (ReadOnlyFilesystem, "EROFS"),
-        (NotSeekable, "ESPIPE"),
-        (StaleNetworkFileHandle, "ESTALE"),
-        (TimedOut, "ETIMEDOUT"),
-        (ExecutableFileBusy, "ETXTBSY"),
-        (CrossesDevices, "EXDEV"),
-        // The following have two valid options...we pick one.
-        (PermissionDenied, "EPERM"),
-        (WouldBlock, "EWOULDBLOCK"),
+        ("E2BIG", ArgumentListTooLong),
+        ("EADDRINUSE", AddrInUse),
+        ("EADDRNOTAVAIL", AddrNotAvailable),
+        ("EBUSY", ResourceBusy),
+        ("ECONNABORTED", ConnectionAborted),
+        ("ECONNREFUSED", ConnectionRefused),
+        ("ECONNRESET", ConnectionReset),
+        ("EDEADLK", Deadlock),
+        ("EDQUOT", FilesystemQuotaExceeded),
+        ("EEXIST", AlreadyExists),
+        ("EFBIG", FileTooLarge),
+        ("EHOSTUNREACH", HostUnreachable),
+        ("EINTR", Interrupted),
+        ("EINVAL", InvalidInput),
+        ("EISDIR", IsADirectory),
+        ("ELOOP", FilesystemLoop),
+        ("ENOENT", NotFound),
+        ("ENOMEM", OutOfMemory),
+        ("ENOSPC", StorageFull),
+        ("ENOSYS", Unsupported),
+        ("EMLINK", TooManyLinks),
+        ("ENAMETOOLONG", InvalidFilename),
+        ("ENETDOWN", NetworkDown),
+        ("ENETUNREACH", NetworkUnreachable),
+        ("ENOTCONN", NotConnected),
+        ("ENOTDIR", NotADirectory),
+        ("ENOTEMPTY", DirectoryNotEmpty),
+        ("EPIPE", BrokenPipe),
+        ("EROFS", ReadOnlyFilesystem),
+        ("ESPIPE", NotSeekable),
+        ("ESTALE", StaleNetworkFileHandle),
+        ("ETIMEDOUT", TimedOut),
+        ("ETXTBSY", ExecutableFileBusy),
+        ("EXDEV", CrossesDevices),
+        // The following have two valid options. We have both for the forwards mapping; only the
+        // first one will be used for the backwards mapping.
+        ("EPERM", PermissionDenied),
+        ("EACCES", PermissionDenied),
+        ("EWOULDBLOCK", WouldBlock),
+        ("EAGAIN", WouldBlock),
     ]
 };
 
@@ -577,7 +579,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
         let this = self.eval_context_ref();
         let target = &this.tcx.sess.target;
         if target.families.iter().any(|f| f == "unix") {
-            for &(kind, name) in UNIX_IO_ERROR_TABLE {
+            for &(name, kind) in UNIX_IO_ERROR_TABLE {
                 if err_kind == kind {
                     return this.eval_libc(name);
                 }
@@ -615,7 +617,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
         let target = &this.tcx.sess.target;
         if target.families.iter().any(|f| f == "unix") {
             let errnum = errnum.to_i32()?;
-            for &(kind, name) in UNIX_IO_ERROR_TABLE {
+            for &(name, kind) in UNIX_IO_ERROR_TABLE {
                 if errnum == this.eval_libc_i32(name)? {
                     return Ok(kind);
                 }