[all-commits] [llvm/llvm-project] 4eabd0: [Windows SEH] Fix abnormal-exits in _try

Aaron Smith via All-commits all-commits at lists.llvm.org
Thu Apr 30 09:41:15 PDT 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 4eabd006125424f879a7129eca824998192d89a9
      https://github.com/llvm/llvm-project/commit/4eabd006125424f879a7129eca824998192d89a9
  Author: Aaron Smith <aaron.smith at microsoft.com>
  Date:   2020-04-30 (Thu, 30 Apr 2020)

  Changed paths:
    M clang/lib/CodeGen/CGCleanup.cpp
    M clang/lib/CodeGen/CGException.cpp
    M clang/lib/CodeGen/EHScopeStack.h
    A clang/test/CodeGen/windows-seh-abnormal-exits.c

  Log Message:
  -----------
  [Windows SEH] Fix abnormal-exits in _try

Summary:
Per Windows SEH Spec, except _leave, all other early exits of a _try (goto/return/continue/break) are considered abnormal exits.  In those cases, the first parameter passes to its _finally funclet should be TRUE to indicate an abnormal-termination.

One way to implement abnormal exits in _try is to invoke Windows runtime _local_unwind() (MSVC approach) that will invoke _dtor funclet where abnormal-termination flag is always TRUE when calling _finally.  Obviously this approach is less optimal and is complicated to implement in Clang.

Clang today has a NormalCleanupDestSlot mechanism to dispatch multiple exits at the end of _try.  Since  _leave (or try-end fall-through) is always Indexed with 0 in that NormalCleanupDestSlot,  this fix takes the advantage of that mechanism and just passes NormalCleanupDest ID as 1st Arg to _finally.

Reviewers: rnk, eli.friedman, JosephTremoulet, asmith, efriedma

Reviewed By: efriedma

Subscribers: efriedma, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D77936




More information about the All-commits mailing list