This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[wwwdocs] Describe behavior of -flifetime-dse in class constructors
- From: Martin LiÅka <mliska at suse dot cz>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: jason at redhat dot com, Jan Hubicka <hubicka at ucw dot cz>
- Date: Tue, 16 Feb 2016 15:55:19 +0100
- Subject: [wwwdocs] Describe behavior of -flifetime-dse in class constructors
- Authentication-results: sourceware.org; auth=none
Hello.
As I finally hunted issue in Firefox that was responsible for start-up segfault, I would like
to describe a new behavior of the compiler that emits clobbers to class constructors (w/ -flifetime-dse).
As also Richi spotted quite similar issue in openjade package, I think it worth for mentioning in porting:
Ok?
Thanks,
Martin
Index: htdocs/gcc-6/porting_to.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-6/porting_to.html,v
retrieving revision 1.14
diff --unified -r1.14 porting_to.html
--- htdocs/gcc-6/porting_to.html 14 Feb 2016 13:13:43 -0000 1.14
+++ htdocs/gcc-6/porting_to.html 16 Feb 2016 14:41:10 -0000
@@ -316,7 +316,7 @@
</code></pre>
<p>
-Finally, the type and mangling of flexible array members has changed
+Furthermore, the type and mangling of flexible array members has changed
from previous releases. While in GCC 5 and prior the type of a flexible
array member is an array of zero elements (a GCC extension), in GCC 6 it
is that of an array of an unspecified bound (i.e., <tt>T[]</tt> as opposed
@@ -324,6 +324,50 @@
<tt>-fabi-version</tt> or <tt>-Wabi</tt> option to disable or warn about.
</p>
+<p>
+Finally, the C++ compiler (with enabled <code>-flifetime-dse</code>)
+has been more aggressive in dead-store elimination in situations where
+a memory store to a location precedes a constructor to the
+memory location. Described situation can be commonly found in programs
+which zero a memory that is eventually passed to a placement new operator:
+
+<pre><code>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+struct A
+{
+ A () {}
+ void *operator new (size_t s)
+ {
+ void *ptr = malloc (s);
+ memset (ptr, 0, s);
+ return ptr;
+ }
+
+ int value;
+};
+
+A *
+__attribute__ ((noinline))
+build (void)
+{
+ return new A ();
+}
+
+int main()
+{
+ A *a = build ();
+ assert (a->value == 0); /* Use of uninitialized value */
+ free (a);
+}
+</code></pre>
+
+If the program cannot be fixed to remove the undefined behavior then
+the option <code>-fno-lifetime-dse</code> can be used to disable
+this optimization.
+
<h2>-Wmisleading-indentation</h2>
<p>
A new warning <code>-Wmisleading-indentation</code> was added