Correctly handle ARM targets.
* g++.dg/init/new45.C (cookie_size): New constant set to a value appropriate for the target. (operator new[]): Use it. From-SVN: r230987
This commit is contained in:
parent
1e5d7fd638
commit
ed48be0ef3
|
@ -1,3 +1,9 @@
|
||||||
|
2015-11-26 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
* g++.dg/init/new45.C (cookie_size): New constant set to a value
|
||||||
|
appropriate for the target.
|
||||||
|
(operator new[]): Use it.
|
||||||
|
|
||||||
2015-11-26 Paolo Carlini <paolo.carlini@oracle.com>
|
2015-11-26 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/67238
|
PR c++/67238
|
||||||
|
|
|
@ -23,13 +23,25 @@ struct POD {
|
||||||
|
|
||||||
enum { N = 123 };
|
enum { N = 123 };
|
||||||
|
|
||||||
|
#if defined (__arm__) && defined (__ARM_EABI__)
|
||||||
|
// On ARM EABI the cookie is always 8 bytes as per Section 3.2.2 of
|
||||||
|
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041d/IHI0041D_cppabi.pdf
|
||||||
|
static const size_t cookie_size = 8;
|
||||||
|
#else
|
||||||
|
// On all other targets, the cookie size is the size of size_t
|
||||||
|
// GCC, and ideally the C++ standard, should provide an API to
|
||||||
|
// retrieve this constant.)
|
||||||
|
static const size_t cookie_size = sizeof (size_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
inline __attribute__ ((always_inline))
|
inline __attribute__ ((always_inline))
|
||||||
void* operator new[] (size_t n)
|
void* operator new[] (size_t n)
|
||||||
{
|
{
|
||||||
// Verify that array new is invoked with an argument large enough
|
// Verify that array new is invoked with an argument large enough
|
||||||
// for the array and a size_t cookie to store the number of elements.
|
// for the array and a size_t cookie to store the number of elements.
|
||||||
// (This holds for classes with user-defined types but not POD types).
|
// (This holds for classes with user-defined types but not POD types).
|
||||||
if (n != N * sizeof (UDClass) + sizeof n) abort ();
|
|
||||||
|
if (n != N * sizeof (UDClass) + cookie_size) abort ();
|
||||||
return malloc (n);
|
return malloc (n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +72,7 @@ void* operator new[] (size_t n, UDClass *p)
|
||||||
// Verify that placement array new overload for a class type with
|
// Verify that placement array new overload for a class type with
|
||||||
// a user-defined ctor and dtor is invoked with an argument large
|
// a user-defined ctor and dtor is invoked with an argument large
|
||||||
// enough for the array and a cookie.
|
// enough for the array and a cookie.
|
||||||
if (n != N * sizeof (UDClass) + sizeof n) abort ();
|
if (n != N * sizeof (UDClass) + cookie_size) abort ();
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue