diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-08-30 23:17:51 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-08-30 23:17:51 +0000 |
| commit | 8d907494b41cb667c4e171cbf185e3235a6a2c30 (patch) | |
| tree | 2fd659ae2c1567855430562da956ecefc8037484 /llvm/runtime/GCCLibraries/libexception/Exception.cpp | |
| parent | b14d0b0f3b69e8edff6f1c39e5e42ba13cbe1b3f (diff) | |
| download | bcm5719-llvm-8d907494b41cb667c4e171cbf185e3235a6a2c30.tar.gz bcm5719-llvm-8d907494b41cb667c4e171cbf185e3235a6a2c30.zip | |
Move language independent exception handling routines OUT of C++Exception.cpp
llvm-svn: 8232
Diffstat (limited to 'llvm/runtime/GCCLibraries/libexception/Exception.cpp')
| -rw-r--r-- | llvm/runtime/GCCLibraries/libexception/Exception.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/llvm/runtime/GCCLibraries/libexception/Exception.cpp b/llvm/runtime/GCCLibraries/libexception/Exception.cpp new file mode 100644 index 00000000000..156b714cb1a --- /dev/null +++ b/llvm/runtime/GCCLibraries/libexception/Exception.cpp @@ -0,0 +1,57 @@ +//===- Exception.cpp - Generic language-independent exceptions ------------===// +// +// This file defines the the shared data structures used by all language +// specific exception handling runtime libraries. +// +//===----------------------------------------------------------------------===// + +#include "Exception.h" +#include <cassert> + +// Thread local state for exception handling. FIXME: This should really be made +// thread-local! + +// UncaughtExceptionStack - The stack of exceptions currently being thrown. +static llvm_exception *UncaughtExceptionStack = 0; + +// __llvm_eh_has_uncaught_exception - This is used to implement +// std::uncaught_exception. +// +bool __llvm_eh_has_uncaught_exception() throw() { + return UncaughtExceptionStack != 0; +} + +// __llvm_eh_current_uncaught_exception - This function checks to see if the +// current uncaught exception is of the specified language type. If so, it +// returns a pointer to the exception area data. +// +void *__llvm_eh_current_uncaught_exception_type(unsigned HandlerType) throw() { + assert(UncaughtExceptionStack && "No uncaught exception!"); + if (UncaughtExceptionStack->ExceptionType == HandlerType) + return UncaughtExceptionStack+1; + return 0; +} + +// __llvm_eh_add_uncaught_exception - This adds the specified exception to the +// top of the uncaught exception stack. The exception should not already be on +// the stack! +void __llvm_eh_add_uncaught_exception(llvm_exception *E) throw() { + E->Next = UncaughtExceptionStack; + UncaughtExceptionStack = E; +} + + +// __llvm_eh_get_uncaught_exception - Returns the current uncaught exception. +// There must be an uncaught exception for this to work! +llvm_exception *__llvm_eh_get_uncaught_exception() throw() { + assert(UncaughtExceptionStack && "There are no uncaught exceptions!?!?"); + return UncaughtExceptionStack; +} + +// __llvm_eh_pop_from_uncaught_stack - Remove the current uncaught exception +// from the top of the stack. +llvm_exception *__llvm_eh_pop_from_uncaught_stack() throw() { + llvm_exception *E = __llvm_eh_get_uncaught_exception(); + UncaughtExceptionStack = E->Next; + return E; +} |

