summaryrefslogtreecommitdiff
path: root/runtime/GCCLibraries/crtend/Exception.h
blob: dc4d3a5f2cedafc4a72640a67bfa274a4db0f42b (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
//===- Exception.h - Generic language-independent exceptions ----*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the the shared data structures used by all language
// specific exception handling runtime libraries.
//
// NOTE NOTE NOTE: A copy of this file lives in llvmgcc/libstdc++-v3/libsupc++/
// Any modifications to this file must keep it in sync!
//
//===----------------------------------------------------------------------===//

#ifndef EXCEPTION_H
#define EXCEPTION_H

struct llvm_exception {
  // ExceptionDestructor - This call-back function is used to destroy the
  // current exception, without requiring the caller to know what the concrete
  // exception type is.
  //
  void (*ExceptionDestructor)(llvm_exception *);

  // ExceptionType - This field identifies what runtime library this exception
  // came from.  Currently defined values are:
  //     0 - Error
  //     1 - longjmp exception (see longjmp-exception.c)
  //     2 - C++ exception (see c++-exception.c)
  //
  unsigned ExceptionType;

  // Next - This points to the next exception in the current stack.
  llvm_exception *Next;

  // HandlerCount - This is a count of the number of handlers which have
  // currently caught this exception.  If the handler is caught and this number
  // falls to zero, the exception is destroyed.
  //
  unsigned HandlerCount;

  // isRethrown - This field is set on an exception if it has been 'throw;'n.
  // This is needed because the exception might exit through a number of the
  // end_catch statements matching the number of begin_catch statements that
  // have been processed.  When this happens, the exception should become
  // uncaught, not dead.
  //
  int isRethrown;
};

enum {
  ErrorException = 0,
  SJLJException  = 1,
  CXXException   = 2
};

// Language independent exception handling API...
//
extern "C" {
  bool __llvm_eh_has_uncaught_exception() throw();
  void *__llvm_eh_current_uncaught_exception_type(unsigned HandlerType) throw();
  void __llvm_eh_add_uncaught_exception(llvm_exception *E) throw();

  llvm_exception *__llvm_eh_get_uncaught_exception() throw();
  llvm_exception *__llvm_eh_pop_from_uncaught_stack() throw();
}

#endif