]> Savannah Git Hosting - gnulib.git/commitdiff
free-posix: Work around GCC mis-optimization bug.
authorBruno Haible <bruno@clisp.org>
Sun, 3 Jan 2021 10:19:22 +0000 (11:19 +0100)
committerBruno Haible <bruno@clisp.org>
Sun, 3 Jan 2021 10:19:22 +0000 (11:19 +0100)
Code by Bernhard Voelker <mail@bernhard-voelker.de>.

* lib/free.c (rpl_free): Add alternative complicated code for GCC.

ChangeLog
lib/free.c

index 840208f5ff568e33ebf53691ed20f3c7b0f06842..d7b506cf53d8cb969f245f03f2e7d46c3366a868 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021-01-03  Bruno Haible  <bruno@clisp.org>
+
+       free-posix: Work around GCC mis-optimization bug.
+       Code by Bernhard Voelker <mail@bernhard-voelker.de>.
+       * lib/free.c (rpl_free): Add alternative complicated code for GCC.
+
 2021-01-02  Bruno Haible  <bruno@clisp.org>
 
        valgrind-tests: Disable valgrind if it would cause all tests to fail.
index 135c3eb16bc4f71a83e498b92102badcbb1a48ca..5c89787aba1380c6d6b55ceffb838a9cca796d43 100644 (file)
@@ -27,7 +27,21 @@ void
 rpl_free (void *p)
 #undef free
 {
+#if defined __GNUC__ && !defined __clang__
+  /* An invalid GCC optimization
+     <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98396>
+     would optimize away the assignments in the code below, when link-time
+     optimization (LTO) is enabled.  Make the code more complicated, so that
+     GCC does not grok how to optimize it.  */
+  int err[2];
+  err[0] = errno;
+  err[1] = errno;
+  errno = 0;
+  free (p);
+  errno = err[errno == 0];
+#else
   int err = errno;
   free (p);
   errno = err;
+#endif
 }