Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rustc: Fill out remaining parts of C-unwind ABI #86155

Merged
merged 6 commits into from
Aug 4, 2021

Commits on Aug 3, 2021

  1. rustc: Fill out remaining parts of C-unwind ABI

    This commit intends to fill out some of the remaining pieces of the
    C-unwind ABI. This has a number of other changes with it though to move
    this design space forward a bit. Notably contained within here is:
    
    * On `panic=unwind`, the `extern "C"` ABI is now considered as "may
      unwind". This fixes a longstanding soundness issue where if you
      `panic!()` in an `extern "C"` function defined in Rust that's actually
      UB because the LLVM representation for the function has the `nounwind`
      attribute, but then you unwind.
    
    * Whether or not a function unwinds now mainly considers the ABI of the
      function instead of first checking the panic strategy. This fixes a
      miscompile of `extern "C-unwind"` with `panic=abort` because that ABI
      can still unwind.
    
    * The aborting stub for non-unwinding ABIs with `panic=unwind` has been
      reimplemented. Previously this was done as a small tweak during MIR
      generation, but this has been moved to a separate and dedicated MIR
      pass. This new pass will, for appropriate functions and function
      calls, insert a `cleanup` landing pad for any function call that may
      unwind within a function that is itself not allowed to unwind. Note
      that this subtly changes some behavior from before where previously on
      an unwind which was caught-to-abort it would run active destructors in
      the function, and now it simply immediately aborts the process.
    
    * The `#[unwind]` attribute has been removed and all users in tests and
      such are now using `C-unwind` and `#![feature(c_unwind)]`.
    
    I think this is largely the last piece of the RFC to implement.
    Unfortunately I believe this is still not stabilizable as-is because
    activating the feature gate changes the behavior of the existing `extern
    "C"` ABI in a way that has no replacement. My thinking for how to enable
    this is that we add support for the `C-unwind` ABI on stable Rust first,
    and then after it hits stable we change the behavior of the `C` ABI.
    That way anyone straddling stable/beta/nightly can switch to `C-unwind`
    safely.
    alexcrichton committed Aug 3, 2021
    Configuration menu
    Copy the full SHA
    1c07096 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    30bc5a9 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    0168dfe View commit details
    Browse the repository at this point in the history
  4. Make simplify_cfg test more consistent

    Force it to always use panic=abort which means that all targets should
    produce the same MIR now.
    alexcrichton committed Aug 3, 2021
    Configuration menu
    Copy the full SHA
    fb939ed View commit details
    Browse the repository at this point in the history
  5. Relax a codegen test

    nounwind is no longer emitted but the test still passes
    alexcrichton committed Aug 3, 2021
    Configuration menu
    Copy the full SHA
    37c85ec View commit details
    Browse the repository at this point in the history

Commits on Aug 4, 2021

  1. Fix assertions in coverage-reports test

    Update some `C-unwind` bits and then
    alexcrichton committed Aug 4, 2021
    Configuration menu
    Copy the full SHA
    bb68c66 View commit details
    Browse the repository at this point in the history