cxxabi_tweaks.h (__cxa_cdtor_return_type): Define.

* config/cpu/arm/cxxabi_tweaks.h (__cxa_cdtor_return_type):
	Define.
	* config/cpu/generic/cxxabi_tweaks.h (__cxa_cdtor_return_type):
	Define.
	* libsupc++/cxxabi.h (__cxa_cdtor_return_type): New type.
	(__cxa_vec_new): Use it.
	(__cxa_vec_new2): Likewise.
	(__cxa_vec_new3): Likewise.
	(__cxa_vec_cdtor): Likewise.
	(__cxa_vec_cctor): Likeiwse.
	(__cxa_vec_dtor): Likewise.
	(__cxa_vec_cleanup): Likewise.
	(__cxa_vec_delete2): Likewise.
	(__cxa_vec_delete3): Likewise.
	* libsupc++/vec.cc (__cxa_vec_new): Likewise.
	(__cxa_vec_new2): Likewise.
	(__cxa_vec_new3): Likewise.
	(__cxa_vec_cdtor): Likewise.
	(__cxa_vec_cctor): Likeiwse.
	(__cxa_vec_dtor): Likewise.
	(__cxa_vec_cleanup): Likewise.
	(__cxa_vec_delete2): Likewise.
	(__cxa_vec_delete3): Likewise.
	(__aeabi_vec_ctor_nocookie_nodtor): New function.
	(__aeabi_vec_ctor_cookie_nodtor): Likewise.
	(__aeabi_vec_cctor_nocookie_nodtor): Likewise.
	(__aeabi_vec_new_cookie_noctor): Likewise.
	(__aeabi_vec_new_nocookie): Likewise.
	(__aeabi_vec_new_cookie_nodtor): Likewise.
	(__aeabi_vec_new_cookie): Likewise.
	(__aeabi_vec_dtor): Likewise.
	(__aeabi_vec_dtor_cookie): Likewise.
	(__aeabi_vec_delete): Likewise.
	(__aeabi_vec_delete3): Likewise.
	(__aeabi_vec_delete3_nodtor): Likewise.
	(__aeabi_atexit): Likewise.

	* testsuite/g++.old-deja/g++.abi/cxa_vec.C: Adjust for ARM
	EABI.

From-SVN: r87585
This commit is contained in:
Mark Mitchell 2004-09-16 03:41:19 +00:00 committed by Mark Mitchell
parent 329bed5eb4
commit 511bbc8f91
7 changed files with 243 additions and 32 deletions

View File

@ -1,3 +1,8 @@
2004-09-15 Mark Mitchell <mark@codesourcery.com>
* testsuite/g++.old-deja/g++.abi/cxa_vec.C: Adjust for ARM
EABI.
2004-09-15 Mark Mitchell <mark@codesourcery.com>
* g++.dg/opt/switch1.C: New test.

View File

@ -22,14 +22,17 @@ static bool dtor_repeat = false;
#endif
// our pseudo ctors and dtors
static void ctor (void *)
static abi::__cxa_cdtor_return_type ctor (void *x)
{
if (!ctor_count)
throw 1;
ctor_count--;
#ifdef __ARM_EABI__
return x;
#endif
}
static void dtor (void *)
static abi::__cxa_cdtor_return_type dtor (void *x)
{
if (!dtor_count)
{
@ -38,6 +41,9 @@ static void dtor (void *)
throw 1;
}
dtor_count--;
#ifdef __ARM_EABI__
return x;
#endif
}
// track new and delete

View File

@ -1,3 +1,42 @@
2004-09-15 Mark Mitchell <mark@codesourcery.com>
* config/cpu/arm/cxxabi_tweaks.h (__cxa_cdtor_return_type):
Define.
* config/cpu/generic/cxxabi_tweaks.h (__cxa_cdtor_return_type):
Define.
* libsupc++/cxxabi.h (__cxa_cdtor_return_type): New type.
(__cxa_vec_new): Use it.
(__cxa_vec_new2): Likewise.
(__cxa_vec_new3): Likewise.
(__cxa_vec_cdtor): Likewise.
(__cxa_vec_cctor): Likeiwse.
(__cxa_vec_dtor): Likewise.
(__cxa_vec_cleanup): Likewise.
(__cxa_vec_delete2): Likewise.
(__cxa_vec_delete3): Likewise.
* libsupc++/vec.cc (__cxa_vec_new): Likewise.
(__cxa_vec_new2): Likewise.
(__cxa_vec_new3): Likewise.
(__cxa_vec_cdtor): Likewise.
(__cxa_vec_cctor): Likeiwse.
(__cxa_vec_dtor): Likewise.
(__cxa_vec_cleanup): Likewise.
(__cxa_vec_delete2): Likewise.
(__cxa_vec_delete3): Likewise.
(__aeabi_vec_ctor_nocookie_nodtor): New function.
(__aeabi_vec_ctor_cookie_nodtor): Likewise.
(__aeabi_vec_cctor_nocookie_nodtor): Likewise.
(__aeabi_vec_new_cookie_noctor): Likewise.
(__aeabi_vec_new_nocookie): Likewise.
(__aeabi_vec_new_cookie_nodtor): Likewise.
(__aeabi_vec_new_cookie): Likewise.
(__aeabi_vec_dtor): Likewise.
(__aeabi_vec_dtor_cookie): Likewise.
(__aeabi_vec_delete): Likewise.
(__aeabi_vec_delete3): Likewise.
(__aeabi_vec_delete3_nodtor): Likewise.
(__aeabi_atexit): Likewise.
2004-09-14 Nathan Myers <ncm@cantrip.org>
* include/bits/fstream.tcc (xsgetn): Slightly tweak the recent fix

View File

@ -48,6 +48,8 @@ namespace __cxxabiv1
// __cxa_vec_ctor should return a pointer to the array.
typedef void * __cxa_vec_ctor_return_type;
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x
// Constructors and destructors return the "this" pointer.
typedef void * __cxa_cdtor_return_type;
#else // __ARM_EABI__
@ -59,6 +61,8 @@ namespace __cxxabiv1
// __cxa_vec_ctor has void return type.
typedef void __cxa_vec_ctor_return_type;
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return
// Constructors and destructors do not return a value.
typedef void __cxa_cdtor_return_type;
#endif //!__ARM_EABI__

View File

@ -43,6 +43,8 @@ namespace __cxxabiv1
// __cxa_vec_ctor has void return type.
typedef void __cxa_vec_ctor_return_type;
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return
// Constructors and destructors do not return a value.
typedef void __cxa_cdtor_return_type;
#ifdef __cplusplus
} // namespace __cxxabiv1

View File

@ -50,6 +50,8 @@
#ifdef __cplusplus
namespace __cxxabiv1
{
typedef __cxa_cdtor_return_type (*__cxa_cdtor_type)(void *);
extern "C"
{
#endif
@ -57,54 +59,55 @@ namespace __cxxabiv1
// Allocate array.
void*
__cxa_vec_new(size_t __element_count, size_t __element_size,
size_t __padding_size, void (*__constructor) (void*),
void (*__destructor) (void*));
size_t __padding_size, __cxa_cdtor_type constructor,
__cxa_cdtor_type destructor);
void*
__cxa_vec_new2(size_t __element_count, size_t __element_size,
size_t __padding_size, void (*__constructor) (void*),
void (*__destructor) (void*), void *(*__alloc) (size_t),
size_t __padding_size, __cxa_cdtor_type constructor,
__cxa_cdtor_type destructor, void *(*__alloc) (size_t),
void (*__dealloc) (void*));
void*
__cxa_vec_new3(size_t __element_count, size_t __element_size,
size_t __padding_size, void (*__constructor) (void*),
void (*__destructor) (void*), void *(*__alloc) (size_t),
size_t __padding_size, __cxa_cdtor_type constructor,
__cxa_cdtor_type destructor, void *(*__alloc) (size_t),
void (*__dealloc) (void*, size_t));
// Construct array.
__cxa_vec_ctor_return_type
__cxa_vec_ctor(void* __array_address, size_t __element_count,
size_t __element_size, void (*__constructor) (void*),
void (*__destructor) (void*));
size_t __element_size, __cxa_cdtor_type constructor,
__cxa_cdtor_type destructor);
__cxa_vec_ctor_return_type
__cxa_vec_cctor(void* dest_array, void* src_array, size_t element_count,
size_t element_size, void (*constructor) (void*, void*),
void (*destructor) (void*));
size_t element_size,
__cxa_cdtor_return_type (*constructor) (void*, void*),
__cxa_cdtor_type destructor);
// Destruct array.
void
__cxa_vec_dtor(void* __array_address, size_t __element_count,
size_t __element_size, void (*__destructor) (void*));
size_t __element_size, __cxa_cdtor_type destructor);
void
__cxa_vec_cleanup(void* __array_address, size_t __element_count,
size_t __element_size, void (*__destructor) (void*));
size_t __element_size, __cxa_cdtor_type destructor);
// Destruct and release array.
void
__cxa_vec_delete(void* __array_address, size_t __element_size,
size_t __padding_size, void (*__destructor) (void*));
size_t __padding_size, __cxa_cdtor_type destructor);
void
__cxa_vec_delete2(void* __array_address, size_t __element_size,
size_t __padding_size, void (*__destructor) (void*),
size_t __padding_size, __cxa_cdtor_type destructor,
void (*__dealloc) (void*));
void
__cxa_vec_delete3(void* __array_address, size_t __element_size,
size_t __padding_size, void (*__destructor) (void*),
size_t __padding_size, __cxa_cdtor_type destructor,
void (*__dealloc) (void*, size_t));
int

View File

@ -70,8 +70,8 @@ namespace __cxxabiv1
__cxa_vec_new(std::size_t element_count,
std::size_t element_size,
std::size_t padding_size,
void (*constructor) (void *),
void (*destructor) (void *))
__cxa_cdtor_type constructor,
__cxa_cdtor_type destructor)
{
return __cxa_vec_new2(element_count, element_size, padding_size,
constructor, destructor,
@ -82,8 +82,8 @@ namespace __cxxabiv1
__cxa_vec_new2(std::size_t element_count,
std::size_t element_size,
std::size_t padding_size,
void (*constructor) (void *),
void (*destructor) (void *),
__cxa_cdtor_type constructor,
__cxa_cdtor_type destructor,
void *(*alloc) (std::size_t),
void (*dealloc) (void *))
{
@ -120,8 +120,8 @@ namespace __cxxabiv1
__cxa_vec_new3(std::size_t element_count,
std::size_t element_size,
std::size_t padding_size,
void (*constructor) (void *),
void (*destructor) (void *),
__cxa_cdtor_type constructor,
__cxa_cdtor_type destructor,
void *(*alloc) (std::size_t),
void (*dealloc) (void *, std::size_t))
{
@ -159,8 +159,8 @@ namespace __cxxabiv1
__cxa_vec_ctor(void *array_address,
std::size_t element_count,
std::size_t element_size,
void (*constructor) (void *),
void (*destructor) (void *))
__cxa_cdtor_type constructor,
__cxa_cdtor_type destructor)
{
std::size_t ix = 0;
char *ptr = static_cast<char *>(array_address);
@ -188,8 +188,8 @@ namespace __cxxabiv1
void *src_array,
std::size_t element_count,
std::size_t element_size,
void (*constructor) (void *, void *),
void (*destructor) (void *))
__cxa_cdtor_return_type (*constructor) (void *, void *),
__cxa_cdtor_type destructor)
{
std::size_t ix = 0;
char *dest_ptr = static_cast<char *>(dest_array);
@ -218,7 +218,7 @@ namespace __cxxabiv1
__cxa_vec_dtor(void *array_address,
std::size_t element_count,
std::size_t element_size,
void (*destructor) (void *))
__cxa_cdtor_type destructor)
{
if (destructor)
{
@ -253,7 +253,7 @@ namespace __cxxabiv1
__cxa_vec_cleanup(void *array_address,
std::size_t element_count,
std::size_t element_size,
void (*destructor) (void *))
__cxa_cdtor_type destructor)
{
if (destructor)
{
@ -282,7 +282,7 @@ namespace __cxxabiv1
__cxa_vec_delete(void *array_address,
std::size_t element_size,
std::size_t padding_size,
void (*destructor) (void *))
__cxa_cdtor_type destructor)
{
__cxa_vec_delete2(array_address, element_size, padding_size,
destructor,
@ -293,7 +293,7 @@ namespace __cxxabiv1
__cxa_vec_delete2(void *array_address,
std::size_t element_size,
std::size_t padding_size,
void (*destructor) (void *),
__cxa_cdtor_type destructor,
void (*dealloc) (void *))
{
if (!array_address)
@ -326,7 +326,7 @@ namespace __cxxabiv1
__cxa_vec_delete3(void *array_address,
std::size_t element_size,
std::size_t padding_size,
void (*destructor) (void *),
__cxa_cdtor_type destructor,
void (*dealloc) (void *, std::size_t))
{
if (!array_address)
@ -358,3 +358,155 @@ namespace __cxxabiv1
}
} // namespace __cxxabiv1
#if defined(__arm__) && defined(__ARM_EABI__)
// The ARM C++ ABI requires that the library provide these additional
// helper functions. There are placed in this file, despite being
// architecture-specifier, so that the compiler can inline the __cxa
// functions into these functions as appropriate.
namespace __aeabiv1
{
extern "C" void *
__aeabi_vec_ctor_nocookie_nodtor (void *array_address,
abi::__cxa_cdtor_type constructor,
std::size_t element_size,
std::size_t element_count)
{
return abi::__cxa_vec_ctor (array_address, element_count, element_size,
constructor, /*destructor=*/NULL);
}
extern "C" void *
__aeabi_vec_ctor_cookie_nodtor (void *array_address,
abi::__cxa_cdtor_type constructor,
std::size_t element_size,
std::size_t element_count)
{
if (array_address == NULL)
return NULL;
array_address = reinterpret_cast<std::size_t *>(array_address) + 2;
reinterpret_cast<std::size_t *>(array_address)[-2] = element_size;
reinterpret_cast<std::size_t *>(array_address)[-1] = element_count;
return abi::__cxa_vec_ctor (array_address,
element_count, element_size,
constructor, /*destructor=*/NULL);
}
extern "C" void *
__aeabi_vec_cctor_nocookie_nodtor (void *dest_array,
void *src_array,
std::size_t element_size,
std::size_t element_count,
void *(*constructor) (void *, void *))
{
return abi::__cxa_vec_cctor (dest_array, src_array,
element_count, element_size,
constructor, NULL);
}
extern "C" void *
__aeabi_vec_new_cookie_noctor (std::size_t element_size,
std::size_t element_count)
{
return abi::__cxa_vec_new(element_count, element_size,
2 * sizeof (std::size_t),
/*constructor=*/NULL, /*destructor=*/NULL);
}
extern "C" void *
__aeabi_vec_new_nocookie (std::size_t element_size,
std::size_t element_count,
abi::__cxa_cdtor_type constructor)
{
return abi::__cxa_vec_new (element_count, element_size, 0, constructor,
NULL);
}
extern "C" void *
__aeabi_vec_new_cookie_nodtor (std::size_t element_size,
std::size_t element_count,
abi::__cxa_cdtor_type constructor)
{
return abi::__cxa_vec_new(element_count, element_size,
2 * sizeof (std::size_t),
constructor, NULL);
}
extern "C" void *
__aeabi_vec_new_cookie(std::size_t element_size,
std::size_t element_count,
abi::__cxa_cdtor_type constructor,
abi::__cxa_cdtor_type destructor)
{
return abi::__cxa_vec_new (element_count, element_size,
2 * sizeof (std::size_t),
constructor, destructor);
}
extern "C" void *
__aeabi_vec_dtor (void *array_address,
abi::__cxa_cdtor_type destructor,
std::size_t element_size,
std::size_t element_count)
{
abi::__cxa_vec_dtor (array_address, element_count, element_size,
destructor);
return reinterpret_cast<std::size_t*> (array_address) - 2;
}
extern "C" void *
__aeabi_vec_dtor_cookie (void *array_address,
abi::__cxa_cdtor_type destructor)
{
abi::__cxa_vec_dtor (array_address,
reinterpret_cast<std::size_t *>(array_address)[-1],
reinterpret_cast<std::size_t *>(array_address)[-2],
destructor);
return reinterpret_cast<std::size_t*> (array_address) - 2;
}
extern "C" void
__aeabi_vec_delete (void *array_address,
abi::__cxa_cdtor_type destructor)
{
abi::__cxa_vec_delete (array_address,
reinterpret_cast<std::size_t *>(array_address)[-2],
2 * sizeof (std::size_t),
destructor);
}
extern "C" void
__aeabi_vec_delete3 (void *array_address,
abi::__cxa_cdtor_type destructor,
void (*dealloc) (void *, std::size_t))
{
abi::__cxa_vec_delete3 (array_address,
reinterpret_cast<std::size_t *>(array_address)[-2],
2 * sizeof (std::size_t),
destructor, dealloc);
}
extern "C" void
__aeabi_vec_delete3_nodtor (void *array_address,
void (*dealloc) (void *, std::size_t))
{
abi::__cxa_vec_delete3 (array_address,
reinterpret_cast<std::size_t *>(array_address)[-2],
2 * sizeof (std::size_t),
/*destructor=*/NULL, dealloc);
}
extern "C" int
__aeabi_atexit (void *object,
void (*destructor) (void *),
void *dso_handle)
{
return abi::__cxa_atexit(destructor, object, dso_handle);
}
} // namespace __aeabiv1
#endif // defined(__arm__) && defined(__ARM_EABI__)