X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gcc%2Fvec.h;h=cbdd439571b97fe920d121332514557c72e4852c;hb=6566b0fb86addb5c28d3ff8b2631f7f9516d4054;hp=aa93411132b54094830306a436001aa8296b3be7;hpb=0b435c16901f5642e2767dc72a53aad251f57661;p=gcc.git diff --git a/gcc/vec.h b/gcc/vec.h index aa93411132b..cbdd439571b 100644 --- a/gcc/vec.h +++ b/gcc/vec.h @@ -1,5 +1,5 @@ /* Vector API for GNU compiler. - Copyright (C) 2004-2016 Free Software Foundation, Inc. + Copyright (C) 2004-2017 Free Software Foundation, Inc. Contributed by Nathan Sidwell Re-implemented in C++ by Diego Novillo @@ -407,6 +407,26 @@ struct GTY((user)) vec { }; +/* Default-construct N elements in DST. */ + +template +inline void +vec_default_construct (T *dst, unsigned n) +{ + for ( ; n; ++dst, --n) + ::new (static_cast(dst)) T (); +} + +/* Copy-construct N elements in DST from *SRC. */ + +template +inline void +vec_copy_construct (T *dst, const T *src, unsigned n) +{ + for ( ; n; ++dst, ++src, --n) + ::new (static_cast(dst)) T (*src); +} + /* Type to provide NULL values for vec. This is used to provide nil initializers for vec instances. Since vec must be a POD, we cannot have proper ctor/dtor for it. To initialize @@ -416,10 +436,7 @@ struct GTY((user)) vec struct vnull { template -#if __cpp_constexpr >= 200704 - constexpr -#endif - operator vec () { return vec(); } + CONSTEXPR operator vec () { return vec(); } }; extern vnull vNULL; @@ -615,7 +632,7 @@ vec_safe_grow_cleared (vec *&v, unsigned len CXX_MEM_STAT_INFO) { unsigned oldlen = vec_safe_length (v); vec_safe_grow (v, len PASS_MEM_STAT); - memset (&(v->address ()[oldlen]), 0, sizeof (T) * (len - oldlen)); + vec_default_construct (v->address () + oldlen, len - oldlen); } @@ -821,7 +838,7 @@ vec::copy (ALONE_MEM_STAT_DECL) const { vec_alloc (new_vec, len PASS_MEM_STAT); new_vec->embedded_init (len, len); - memcpy (new_vec->address (), m_vecdata, sizeof (T) * len); + vec_copy_construct (new_vec->address (), m_vecdata, len); } return new_vec; } @@ -838,7 +855,7 @@ vec::splice (const vec &src) if (len) { gcc_checking_assert (space (len)); - memcpy (address () + length (), src.address (), len * sizeof (T)); + vec_copy_construct (end (), src.address (), len); m_vecpfx.m_num += len; } } @@ -1092,13 +1109,12 @@ inline void vec::quick_grow_cleared (unsigned len) { unsigned oldlen = length (); - size_t sz = sizeof (T) * (len - oldlen); + size_t growby = len - oldlen; quick_grow (len); - if (sz != 0) - memset (&(address ()[oldlen]), 0, sz); + if (growby != 0) + vec_default_construct (address () + oldlen, growby); } - /* Garbage collection support for vec. */ template @@ -1272,6 +1288,18 @@ public: this->m_vec = &m_auto; } + auto_vec (size_t s) + { + if (s > N) + { + this->create (s); + return; + } + + m_auto.embedded_init (MAX (N, 2), 0, 1); + this->m_vec = &m_auto; + } + ~auto_vec () { this->release (); @@ -1445,7 +1473,7 @@ vec::reserve (unsigned nelems, bool exact MEM_STAT_DECL) va_heap::reserve (m_vec, nelems, exact PASS_MEM_STAT); if (handle_auto_vec) { - memcpy (m_vec->address (), oldvec->address (), sizeof (T) * oldsize); + vec_copy_construct (m_vec->address (), oldvec->address (), oldsize); m_vec->m_vecpfx.m_num = oldsize; } @@ -1607,10 +1635,10 @@ inline void vec::safe_grow_cleared (unsigned len MEM_STAT_DECL) { unsigned oldlen = length (); - size_t sz = sizeof (T) * (len - oldlen); + size_t growby = len - oldlen; safe_grow (len PASS_MEM_STAT); - if (sz != 0) - memset (&(address ()[oldlen]), 0, sz); + if (growby != 0) + vec_default_construct (address () + oldlen, growby); }