scons: Disable optimizations only for gcc-4.2
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 28 Jun 2009 10:12:22 +0000 (11:12 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sun, 28 Jun 2009 10:12:22 +0000 (11:12 +0100)
gcc-4.2's optimizer has a strange bug where it looses code from inner
loops in certain situations. For example, if the appearently innocent
looking code below is compiled with gcc-4.2 -S -O1, the inner loop's
code is missing from the outputed assembly.

   struct Size {
      unsigned width;
   };

   struct Command {
      unsigned length;
      struct Size sizes[32];
   };

   extern void emit_command(void *command, unsigned length);

   void
   create_surface( struct Size size, unsigned faces, unsigned levels)
   {
      struct Command cmd;
      unsigned face;
      unsigned level;

      cmd.length = faces*levels*sizeof(cmd.sizes[0]);

      for(face = 0; face < faces; ++face) {
 for(level = 0; level < levels; ++level) {
    cmd.sizes[face*levels + level] = size;
    // This should generate a shrl statement, but the whole for body
    // disappears in gcc-4.2 -O1/-O2/-O3!
    size.width >>= 1;
 }
      }

      emit(&cmd, sizeof cmd.length + cmd.length);
   }

Note that this is not specific to MinGW's gcc-4.2 crosscompiler (the
version typically found in debian/ubuntu's mingw32 packages). gcc-4.2 on
Linux also displays the same error. gcc-4.3 and above gets this
correctly though.

Updated MinGW debian packages with gcc-4.3 are available from
http://people.freedesktop.org/~jrfonseca/debian/pool/main/m/

scons/gallium.py

index b69f2f2a75aa64f3439ac3c7cc2ecaca34085dd4..217478bd50df467d50903e0c0cb1315dd4ad76b4 100644 (file)
@@ -324,8 +324,10 @@ def generate(env):
     if gcc:
         if debug:
             ccflags += ['-O0', '-g3']
-        elif env['toolchain'] == 'crossmingw':
-            ccflags += ['-O0', '-g3'] # mingw 4.2.1 optimizer is broken
+        elif env['CCVERSION'].startswith('4.2.'):
+            # gcc 4.2.x optimizer is broken
+            print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
+            ccflags += ['-O0', '-g3']
         else:
             ccflags += ['-O3', '-g3']
         if env['profile']: