I'm investigating another build failure for Fedora 17 (based on 4.7).
The failing compile from the build log is as follows:

/bin/sh ./libtool  --tag=CC
--mode=compile 
/builddir/build/BUILD/gcc-4.7.0-20120504/obj-ppc64-redhat-linux/./gcc/xgcc 
-B/builddir/build/BUILD/gcc-4.7.0-20120504/obj-ppc64-redhat-linux/./gcc/ 
-B/usr/ppc64-redhat-linux/bin/ -B/usr/ppc64-redhat-linux/lib/ -isystem 
/usr/ppc64-redhat-linux/include -isystem /usr/ppc64-redhat-linux/sys-include    
-DHAVE_CONFIG_H -I. -I../../../libgo  -I ../../../libgo/runtime 
-I../../../libgo/../libffi/include -I../libffi/include -pthread  -fexceptions 
-fplan9-extensions  -Wall -Wextra -Wwrite-strings -Wcast-qual -Werror  
-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I 
../../../libgo/../libgcc -I ../../gcc/include -O2 -O3 -mtune=power7 
-mcpu=power7 -g -fsigned-char -MT proc.lo -MD -MP -MF .deps/proc.Tpo -c -o 
proc.lo `test -f 'runtime/proc.c' || echo '../../../libgo/'`runtime/proc.c

The reported failure:

../../../libgo/runtime/proc.c: In function ‘__go_go’:
../../../libgo/runtime/proc.c:1323:8: error: variable ‘sp’ might be
clobbered by ‘longjmp’ or ‘vfork’ [-Werror=clobbered]
../../../libgo/runtime/proc.c:1324:9: error: variable ‘spsize’ might be
clobbered by ‘longjmp’ or ‘vfork’ [-Werror=clobbered]
cc1: all warnings being treated as errors

The declarations in question are:

        byte *sp;
        size_t spsize;
        G * volatile newg;      // volatile to avoid longjmp warning

What's interesting here is that I don't see a problem when compiling for
a 32-bit target.  However, it's also apparent that making "newg"
volatile was deemed sufficient up till now, so I am wondering if there
is something about our build options/environment that could cause the
problem.

I can work around the problem with the following patch, but would
appreciate any insights into whether this should be necessary, and if
not, what we're doing "wrong."

Thanks!

Bill


*** proc.c.orig 2012-05-10 21:02:13.394995624 -0500
--- proc.c      2012-05-10 21:01:36.050994265 -0500
*************** __go_go(void (*fn)(void*), void* arg)
*** 1323,1328 ****
--- 1323,1330 ----
        byte *sp;
        size_t spsize;
        G * volatile newg;      // volatile to avoid longjmp warning
+       byte * volatile vsp;
+       size_t volatile vspsize;
  
        schedlock();
  
*************** __go_go(void (*fn)(void*), void* arg)
*** 1363,1374 ****
        if(sp == nil)
                runtime_throw("nil g->stack0");
  
        getcontext(&newg->context);
!       newg->context.uc_stack.ss_sp = sp;
  #ifdef MAKECONTEXT_STACK_TOP
!       newg->context.uc_stack.ss_sp += spsize;
  #endif
!       newg->context.uc_stack.ss_size = spsize;
        makecontext(&newg->context, kickoff, 0);
  
        newprocreadylocked(newg);
--- 1365,1379 ----
        if(sp == nil)
                runtime_throw("nil g->stack0");
  
+       vsp = sp;
+       vspsize = spsize;
+ 
        getcontext(&newg->context);
!       newg->context.uc_stack.ss_sp = vsp;
  #ifdef MAKECONTEXT_STACK_TOP
!       newg->context.uc_stack.ss_sp += vspsize;
  #endif
!       newg->context.uc_stack.ss_size = vspsize;
        makecontext(&newg->context, kickoff, 0);
  
        newprocreadylocked(newg);


Reply via email to