diff options
author | kan <kan@FreeBSD.org> | 2007-05-19 01:25:07 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2007-05-19 01:25:07 +0000 |
commit | 7865836f4b0f698454c31b4593effcb032c22c1e (patch) | |
tree | ea6c2718dc1e45ed535d194df808ef31f0ebac92 /contrib/libstdc++/libsupc++/vec.cc | |
parent | 1f9ea4d0a40cca64d60cf4dab152349da7b9dddf (diff) | |
download | FreeBSD-src-7865836f4b0f698454c31b4593effcb032c22c1e.zip FreeBSD-src-7865836f4b0f698454c31b4593effcb032c22c1e.tar.gz |
GCC 4.2.0 release C++ standard library and runtime support code.
Diffstat (limited to 'contrib/libstdc++/libsupc++/vec.cc')
-rw-r--r-- | contrib/libstdc++/libsupc++/vec.cc | 198 |
1 files changed, 179 insertions, 19 deletions
diff --git a/contrib/libstdc++/libsupc++/vec.cc b/contrib/libstdc++/libsupc++/vec.cc index 86d41d9..08a7107 100644 --- a/contrib/libstdc++/libsupc++/vec.cc +++ b/contrib/libstdc++/libsupc++/vec.cc @@ -16,8 +16,8 @@ // You should have received a copy of the GNU General Public License // along with GCC; see the file COPYING. If not, write to -// the Free Software Foundation, 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02110-1301, USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate @@ -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 *)) { @@ -96,6 +96,9 @@ namespace __cxxabiv1 { base += padding_size; reinterpret_cast <std::size_t *> (base)[-1] = element_count; +#ifdef _GLIBCXX_ELTSIZE_IN_COOKIE + reinterpret_cast <std::size_t *> (base)[-2] = element_size; +#endif } try { @@ -117,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)) { @@ -131,6 +134,9 @@ namespace __cxxabiv1 { base += padding_size; reinterpret_cast<std::size_t *>(base)[-1] = element_count; +#ifdef _GLIBCXX_ELTSIZE_IN_COOKIE + reinterpret_cast <std::size_t *> (base)[-2] = element_size; +#endif } try { @@ -149,12 +155,12 @@ namespace __cxxabiv1 } // Construct array. - extern "C" void + extern "C" __cxa_vec_ctor_return_type __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); @@ -173,16 +179,17 @@ namespace __cxxabiv1 } __throw_exception_again; } + _GLIBCXX_CXA_VEC_CTOR_RETURN (array_address); } // Construct an array by copying. - extern "C" void + extern "C" __cxa_vec_ctor_return_type __cxa_vec_cctor(void *dest_array, 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); @@ -203,6 +210,7 @@ namespace __cxxabiv1 } __throw_exception_again; } + _GLIBCXX_CXA_VEC_CTOR_RETURN (dest_array); } // Destruct array. @@ -210,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) { @@ -245,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) { @@ -274,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, @@ -285,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) @@ -318,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) @@ -350,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__) |