Be more type-safe, add throw specs to all functions
authorChris Lattner <sabre@nondot.org>
Wed, 27 Aug 2003 22:59:15 +0000 (22:59 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 27 Aug 2003 22:59:15 +0000 (22:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8168 91177308-0d34-0410-b5e6-96231b3b80d8

runtime/GCCLibraries/crtend/C++-Exception.h
runtime/GCCLibraries/libexception/C++-Exception.h

index 6ff384e84d0771a94731f60a77e6e9ce9e0e8748..81a7639d95236aa89a02ebf0a157178e82c5ab78 100644 (file)
@@ -29,14 +29,14 @@ struct llvm_cxx_exception {
    * 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;
+  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;
+  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
@@ -45,23 +45,37 @@ struct llvm_cxx_exception {
   llvm_exception BaseException;
 };
 
-inline llvm_cxx_exception *get_cxx_exception(llvm_exception *E) {
+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;
 }
 
-extern "C" {
-  void *__llvm_cxxeh_allocate_exception(unsigned NumBytes);
-  void __llvm_cxxeh_free_exception(void *ObjectPtr);
-  void __llvm_cxxeh_throw(void *ObjectPtr, const std::type_info *TypeInfoPtr,
-                          void (*DtorPtr)(void*));
+// 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;
+}
 
-  void * __llvm_cxxeh_current_uncaught_exception_isa(const std::type_info *Ty);
-  void *__llvm_cxxeh_begin_catch(void);
-  void *__llvm_cxxeh_begin_catch_if_isa(const std::type_info *CatchType);
-  void __llvm_cxxeh_end_catch(void);
+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_rethrow(void);
+  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
index 6ff384e84d0771a94731f60a77e6e9ce9e0e8748..81a7639d95236aa89a02ebf0a157178e82c5ab78 100644 (file)
@@ -29,14 +29,14 @@ struct llvm_cxx_exception {
    * 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;
+  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;
+  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
@@ -45,23 +45,37 @@ struct llvm_cxx_exception {
   llvm_exception BaseException;
 };
 
-inline llvm_cxx_exception *get_cxx_exception(llvm_exception *E) {
+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;
 }
 
-extern "C" {
-  void *__llvm_cxxeh_allocate_exception(unsigned NumBytes);
-  void __llvm_cxxeh_free_exception(void *ObjectPtr);
-  void __llvm_cxxeh_throw(void *ObjectPtr, const std::type_info *TypeInfoPtr,
-                          void (*DtorPtr)(void*));
+// 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;
+}
 
-  void * __llvm_cxxeh_current_uncaught_exception_isa(const std::type_info *Ty);
-  void *__llvm_cxxeh_begin_catch(void);
-  void *__llvm_cxxeh_begin_catch_if_isa(const std::type_info *CatchType);
-  void __llvm_cxxeh_end_catch(void);
+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_rethrow(void);
+  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