blob: 2a16ad053125c6c0c4526734e49327d96857370c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
//===- c++-exception.h - C++ Specific exception Handling --------*- C++ -*-===//
//
// This file defines the data structures and API used by the C++ exception
// handling runtime library.
//
//===----------------------------------------------------------------------===//
#ifndef CXX_EXCEPTION_H
#define CXX_EXCEPTION_H
#include "exception.h"
#include <typeinfo>
#include <cassert>
struct llvm_cxx_exception {
// TypeInfo - A pointer to the C++ std::type_info object for this exception
// class. This is required because the class may not be polymorphic.
//
const std::type_info *TypeInfo;
// ExceptionObjectDestructor - A pointer to the function which destroys the
// object represented by this exception. This is required because the class
// may not be polymorphic. This may be null if there is no cleanup required.
//
void (*ExceptionObjectDestructor)(void *);
// UnexpectedHandler - This contains a pointer to the "unexpected" handler
// which may be registered by the user program with set_unexpected. Calls to
// unexpected which are a result of an exception throw are supposed to use the
// value of the handler at the time of the throw, not the currently set value.
//
void (*UnexpectedHandler)();
// TerminateHandler - This contains a pointer to the "terminate" handler which
// may be registered by the user program with set_terminate. Calls to
// unexpected which are a result of an exception throw are supposed to use the
// value of the handler at the time of the throw, not the currently set value.
//
void (*TerminateHandler)();
// BaseException - The language independent portion of the exception state.
// This is at the end of the record so that we can add additional members to
// this structure without breaking binary compatibility.
//
llvm_exception BaseException;
};
inline llvm_cxx_exception *get_cxx_exception(llvm_exception *E) throw() {
assert(E->ExceptionType == CXXException && "Not a C++ exception?");
return (llvm_cxx_exception*)(E+1)-1;
}
// Interface to the C++ standard library to get to the terminate and unexpected
// handler stuff.
namespace __cxxabiv1 {
// Invokes given handler, dying appropriately if the user handler was
// so inconsiderate as to return.
extern void __terminate(std::terminate_handler) __attribute__((noreturn));
extern void __unexpected(std::unexpected_handler) __attribute__((noreturn));
// The current installed user handlers.
extern std::terminate_handler __terminate_handler;
extern std::unexpected_handler __unexpected_handler;
}
extern "C" {
void *__llvm_cxxeh_allocate_exception(unsigned NumBytes) throw();
void __llvm_cxxeh_free_exception(void *ObjectPtr) throw();
void __llvm_cxxeh_throw(void *ObjectPtr, void *TypeInfoPtr,
void (*DtorPtr)(void*)) throw();
void __llvm_cxxeh_call_terminate() throw() __attribute__((noreturn));
void * __llvm_cxxeh_current_uncaught_exception_isa(void *Ty)
throw();
void *__llvm_cxxeh_begin_catch() throw();
void *__llvm_cxxeh_begin_catch_if_isa(void *CatchType) throw();
void __llvm_cxxeh_end_catch() /* might throw */;
void __llvm_cxxeh_rethrow() throw();
void __llvm_cxxeh_check_eh_spec(void *Info, ...);
}
#endif
|