Work-around bug in GCC 4.4.5
authorJohn Darrington <john@darrington.wattle.id.au>
Mon, 1 Apr 2013 05:34:28 +0000 (07:34 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 1 Apr 2013 05:48:42 +0000 (07:48 +0200)
Gcc 4.4.5 seems to be buggy.  For some reason it miscompiles the code in
casereader_count_cases__ when compiled with -O2 by not allocating enough
stack.  This commit works around that problem by putting a dummy variable
on the stack.

Reviewed-by Ben Pfaff.

src/data/casereader.c

index c8050c6cde4c7b2a35d6d2b45aa752c3ecbee1e8..adb6b6a909b134e815836aa75cbf0b1263d79b68 100644 (file)
@@ -242,6 +242,19 @@ casereader_count_cases__ (const struct casereader *reader,
   struct casereader *clone;
   casenumber n_cases;
 
+  /* This seems to avoid a bug in Gcc 4.4.5 where, upon
+     return from this function, the stack appeared corrupt,
+     and the program returned to the wrong address.  Oddly
+     the problem only manifested itself when used in conjunction
+     with the ODS reader, in code such as:
+
+     GET DATA /TYPE=ODS ....
+     LIST.
+  */
+#if (__GNUC__ == 4 ) && (__GNUC_MINOR__ == 4)
+  volatile int x = 1; x++;
+#endif
+
   clone = casereader_clone (reader);
   n_cases = casereader_advance (clone, max_cases);
   casereader_destroy (clone);