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 | 7f45519784671a552b7dfd0fe36d4b8918a60ca9 (patch) | |
tree | 62fc6926c283d7513b5a19d6360ee50a056f5a14 /runtime/GCCLibraries/libexception/Exception.cpp | |
parent | e86159df9de144f935bbbc05347b3b296594b9fc (diff) |
Move language independent exception handling routines OUT of C++Exception.cpp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8232 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime/GCCLibraries/libexception/Exception.cpp')
-rw-r--r-- | runtime/GCCLibraries/libexception/Exception.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/runtime/GCCLibraries/libexception/Exception.cpp b/runtime/GCCLibraries/libexception/Exception.cpp new file mode 100644 index 0000000000..156b714cb1 --- /dev/null +++ b/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; +} |