aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1994-04-13 01:18:43 +0000
committerJason Merrill <merrill@gnu.org>1994-04-13 01:18:43 +0000
commit6ffe3a32247f5be7c6c90ddeaa98911a309f6edb (patch)
treebeda28bf5119eaaf7f5f197aebafba5a846bb2ae
parent4c657af546aadee5c1d29af64fb1502a7183e7e0 (diff)
downloadgcc-6ffe3a32247f5be7c6c90ddeaa98911a309f6edb.zip
gcc-6ffe3a32247f5be7c6c90ddeaa98911a309f6edb.tar.gz
gcc-6ffe3a32247f5be7c6c90ddeaa98911a309f6edb.tar.bz2
libgcc2.c (__builtin_vec_{delete,new}): New functions per the latest C++ working paper.
* libgcc2.c (__builtin_vec_{delete,new}): New functions per the latest C++ working paper. (__default_new_handler): No longer static. (__set_new_handler): Lose. From-SVN: r7043
-rw-r--r--gcc/libgcc2.c61
1 files changed, 44 insertions, 17 deletions
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index e46105b..c25d5fb 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -1560,14 +1560,16 @@ __bb_init_func (struct bb *blocks)
#endif /* not BLOCK_PROFILER_CODE */
#endif /* L_bb */
-/* frills for C++ */
+/* Default free-store management functions for C++, per sections 12.5 and
+ 17.3.3 of the Working Paper. */
#ifdef L_op_new
-typedef void (*vfp)(void);
+/* 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;
-/* void * operator new (size_t sz) */
void *
__builtin_new (size_t sz)
{
@@ -1587,7 +1589,23 @@ __builtin_new (size_t sz)
}
#endif /* L_op_new */
+#ifdef L_op_vec_new
+/* 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);
+
+void *
+__builtin_vec_new (size_t sz)
+{
+ return __builtin_new (sz);
+}
+#endif /* L_op_vec_new */
+
#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__. */
@@ -1602,15 +1620,12 @@ __builtin_new (size_t sz)
#endif /* inhibit_libc */
typedef void (*vfp)(void);
-
-extern void *__builtin_new (size_t);
-static void __default_new_handler (void);
+void __default_new_handler (void);
vfp __new_handler = __default_new_handler;
vfp
-__set_new_handler (handler)
- vfp handler;
+set_new_handler (vfp handler)
{
vfp prev_handler;
@@ -1620,16 +1635,9 @@ __set_new_handler (handler)
return prev_handler;
}
-vfp
-set_new_handler (handler)
- vfp handler;
-{
- return __set_new_handler (handler);
-}
-
#define MESSAGE "Virtual memory exceeded in `new'\n"
-static void
+void
__default_new_handler ()
{
/* don't use fprintf (stderr, ...) because it may need to call malloc. */
@@ -1643,7 +1651,10 @@ __default_new_handler ()
#endif
#ifdef L_op_delete
-/* void operator delete (void *ptr) */
+/* 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. */
+
void
__builtin_delete (void *ptr)
{
@@ -1651,6 +1662,22 @@ __builtin_delete (void *ptr)
free (ptr);
}
#endif
+
+#ifdef L_op_vec_delete
+/* 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 *);
+
+void
+__builtin_vec_delete (void *ptr)
+{
+ __builtin_delete (ptr);
+}
+#endif
+
+/* End of C++ free-store management functions */
#ifdef L_shtab
unsigned int __shtab[] = {