On February 16, 2018 7:05:10 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >On Fri, Feb 16, 2018 at 10:36:27AM -0700, Martin Sebor wrote: >> The deeper problem is that vec wants to be a POD but GCC >> instantiates the template on non-POD types. For example >> genrecog.c instantiates it on struct parameter that has >> a default ctor. >> >> A number of ipa-*.c files instantiate vec on >ipa_polymorphic_call_context, >> which also has a default ctor, >> and ctor even has different semantics than memset (it sets >> a few members to non-zero). So calling memset here instead >> of the default ctor could be a potential bug. > >Then we should just call memset and then do the placement new for older >compilers (those certainly didn't have -flifetime-dse=2, so wouldn't >throw >away whatever has been there before the ctor), or just fix up >ipa_polymorphic_call_context so that default ctor clears everything >rather >than setting something to true. > >In any case, I hope we don't grow too many new uses of value >initialization >which is so problematic in older compilers. > >Here is what I'll test. AFAIK both the *something = value_init (); >and ::new (ptr) value_init (); work even in the buggy compilers, >including >4.2.[0-3], if value_init has user defined default ctor, just call >that default ctor and do nothing else, the mishandled cases are only >for >classes without those. So it will be enough to make sure we don't >create >hash maps of types that need something non-zero in default ctor or put >such >types into classes without user provided default ctor.
But the broken compilers will overwrite the memset data with possibly uninitialized fields of a TARGET_EXPR. > >2018-02-16 Jakub Jelinek <ja...@redhat.com> > > PR bootstrap/84405 > * vec.h (vec_default_construct): For BROKEN_VALUE_INITIALIZATION use > memset and value initialization afterwards. > * hash-table.h (hash_table<Descriptor, Allocator>::empty_slow): > Likewise. > >--- gcc/hash-table.h.jj 2018-02-16 10:04:25.179740963 +0100 >+++ gcc/hash-table.h 2018-02-16 18:48:38.359845266 +0100 >@@ -804,12 +804,11 @@ hash_table<Descriptor, Allocator>::empty > } > else > { >-#ifndef BROKEN_VALUE_INITIALIZATION >- for ( ; size; ++entries, --size) >- *entries = value_type (); >-#else >+#ifdef BROKEN_VALUE_INITIALIZATION > memset (entries, 0, size * sizeof (value_type)); > #endif >+ for ( ; size; ++entries, --size) >+ *entries = value_type (); > } > m_n_deleted = 0; > m_n_elements = 0; >--- gcc/vec.h.jj 2018-02-16 10:04:25.178740963 +0100 >+++ gcc/vec.h 2018-02-16 18:49:21.305850964 +0100 >@@ -490,12 +490,11 @@ template <typename T> > inline void > vec_default_construct (T *dst, unsigned n) > { >-#ifndef BROKEN_VALUE_INITIALIZATION >- for ( ; n; ++dst, --n) >- ::new (static_cast<void*>(dst)) T (); >-#else >+#ifdef BROKEN_VALUE_INITIALIZATION > memset (dst, '\0', sizeof (T) * n); > #endif >+ for ( ; n; ++dst, --n) >+ ::new (static_cast<void*>(dst)) T (); > } > > /* Copy-construct N elements in DST from *SRC. */ > > > Jakub