diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-16 03:41:19 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-16 03:41:19 +0000 |
commit | 921d9bf36ddd5d4ac808fea780faee0cf3141a54 (patch) | |
tree | c2094545552a4faf8500ecec49f51af6a4e34bb0 /libstdc++-v3/libsupc++ | |
parent | 598dbf4508e25785f5364507480252e642c5497a (diff) | |
download | gcc-921d9bf36ddd5d4ac808fea780faee0cf3141a54.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87585 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/libsupc++')
-rw-r--r-- | libstdc++-v3/libsupc++/cxxabi.h | 33 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/vec.cc | 182 |
2 files changed, 185 insertions, 30 deletions
diff --git a/libstdc++-v3/libsupc++/cxxabi.h b/libstdc++-v3/libsupc++/cxxabi.h index dfed54e69ee..39a41c61aee 100644 --- a/libstdc++-v3/libsupc++/cxxabi.h +++ b/libstdc++-v3/libsupc++/cxxabi.h @@ -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 diff --git a/libstdc++-v3/libsupc++/vec.cc b/libstdc++-v3/libsupc++/vec.cc index 2708c19aca9..7e93d1cfea0 100644 --- a/libstdc++-v3/libsupc++/vec.cc +++ b/libstdc++-v3/libsupc++/vec.cc @@ -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__) |