]> git.lizzy.rs Git - rust.git/commit
msvc: Implement runtime support for unwinding
authorAlex Crichton <alex@alexcrichton.com>
Fri, 19 Jun 2015 21:57:06 +0000 (14:57 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 25 Jun 2015 16:33:15 +0000 (09:33 -0700)
commit91d799eab0d7f6784fb4366182b5007cf055519d
tree55e7a492bc92ed35982c7065767e04dfb59ddca3
parent1ec520a531b544079690f8178a7660421e8a713a
msvc: Implement runtime support for unwinding

Now that LLVM has been updated, the only remaining roadblock to implementing
unwinding for MSVC is to fill out the runtime support in `std::rt::unwind::seh`.
This commit does precisely that, fixing up some other bits and pieces along the
way:

* The `seh` unwinding module now uses `RaiseException` to initiate a panic.
* The `rust_try.ll` file was rewritten for MSVC (as it's quite different) and is
  located at `rust_try_msvc_64.ll`, only included on MSVC builds for now.
* The personality function for all landing pads generated by LLVM is hard-wired
  to `__C_specific_handler` instead of the standard `rust_eh_personality` lang
  item. This is required to get LLVM to emit SEH unwinding information instead
  of DWARF unwinding information. This also means that on MSVC the
  `rust_eh_personality` function is entirely unused (but is defined as it's a
  lang item).

More details about how panicking works on SEH can be found in the
`rust_try_msvc_64.ll` or `seh.rs` files, but I'm always open to adding more
comments!

A key aspect of this PR is missing, however, which is that **unwinding is still
turned off by default for MSVC**. There is a [bug in llvm][llvm-bug] which
causes optimizations to inline enough landing pads that LLVM chokes. If the
compiler is optimized at `-O1` (where inlining isn't enabled) then it can
bootstrap with unwinding enabled, but when optimized at `-O2` (inlining is
enabled) then it hits a fatal LLVM error.

[llvm-bug]: https://llvm.org/bugs/show_bug.cgi?id=23884
mk/rt.mk
src/librustc_trans/trans/cleanup.rs
src/libstd/rt/unwind/seh.rs
src/rt/rust_try_msvc_64.ll [new file with mode: 0644]