Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/system/lib/libcxxabi/src/cxa_handlers.cpp
6175 views
1
//===----------------------------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//
8
// This file implements the functionality associated with the terminate_handler,
9
// unexpected_handler, and new_handler.
10
//===----------------------------------------------------------------------===//
11
12
#include <stdexcept>
13
#include <new>
14
#include <exception>
15
#include "abort_message.h"
16
#include "cxxabi.h"
17
#include "cxa_handlers.h"
18
#include "cxa_exception.h"
19
#include "private_typeinfo.h"
20
#include "include/atomic_support.h" // from libc++
21
22
namespace std
23
{
24
25
unexpected_handler
26
get_unexpected() noexcept
27
{
28
return __libcpp_atomic_load(&__cxa_unexpected_handler, _AO_Acquire);
29
}
30
31
void
32
__unexpected(unexpected_handler func)
33
{
34
func();
35
// unexpected handler should not return
36
__abort_message("unexpected_handler unexpectedly returned");
37
}
38
39
__attribute__((noreturn))
40
void
41
unexpected()
42
{
43
__unexpected(get_unexpected());
44
}
45
46
terminate_handler
47
get_terminate() noexcept
48
{
49
return __libcpp_atomic_load(&__cxa_terminate_handler, _AO_Acquire);
50
}
51
52
void
53
__terminate(terminate_handler func) noexcept
54
{
55
#ifndef _LIBCXXABI_NO_EXCEPTIONS
56
try
57
{
58
#endif // _LIBCXXABI_NO_EXCEPTIONS
59
func();
60
// handler should not return
61
__abort_message("terminate_handler unexpectedly returned");
62
#ifndef _LIBCXXABI_NO_EXCEPTIONS
63
}
64
catch (...)
65
{
66
// handler should not throw exception
67
__abort_message("terminate_handler unexpectedly threw an exception");
68
}
69
#endif // _LIBCXXABI_NO_EXCEPTIONS
70
}
71
72
__attribute__((noreturn))
73
void
74
terminate() noexcept
75
{
76
#if !defined(_LIBCXXABI_NO_EXCEPTIONS) && !defined(__EMSCRIPTEN_EXCEPTIONS__)
77
// If there might be an uncaught exception
78
using namespace __cxxabiv1;
79
__cxa_eh_globals* globals = __cxa_get_globals_fast();
80
if (globals)
81
{
82
__cxa_exception* exception_header = globals->caughtExceptions;
83
if (exception_header)
84
{
85
_Unwind_Exception* unwind_exception =
86
reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;
87
if (__isOurExceptionClass(unwind_exception))
88
__terminate(exception_header->terminateHandler);
89
}
90
}
91
#endif
92
__terminate(get_terminate());
93
}
94
95
new_handler
96
get_new_handler() noexcept
97
{
98
return __libcpp_atomic_load(&__cxa_new_handler, _AO_Acquire);
99
}
100
101
} // std
102
103