1e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//===------------------------- cxa_handlers.cpp ---------------------------===//
2e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//
3e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//                     The LLVM Compiler Infrastructure
4e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//
5e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//
8e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//
9e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant// This file implements the functionality associated with the terminate_handler,
10e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//   unexpected_handler, and new_handler.
11e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant//===----------------------------------------------------------------------===//
12e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant
130f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant#ifndef _CXA_HANDLERS_H
140f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant#define _CXA_HANDLERS_H
150f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant
16e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant#include <exception>
17e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant
18e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnantnamespace std
19e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant{
20e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant
213f034b77daeb3d7ab5a0c5167b2ffece7c9cbd28Howard Hinnant__attribute__((visibility("hidden"), noreturn))
22e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnantvoid
23e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant__unexpected(unexpected_handler func);
24e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant
253f034b77daeb3d7ab5a0c5167b2ffece7c9cbd28Howard Hinnant__attribute__((visibility("hidden"), noreturn))
26e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnantvoid
27e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant__terminate(terminate_handler func) _NOEXCEPT;
28e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant
29e8fcf83b576ff70ba5886fbd73434218a68ac414Howard Hinnant}  // std
300f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant
310f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnantextern "C"
320f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant{
330f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant
340f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnantextern void (*__cxa_terminate_handler)();
350f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnantextern void (*__cxa_unexpected_handler)();
360f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnantextern void (*__cxa_new_handler)();
370f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant
384cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant/*
394cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant
404cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    At some point in the future these three symbols will become
414cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    C++11 atomic variables:
424cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant
434cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    extern std::atomic<std::terminate_handler>  __cxa_terminate_handler;
444cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    extern std::atomic<std::unexpected_handler> __cxa_unexpected_handler;
454cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    extern std::atomic<std::new_handler>        __cxa_new_handler;
464cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant
474cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant    This change will not impact their ABI.  But it will allow for a
486d00feffc82d4f8c0201242291a0e93b492e1dd4Howard Hinnant    portable performance optimization.
494cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant
504cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant*/
514cfb63f07516ceff10be81c7dfac6c18122df782Howard Hinnant
520f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant} // extern "C"
530f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant
540f80bb79c0181c706cf6acce44f854e96ecaf755Howard Hinnant#endif  // _CXA_HANDLERS_H
55