]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Makefile.in (LIB2FUNCS): Remove C++ memory management support.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 20 Nov 1997 23:21:26 +0000 (23:21 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 20 Nov 1997 23:21:26 +0000 (18:21 -0500)
./: * Makefile.in (LIB2FUNCS): Remove C++ memory management support.
* libgcc2.c: Remove __builtin_new, __builtin_vec_new, set_new_handler,
__builtin_delete, and __builtin_vec_delete.

* except.c (output_exception_table): Don't bother with
  __EXCEPTION_END__.

cp/:
* Make-lang.in (CXX_LIB2FUNCS): Add new op new and op delete objs.
(various.o): Likewise.
* inc/new: Add placement deletes.  Add throw specs for default new.
* new.cc (set_new_handler): Move here from libgcc2.
* new1.cc (new (nothrow)): Catch a bad_alloc thrown from the handler.
(new): Move from libgcc2.  Throw bad_alloc.
* new2.cc: Move the rest of the op news and op deletes from libgcc2.
* decl.c (init_decl_processing): Update exception specs on new and
delete.

From-SVN: r16619

gcc/ChangeLog
gcc/Makefile.in
gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/decl.c
gcc/cp/inc/new
gcc/cp/new.cc
gcc/cp/new1.cc
gcc/cp/new2.cc
gcc/except.c
gcc/libgcc2.c

index 0d87bcfa161a092ef3149b36ac78838ca8ad9fc5..dc54a6c8e2407025703643e214a7ef69805b062e 100644 (file)
@@ -1,3 +1,12 @@
+Thu Nov 20 14:42:15 1997  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * Makefile.in (LIB2FUNCS): Remove C++ memory management support.
+       * libgcc2.c: Remove __builtin_new, __builtin_vec_new, set_new_handler, 
+       __builtin_delete, and __builtin_vec_delete.
+
+       * except.c (output_exception_table): Don't bother with
+       __EXCEPTION_END__.
+
 Thu Nov 20 16:11:50 1997  Jeffrey A Law  (law@cygnus.com)
 
        * pa.md (pre_stwm, post_stwm, pre_ldwm, post_ldwm): Base register
index b02f0c6ec0761f284ae18bb9a4b82ba675d13ef2..3779ae2e63626296fa94086a50f8ee88a7c3b5fd 100644 (file)
@@ -631,8 +631,8 @@ LIB2FUNCS = _muldi3 _divdi3 _moddi3 _udivdi3 _umoddi3 _negdi2 \
     _fixunsdfsi _fixunssfsi _fixunsdfdi _fixdfdi _fixunssfdi _fixsfdi \
     _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
     _fixtfdi _fixunstfdi _floatditf \
-    __gcc_bcmp _varargs __dummy _eprintf _op_new _op_vnew _new_handler \
-    _op_delete _op_vdel _bb _shtab _clear_cache _trampoline __main _exit \
+    __gcc_bcmp _varargs __dummy _eprintf \
+    _bb _shtab _clear_cache _trampoline __main _exit \
     _ctors _eh  _pure
 
 # The files that "belong" in CONFIG_H are deliberately omitted
index 99f18d1f8777c8e76f1edac44354e4eba22525a9..74d70fbbcd76a667beb46144ebff8bc0091d8f69 100644 (file)
@@ -1,5 +1,15 @@
 Thu Nov 20 14:40:17 1997  Jason Merrill  <jason@yorick.cygnus.com>
 
+       * Make-lang.in (CXX_LIB2FUNCS): Add new op new and op delete objs.
+       (various.o): Likewise.
+       * inc/new: Add placement deletes.  Add throw specs for default new.
+       * new.cc (set_new_handler): Move here from libgcc2.
+       * new1.cc (new (nothrow)): Catch a bad_alloc thrown from the handler.
+       (new): Move from libgcc2.  Throw bad_alloc.
+       * new2.cc: Move the rest of the op news and op deletes from libgcc2.
+       * decl.c (init_decl_processing): Update exception specs on new and
+       delete.
+
        * method.c (build_decl_overload_real): Don't mess with global 
        placement delete.
 
index 903faffc2aceb6cbce6b352abbe04c3befafc1fc..fa0f1dd628937bd8b7cc5fb0f36f0c9941652936 100644 (file)
@@ -58,7 +58,8 @@ CXX_EXTRA_HEADERS = $(srcdir)/cp/inc/typeinfo $(srcdir)/cp/inc/exception \
        $(srcdir)/cp/inc/new $(srcdir)/cp/inc/new.h
 
 # Extra code to include in libgcc2.
-CXX_LIB2FUNCS = tinfo.o tinfo2.o new.o new1.o new2.o exception.o
+CXX_LIB2FUNCS = tinfo.o tinfo2.o new.o opnew.o opnewnt.o opvnew.o opvnewnt.o \
+       opdel.o opdelnt.o opvdel.o opvdelnt.o exception.o
 CXX_LIB2SRCS = $(srcdir)/cp/new.cc $(srcdir)/cp/new1.cc $(srcdir)/cp/new2.cc \
        $(srcdir)/cp/exception.cc $(srcdir)/cp/tinfo.cc \
        $(srcdir)/cp/tinfo2.cc $(srcdir)/cp/tinfo.h
@@ -147,12 +148,30 @@ exception.o: cc1plus $(srcdir)/cp/exception.cc
 new.o: cc1plus $(srcdir)/cp/new.cc
        $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
          -c $(srcdir)/cp/new.cc
-new1.o: cc1plus $(srcdir)/cp/new1.cc
+opnew.o: cc1plus $(srcdir)/cp/new1.cc
        $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
-         -c $(srcdir)/cp/new1.cc
-new2.o: cc1plus $(srcdir)/cp/new2.cc
+         -c $(srcdir)/cp/new1.cc -DL_op_new -o opnew.o
+opnewnt.o: cc1plus $(srcdir)/cp/new1.cc
        $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
-         -c $(srcdir)/cp/new2.cc
+         -c $(srcdir)/cp/new1.cc -DL_op_newnt -o opnewnt.o
+opvnew.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_vnew -o opvnew.o
+opvnewnt.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_vnewnt -o opvnewnt.o
+opdel.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_delete -o opdel.o
+opdelnt.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_delnt -o opdelnt.o
+opvdel.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_vdel -o opvdel.o
+opvdelnt.o: cc1plus $(srcdir)/cp/new2.cc
+       $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) \
+         -c $(srcdir)/cp/new2.cc -DL_op_vdelnt -o opvdelnt.o
 
 # We want to update cplib2.txt if any of the source files change...
 cplib2.txt: $(CXX_LIB2SRCS) $(CXX_EXTRA_HEADERS) cplib2.ready
index b60f842fa43b8bcc9939368a9c16e18b212b5615..233153ba997266970e04ce140fda031ebf715666 100644 (file)
@@ -5577,14 +5577,18 @@ init_decl_processing ()
   /* Now, C++.  */
   current_lang_name = lang_name_cplusplus;
 
-  auto_function (ansi_opname[(int) NEW_EXPR], ptr_ftype_sizetype,
-                NOT_BUILT_IN);
-  auto_function (ansi_opname[(int) VEC_NEW_EXPR], ptr_ftype_sizetype,
-                NOT_BUILT_IN);
-  auto_function (ansi_opname[(int) DELETE_EXPR], void_ftype_ptr,
-                NOT_BUILT_IN);
-  auto_function (ansi_opname[(int) VEC_DELETE_EXPR], void_ftype_ptr,
-                NOT_BUILT_IN);
+  {
+    tree bad_alloc_type_node = xref_tag
+      (class_type_node, get_identifier ("bad_alloc"), NULL_TREE, 1);
+    tree newtype = build_exception_variant
+      (ptr_ftype_sizetype, build_tree_list (NULL_TREE, bad_alloc_type_node));
+    tree deltype = build_exception_variant
+      (void_ftype_ptr, build_tree_list (NULL_TREE, NULL_TREE));
+    auto_function (ansi_opname[(int) NEW_EXPR], newtype, NOT_BUILT_IN);
+    auto_function (ansi_opname[(int) VEC_NEW_EXPR], newtype, NOT_BUILT_IN);
+    auto_function (ansi_opname[(int) DELETE_EXPR], deltype, NOT_BUILT_IN);
+    auto_function (ansi_opname[(int) VEC_DELETE_EXPR], deltype, NOT_BUILT_IN);
+  }
 
   abort_fndecl
     = define_function ("__pure_virtual", void_ftype,
index f4b0b975cdbbd4899caeda4e1212db1e267fae38..23fe6eb9e6bb796fbbbb218b5e3f1c00ca6ed0dd 100644 (file)
@@ -22,23 +22,21 @@ namespace std {
   struct nothrow_t {};
   extern const nothrow_t nothrow;
   typedef void (*new_handler)();
-  extern "C" new_handler set_new_handler (new_handler);
+  new_handler set_new_handler (new_handler);
 
 #if 0
 } // namespace std
 #endif
 
-// G++ implementation internals
-extern new_handler __new_handler;
-extern "C" void __default_new_handler (void);
-
 // replaceable signatures
-void *operator new (size_t);
-void *operator new (size_t, const nothrow_t&) throw();
-void *operator new[] (size_t);
-void *operator new[] (size_t, const nothrow_t&) throw();
+void *operator new (size_t) throw (std::bad_alloc);
+void *operator new[] (size_t) throw (std::bad_alloc);
 void operator delete (void *) throw();
 void operator delete[] (void *) throw();
+void *operator new (size_t, const nothrow_t&) throw();
+void *operator new[] (size_t, const nothrow_t&) throw();
+void operator delete (void *, const nothrow_t&) throw();
+void operator delete[] (void *, const nothrow_t&) throw();
 
 // default placement versions of operator new
 inline void *operator new(size_t, void *place) throw() { return place; }
index 0db3497f1fa2b6681a8a5b40ba076984cac9144a..33cf190108cb9ec3c5bd9f4cb648dff08c0c003d 100644 (file)
 #include "new"
 
 const nothrow_t nothrow = { };
+
+new_handler __new_handler;
+
+new_handler
+set_new_handler (new_handler handler)
+{
+  new_handler prev_handler = __new_handler;
+  __new_handler = handler;
+  return prev_handler;
+}
index 0ee111d293953f397a6071f964a209bd9923cfb8..98c2a4a955e200f07fc6bbd21a5c46c9c7658fc0 100644 (file)
@@ -1,4 +1,4 @@
-// Support routine for the -*- C++ -*- dynamic memory management.
+// Support routines for the -*- C++ -*- dynamic memory management.
 // Copyright (C) 1997 Free Software Foundation
 
 // This file is part of GNU CC.
 #include "new"
 
 extern "C" void *malloc (size_t);
+extern new_handler __new_handler;
 
-typedef void (*vfp)(void);
-extern vfp __new_handler;
-extern void __default_new_handler (void);
+#define WEAK(x) \
+  x __attribute__ ((weak)); \
+  x
 
-void *operator new (size_t sz, const nothrow_t&) throw()
+#ifdef L_op_newnt
+WEAK (void * operator new (size_t sz, const nothrow_t&) throw())
 {
   void *p;
-  vfp handler = __new_handler;
 
   /* malloc (0) is unpredictable; avoid it.  */
   if (sz == 0)
@@ -44,11 +45,43 @@ void *operator new (size_t sz, const nothrow_t&) throw()
   p = (void *) malloc (sz);
   while (p == 0)
     {
+      new_handler handler = __new_handler;
       if (! handler)
        return 0;
-      (*handler) ();
+      try
+       {
+         handler ();
+       }
+      catch (bad_alloc &)
+       {
+         return 0;
+       }
+
+      p = (void *) malloc (sz);
+    }
+
+  return p;
+}
+#endif
+
+#ifdef L_op_new
+WEAK (void * operator new (size_t sz) throw (std::bad_alloc))
+{
+  void *p;
+
+  /* malloc (0) is unpredictable; avoid it.  */
+  if (sz == 0)
+    sz = 1;
+  p = (void *) malloc (sz);
+  while (p == 0)
+    {
+      new_handler handler = __new_handler;
+      if (! handler)
+       throw bad_alloc ();
+      handler ();
       p = (void *) malloc (sz);
     }
-  
+
   return p;
 }
+#endif
index 5aca49d21d1160c16808faf531eafff683299bd5..d5320f99502c5b1b4d08bb9a7f5fe9298d55c392 100644 (file)
@@ -1,4 +1,4 @@
-// Support routine for the -*- C++ -*- dynamic memory management.
+// Boilerplate support routines for -*- C++ -*- dynamic memory management.
 // Copyright (C) 1997 Free Software Foundation
 
 // This file is part of GNU CC.
 
 #include "new"
 
-void *operator new[] (size_t sz, const nothrow_t& nothrow) throw()
+extern "C" void free (void *);
+
+#define WEAK(x) \
+  x __attribute__ ((weak)); \
+  x
+
+#ifdef L_op_vnew
+WEAK(void * operator new[] (size_t sz) throw (std::bad_alloc))
+{
+  return ::operator new(sz);
+}
+#endif
+
+#ifdef L_op_vnewnt
+WEAK(void *operator new[] (size_t sz, const nothrow_t& nothrow) throw())
 {
   return ::operator new(sz, nothrow);
 }
+#endif
+
+#ifdef L_op_delete
+WEAK (void operator delete (void *ptr) throw ())
+{
+  if (ptr)
+    free (ptr);
+}
+#endif
+
+#ifdef L_op_vdel
+WEAK (void operator delete[] (void *ptr) throw ())
+{
+  if (ptr)
+    free (ptr);
+}
+#endif
+
+#ifdef L_op_delnt
+WEAK (void operator delete (void *ptr, const std::nothrow_t&) throw ())
+{
+  if (ptr)
+    free (ptr);
+}
+#endif
+
+#ifdef L_op_vdelnt
+WEAK (void operator delete[] (void *ptr, const std::nothrow_t&) throw ())
+{
+  if (ptr)
+    free (ptr);
+}
+#endif
index d0496690174ef93e77b40602d6b0849f5b3c3ce6..3892f964d0880372ed49186db088953ae13f4838 100644 (file)
@@ -1573,7 +1573,6 @@ output_exception_table ()
   free (eh_table);
 
   /* Ending marker for table.  */
-  assemble_label ("__EXCEPTION_END__");
   assemble_integer (constm1_rtx, POINTER_SIZE / BITS_PER_UNIT, 1);
   assemble_integer (constm1_rtx, POINTER_SIZE / BITS_PER_UNIT, 1);
   assemble_integer (constm1_rtx, POINTER_SIZE / BITS_PER_UNIT, 1);
index 6c34da7acf5284c6ef086edf83b204e93dec2514..7fec5cdd45edd924d3d718f056d1f8cd9b2891b9 100644 (file)
@@ -42,10 +42,6 @@ Boston, MA 02111-1307, USA.  */
 #undef abort
 #endif
 
-#if (SUPPORTS_WEAK == 1) && (defined (ASM_OUTPUT_DEF) || defined (ASM_OUTPUT_WEAK_ALIAS))
-#define WEAK_ALIAS
-#endif
-
 /* Permit the tm.h file to select the endianness to use just for this
    file.  This is used when the endianness is determined when the
    compiler is run.  */
@@ -2436,157 +2432,6 @@ stack_overflow:;
 #endif /* not BLOCK_PROFILER_CODE */
 #endif /* L_bb */
 \f
-/* Default free-store management functions for C++, per sections 12.5 and
-   17.3.3 of the Working Paper.  */
-
-#ifdef L_op_new
-/* operator new (size_t), described in 17.3.3.5.  This function is used by
-   C++ programs to allocate a block of memory to hold a single object.  */
-
-typedef void (*vfp)(void);
-extern vfp __new_handler;
-extern void __default_new_handler (void);
-
-#ifdef WEAK_ALIAS
-void * __builtin_new (size_t sz)
-     __attribute__ ((weak, alias ("___builtin_new")));
-void *
-___builtin_new (size_t sz)
-#else
-void *
-__builtin_new (size_t sz)
-#endif
-{
-  void *p;
-  vfp handler = (__new_handler) ? __new_handler : __default_new_handler;
-
-  /* malloc (0) is unpredictable; avoid it.  */
-  if (sz == 0)
-    sz = 1;
-  p = (void *) malloc (sz);
-  while (p == 0)
-    {
-      (*handler) ();
-      p = (void *) malloc (sz);
-    }
-  
-  return p;
-}
-#endif /* L_op_new */
-
-#ifdef L_op_vnew
-/* void * operator new [] (size_t), described in 17.3.3.6.  This function
-   is used by C++ programs to allocate a block of memory for an array.  */
-
-extern void * __builtin_new (size_t);
-
-#ifdef WEAK_ALIAS
-void * __builtin_vec_new (size_t sz)
-     __attribute__ ((weak, alias ("___builtin_vec_new")));
-void *
-___builtin_vec_new (size_t sz)
-#else
-void *
-__builtin_vec_new (size_t sz)
-#endif
-{
-  return __builtin_new (sz);
-}
-#endif /* L_op_vnew */
-
-#ifdef L_new_handler
-/* set_new_handler (fvoid_t *) and the default new handler, described in
-   17.3.3.2 and 17.3.3.5.  These functions define the result of a failure
-   to allocate the amount of memory requested from operator new or new [].  */
-
-#ifndef inhibit_libc
-/* This gets us __GNU_LIBRARY__.  */
-#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch.  */
-#include <stdio.h>
-
-#ifdef __GNU_LIBRARY__
-  /* Avoid forcing the library's meaning of `write' on the user program
-     by using the "internal" name (for use within the library)  */
-#define write(fd, buf, n)      __write((fd), (buf), (n))
-#endif
-#endif /* inhibit_libc */
-
-typedef void (*vfp)(void);
-void __default_new_handler (void);
-
-vfp __new_handler = (vfp) 0;
-
-vfp
-set_new_handler (vfp handler)
-{
-  vfp prev_handler;
-
-  prev_handler = __new_handler;
-  if (handler == 0) handler = __default_new_handler;
-  __new_handler = handler;
-  return prev_handler;
-}
-
-#define MESSAGE "Virtual memory exceeded in `new'\n"
-
-void
-__default_new_handler ()
-{
-#ifndef inhibit_libc
-  /* don't use fprintf (stderr, ...) because it may need to call malloc.  */
-  /* This should really print the name of the program, but that is hard to
-     do.  We need a standard, clean way to get at the name.  */
-  write (2, MESSAGE, sizeof (MESSAGE));
-#endif
-  /* don't call exit () because that may call global destructors which
-     may cause a loop.  */
-  _exit (-1);
-}
-#endif
-
-#ifdef L_op_delete
-/* operator delete (void *), described in 17.3.3.3.  This function is used
-   by C++ programs to return to the free store a block of memory allocated
-   as a single object.  */
-
-#ifdef WEAK_ALIAS
-void __builtin_delete (void *ptr)
-     __attribute__ ((weak, alias ("___builtin_delete")));
-void
-___builtin_delete (void *ptr)
-#else
-void
-__builtin_delete (void *ptr)
-#endif
-{
-  if (ptr)
-    free (ptr);
-}
-#endif
-
-#ifdef L_op_vdel
-/* operator delete [] (void *), described in 17.3.3.4.  This function is
-   used by C++ programs to return to the free store a block of memory
-   allocated as an array.  */
-
-extern void __builtin_delete (void *);
-
-#ifdef WEAK_ALIAS
-void __builtin_vec_delete (void *ptr)
-     __attribute__ ((weak, alias ("___builtin_vec_delete")));
-void
-___builtin_vec_delete (void *ptr)
-#else
-void
-__builtin_vec_delete (void *ptr)
-#endif
-{
-  __builtin_delete (ptr);
-}
-#endif
-
-/* End of C++ free-store management functions */
-\f
 #ifdef L_shtab
 unsigned int __shtab[] = {
     0x00000001, 0x00000002, 0x00000004, 0x00000008,