+2004-08-12 Paul Brook <paul@codesourcery.com>
+
+ * g++.dg/abi/arm_cxa_vec_1.C: New test.
+
2004-08-12 Janis Johnson <janis187@us.ibm.com>
* g++.dg/ext/altivec-2.C: Check for hardware support before
--- /dev/null
+// Check that __cxa_vec_[c]ctor returns a pointer to the array
+// { dg-do run { target arm*-*-* xscale*-*-* } }
+
+#include <cxxabi.h>
+
+#ifdef ___ARM_EABI__
+static void cctor (void * a, void * b)
+{
+ *(char *) a = *(char *) b
+}
+
+int main()
+{
+ char data;
+ char data2;
+ char *p;
+
+ p = __cxa_vec_ctor (&data, 1, 1, NULL, NULL);
+ if (p != &data)
+ return 1;
+ p = __cxa_vec_cctor (&data2, &data, 1, 1, cctor, NULL);
+ if (p != &data2)
+ return 1;
+
+ return 0;
+}
+#else
+int main()
+{
+ return 0;
+}
+#endif
+2004-08-12 Paul Brook <paul@codesourcery.com>
+
+ * config/cpu/arm/cxxabi_tweaks.h: Define __cxa_vec_ctor_return and
+ _GLIBCXX_CXA_VEC_CTOR_RETURN.
+ * config/cpu/generic/cxxabi_tweaks.h: Ditto.
+ * libsupc++/cxxabi.h (__cxa_vec_ctor, __cxa_vec_cctor): Use
+ __cxa_vec_ctor_return.
+ * libsupc++/vec.cc (__cxa_vec_ctor, __cxa_vec_cctor): Ditto.
+ Use _GLIBCXX_CXA_VEC_CTOR_RETURN.
+
2004-08-12 Kelley Cook <kcook@gcc.gnu.org>
* Makefile.in, aclocal.m4, configure, include/Makefile.in,
// We also want the element size in array cookies.
#define _GLIBCXX_ELTSIZE_IN_COOKIE 1
-#else
+ // __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
+
+#else // __ARM_EABI__
+
// The generic ABI uses the first byte of a 64-bit guard variable.
#define _GLIBCXX_GUARD_ACQUIRE(x) (!*(char *) (x))
#define _GLIBCXX_GUARD_RELEASE(x) *(char *) (x) = 1
__extension__ typedef int __guard __attribute__((mode (__DI__)));
-#endif
+
+ // __cxa_vec_ctor has void return type.
+ typedef void __cxa_vec_ctor_return_type;
+#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return
+
+#endif //!__ARM_EABI__
#ifdef __cplusplus
} // namespace __cxxabiv1
#define _GLIBCXX_GUARD_RELEASE(x) *(char *) (x) = 1
__extension__ typedef int __guard __attribute__((mode (__DI__)));
+ // __cxa_vec_ctor has void return type.
+ typedef void __cxa_vec_ctor_return_type;
+#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return
+
#ifdef __cplusplus
} // namespace __cxxabiv1
#endif
void (*__dealloc) (void*, size_t));
// Construct array.
- void
+ __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*));
- void
+ __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*));
}
// 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,
}
__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,
}
__throw_exception_again;
}
+ _GLIBCXX_CXA_VEC_CTOR_RETURN (dest_array);
}
// Destruct array.