1//===------------------------- cxa_handlers.cpp ---------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//
9// This file implements the functionality associated with the terminate_handler,
10//   unexpected_handler, and new_handler.
11//===----------------------------------------------------------------------===//
12
13#ifndef _CXA_HANDLERS_H
14#define _CXA_HANDLERS_H
15
16#include <exception>
17
18namespace std
19{
20
21__attribute__((visibility("hidden"), noreturn))
22void
23__unexpected(unexpected_handler func);
24
25__attribute__((visibility("hidden"), noreturn))
26void
27__terminate(terminate_handler func) _NOEXCEPT;
28
29}  // std
30
31extern "C"
32{
33
34extern void (*__cxa_terminate_handler)();
35extern void (*__cxa_unexpected_handler)();
36extern void (*__cxa_new_handler)();
37
38/*
39
40    At some point in the future these three symbols will become
41    C++11 atomic variables:
42
43    extern std::atomic<std::terminate_handler>  __cxa_terminate_handler;
44    extern std::atomic<std::unexpected_handler> __cxa_unexpected_handler;
45    extern std::atomic<std::new_handler>        __cxa_new_handler;
46
47    This change will not impact their ABI.  But it will allow for a
48    portable performance optimization.
49
50*/
51
52} // extern "C"
53
54#endif  // _CXA_HANDLERS_H
55