]> git.lizzy.rs Git - rust.git/commitdiff
Interpret EH actions properly
authorGary Guo <gary@garyguo.net>
Wed, 5 Oct 2022 01:29:56 +0000 (02:29 +0100)
committerGary Guo <gary@garyguo.net>
Wed, 5 Oct 2022 02:09:43 +0000 (03:09 +0100)
The EH actions stored in the LSDA follows the format of GCC except table
(even for LLVM-generated code). An missing action in the table is the
encoding for `Terminate`, see [1].

The currently code interprets it as `None`, as a workaround for #35011,
an issue that seems to occur in LLVM 3.7 and not after 3.9. These are
very old versions of LLVM and we don't support them anymore, so remove
this workaround and interpret them properly.

Note that LLVM currently does not emit any `Terminate` actions, but GCC
does. Although GCC backend currently doesn't do unwinding, removing it
preemptively would prevent future developers from wasting time to figure
out what's wrong.

[1]: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/eh_personality.cc#L522-L526

library/std/src/personality/dwarf/eh.rs

index 8799137b78f98bc8cb1db7a7d4ddcc93b596fa8e..27b50c13b77ca1235ef7ab81b47e9b10dc2db672 100644 (file)
@@ -98,9 +98,8 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
                 }
             }
         }
-        // Ip is not present in the table.  This should not happen... but it does: issue #35011.
-        // So rather than returning EHAction::Terminate, we do this.
-        Ok(EHAction::None)
+        // Ip is not present in the table. This indicates a nounwind call.
+        Ok(EHAction::Terminate)
     } else {
         // SjLj version:
         // The "IP" is an index into the call-site table, with two exceptions: