+#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)
+ {
+ if (!array_address)
+ return NULL;
+
+ 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)
+ {
+ if (!array_address)
+ return;
+
+ 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))
+ {
+ if (!array_address)
+ return;
+
+ 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))
+ {
+ if (!array_address)
+ return;
+
+ abi::__cxa_vec_delete3 (array_address,
+ reinterpret_cast<std::size_t *>(array_address)[-2],
+ 2 * sizeof (std::size_t),
+ /*destructor=*/NULL, dealloc);
+ }
+} // namespace __aeabiv1
+
+#endif // defined(__arm__) && defined(__ARM_EABI__)