[all-commits] [llvm/llvm-project] 0991d7: [libunwind] Fix building with EXCEPTION_DISPOSITIO...

Martin Storsjö via All-commits all-commits at lists.llvm.org
Wed Feb 11 14:31:30 PST 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 0991d7b8fd01546aaf537a6238227100570f8236
      https://github.com/llvm/llvm-project/commit/0991d7b8fd01546aaf537a6238227100570f8236
  Author: Martin Storsjö <martin at martin.st>
  Date:   2026-02-12 (Thu, 12 Feb 2026)

  Changed paths:
    M libunwind/src/Unwind-seh.cpp

  Log Message:
  -----------
  [libunwind] Fix building with EXCEPTION_DISPOSITION as enum (#180513)

On Windows, libunwind is normally only built in mingw mode; it's not
relevant for MSVC targets. (Attempting to build it is entirely blocked
in CMake, see [1]).

In mingw headers, the type EXCEPTION_DISPOSITION is defined as an int
while it is an enum in the MSVC vcruntime headers.

However, in addition to the canonical enum members, we also use a value
which has no assigned enum member. In older mingw-w64 headers, there was
a define for this value, 4, with the name ExceptionExecuteHandler, but
that was removed in [2]. The libunwind code reference this value just by
the literal value 4, with a comment referencing it as
ExceptionExecuteHandler.

This extra enum value isn't passed to the outside Microsoft runtime, but
is only used to pass values from one part of libunwind to another; this
handling is necessary for the forced_unwind{1-3}.pass.cpp tests to
succeed.

If the mingw-w64 headers would define EXCEPTION_DISPOSITION as an enum,
just like the MSVC vcruntime headers, then we'd run into build errors
and warnings like this:

    llvm-project/libunwind/src/Unwind-seh.cpp:166:14: error: cannot initialize return object of type 'EXCEPTION_DISPOSITION' (aka 'enum _EXCEPTION_DISPOSITION') with an rvalue of type 'int'
          166 |       return 4 /* ExceptionExecuteHandler in mingw */;
              |              ^
    llvm-project/libunwind/src/Unwind-seh.cpp:185:14: error: cannot initialize return object of type 'EXCEPTION_DISPOSITION' (aka 'enum _EXCEPTION_DISPOSITION') with an rvalue of type 'int'
          185 |       return 4 /* ExceptionExecuteHandler in mingw */;
              |              ^
    llvm-project/libunwind/src/Unwind-seh.cpp:272:8: warning: case value not in enumerated type 'EXCEPTION_DISPOSITION' (aka 'enum _EXCEPTION_DISPOSITION') [-Wswitch]
          272 |   case 4 /*ExceptionExecuteHandler*/:
              |        ^

Fix these cases by adding explicit casts between EXCEPTION_DISPOSITION
and int.

A (partial) similar change was proposed in [3], but the author never
followed up on the discussion, and the PR was later closed.

[1] b0b546d44777eb1fa25995384876bd14a006a929
[2] https://github.com/mingw-w64/mingw-w64/commit/2de6703961c0d519046b841f7b392a040e1e5b55
[3] https://github.com/llvm/llvm-project/pull/159293



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list