summaryrefslogtreecommitdiff
path: root/libunwind
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2023-04-05 10:42:22 +0000
committerMartin Storsjö <martin@martin.st>2023-04-11 00:00:30 +0300
commit66632e8798148b351ba2971a0a380a47352afc8d (patch)
tree6e97adf8bd5686eea650086cf83bf53240512f69 /libunwind
parent87ca04033c1bf79f4de964505dd8818cbbc2bdf4 (diff)
downloadllvm-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.cpp9
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;
}
}