diff options
author | Martin Storsjö <martin@martin.st> | 2023-04-05 10:42:22 +0000 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2023-04-11 00:00:30 +0300 |
commit | 66632e8798148b351ba2971a0a380a47352afc8d (patch) | |
tree | 6e97adf8bd5686eea650086cf83bf53240512f69 /libunwind | |
parent | 87ca04033c1bf79f4de964505dd8818cbbc2bdf4 (diff) | |
download | llvm-66632e8798148b351ba2971a0a380a47352afc8d.tar.gz |
[libunwind] [SEH] Handle ExceptionContinueExecution in forced unwinding
This fixes the libcxxabi test force_unwind3.pass.cpp when run on native
Windows.
When unwinding past the main thread function into the system functions
that brought up the thread, we can hit functions whose personality
functions return ExceptionContinueExecution (instead of the regular
ExceptionContinueSearch). Interpret this as a signal to stop the
unwind.
Curiously, in this case, it does return ExceptionContinueSearch if
running within a debugger.
Differential Revision: https://reviews.llvm.org/D147739
Diffstat (limited to 'libunwind')
-rw-r--r-- | libunwind/src/Unwind-seh.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/libunwind/src/Unwind-seh.cpp b/libunwind/src/Unwind-seh.cpp index 5c87975cffb3..150ba6453a22 100644 --- a/libunwind/src/Unwind-seh.cpp +++ b/libunwind/src/Unwind-seh.cpp @@ -217,6 +217,7 @@ __libunwind_seh_personality(int version, _Unwind_Action state, disp_ctx->ContextRecord, disp_ctx); switch (ms_act) { + case ExceptionContinueExecution: return _URC_END_OF_STACK; case ExceptionContinueSearch: return _URC_CONTINUE_UNWIND; case 4 /*ExceptionExecuteHandler*/: return phase2 ? _URC_INSTALL_CONTEXT : _URC_HANDLER_FOUND; @@ -304,6 +305,12 @@ unwind_phase2_forced(unw_context_t *uc, // We may get control back if landing pad calls _Unwind_Resume(). __unw_resume(&cursor2); break; + case _URC_END_OF_STACK: + _LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): " + "personality returned " + "_URC_END_OF_STACK", + (void *)exception_object); + break; default: // Personality routine returned an unknown result code. _LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): " @@ -312,6 +319,8 @@ unwind_phase2_forced(unw_context_t *uc, (void *)exception_object, personalityResult); return _URC_FATAL_PHASE2_ERROR; } + if (personalityResult == _URC_END_OF_STACK) + break; } } |