Hello,

this is a real log of debugging GCC (with stage1 C miscompiling stage2 Fortran), including finding the miscompilation and fixing it. I hope it helps understanding the way toplevel bootstrap works.

   ../configure

I just need two stages because I know that stage1 C miscompiles stage2 Fortran. I use all-stage2, rather than bootstrap2, to avoid building target libraries. This is like doing "make -C gcc bootstrap2" in the old scheme.

   make all-stage2 STAGE1_LANGUAGES=c,fortran

I use the stage1 compiler to make the target libraries, to avoid that the miscompilation hits in libgfortran.

   make stage1-start
   make all-target-libgfortran

Unfortunately, all target directories are staged, even non-bootstrapped ones, because of multilibbing. So I copy everything in the stage1 target directory to the stage2 target directory. But this annoyance is actually good because in the future it will allow me to use the same libgcc for both executables. This shields from potential miscompilations of the stage2 C front-end (we have a buggy stage1 compiler!).

   make stage      # This is just for simplicity
   cp -R stage1-powerpc*/* stage2-powerpc*/

Run stage2's regression tests (in this case I could have found the failing testcase from the PR, but I was disconnected from Internet):

   make stage2-start ; make -C gcc check-fortran

As soon as a test fails, make sure it did not fail in stage1.

make stage1-start ; make -C gcc check-fortran RUNTESTFLAGS=dg.exp=complex_intrinsic_1.f90

Find out the command line to f951 (in reality, I cut & pasted from the dejagnu log file and just added -### to the end).

gcc/gfortran -Bgcc ../gcc//testsuite/gfortran.dg/complex_intrinsic_1.f90 -S -###

Ok, we are ready to debug. In this case, I prefer to have two distinct debuggers, and having directories names stage1-gcc and stage2-gcc actually helps me. Hence the first make invocation.

   make stage
   cp ../gcc/testsuite/gfortran.dg/complex_intrinsic_1.f90 aaa.f90
   stage1-gcc/f951 aaa.f90 -fPIC -o stage1.s
   stage2-gcc/f951 aaa.f90 -fPIC -o stage2.s
   diff stage1.s stage2.s

This was just to be sure that I identified a failure mode. After reducing the testcase a bit, I set to find the front-end miscompilation.

   gdb --args stage1-gcc/f951 aaa.f90 -o stage1.s
   gdb --args stage2-gcc/f951 aaa.f90 -o stage2.s

... some time later a.c contains the reduced testcase for the Fortran front-end miscompilation, and I don't need anymore to work with two stages at a time. Working in a gcc directory now will be like working in a non-bootstrapped build.

   make stage1-start
   cd gcc
   gdb --args ./cc1 -O2 -o - ../a.c

... fix bug in combine.c ...

   make cc1
   ./cc1 -O2 -o - ../a.c

... seems fixed ...

   ./xgcc -B. -O2 -o test ../a.c
   ./test

Ok, looks like I'm done. Since stage1 miscompiled stage2, I expect many if not all object files to change, and I cannot do a bubblestrap. There is no equivalent of `make restrap', so I manually delete stage2.

   cd ..
   rm -rf stage2-* stage1-powerpc*
   make bootstrap
   make -k check

(It occurs now to me that restrap is easy to implement, so I will submit a patch as soon as the queue is exhausted). A few hours later... yay, bug fixed!

Paolo

Reply via email to