On Thu, 28 Apr 2016, Jeff Law wrote: > On 04/28/2016 02:49 AM, Richard Biener wrote: > > > > The following prototype patch re-uses cc1-checksum.c from the > > previous stage when compiling stage-final. This eventually > > allows to compare cc1 from the last two stages to fix the > > lack of a true comparison when doing LTO bootstrap (it > > compiles LTO bytecode from the compile-stage there, not the > > final optimization result). > > > > Bootstrapped on x86_64-unknown-linux-gnu. > > > > When stripping gcc/cc1 and prev-gcc/cc1 after the bootstrap > > they now compare identical (with LTO bootstrap it should > > not require stripping as that doesn't do a bootstrap-debug AFAIK). > > > > Is sth like this acceptable? (consider it also done for cp/Make-lang.in) > > > > In theory we can compare all stage1 languages but I guess comparing > > the required ones for a LTO bootstrap, cc1, cc1plus and lto1 would > > be sufficient (or even just comparing one binary in which case > > comparing lto1 would not require any patches). > > > > This also gets rid of the annoying warning that cc1-checksum.o > > differs (obviously). > > > > Thanks, > > Richard. > > > > 2016-04-28 Richard Biener <rguent...@suse.de> > > > > c/ > > * Make-lang.in (cc1-checksum.c): For stage-final re-use > > the checksum from the previous stage. > I won't object if you add a comment into the fragment indicating why you're > doing this.
So the following is a complete patch (not considering people may add objc or obj-c++ to stage1 languages). Build with --disable-bootstrap, bootstrapped and profilebootstrapped with verifying it works as intended (looks like we don't compare with profiledbootstrap - huh, we're building stagefeedback only once) Ok for trunk? Step 2 will now be to figure out how to also compare cc1 (for example) when using bootstrap-lto ... (we don't want to do this unconditionally as it is a waste of time when the objects are not only LTO bytecode). Thanks, Richard. 2016-04-29 Richard Biener <rguent...@suse.de> c/ * Make-lang.in (cc1-checksum.c): For stage-final re-use the checksum from the previous stage. cp/ * Make-lang.in (cc1plus-checksum.c): For stage-final re-use the checksum from the previous stage. Index: gcc/c/Make-lang.in =================================================================== *** gcc/c/Make-lang.in (revision 235623) --- gcc/c/Make-lang.in (working copy) *************** c_OBJS = $(C_OBJS) cc1-checksum.o c/gccs *** 61,71 **** c-warn = $(STRICT_WARN) # compute checksum over all object files and the options cc1-checksum.c : build/genchecksum$(build_exeext) checksum-options \ $(C_OBJS) $(BACKEND) $(LIBDEPS) ! build/genchecksum$(build_exeext) $(C_OBJS) $(BACKEND) $(LIBDEPS) \ checksum-options > cc1-checksum.c.tmp && \ ! $(srcdir)/../move-if-change cc1-checksum.c.tmp cc1-checksum.c cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) \ --- 61,78 ---- c-warn = $(STRICT_WARN) # compute checksum over all object files and the options + # re-use the checksum from the prev-final stage so it passes + # the bootstrap comparison and allows comparing of the cc1 binary cc1-checksum.c : build/genchecksum$(build_exeext) checksum-options \ $(C_OBJS) $(BACKEND) $(LIBDEPS) ! if [ -f ../stage_final ] \ ! && cmp -s ../stage_current ../stage_final; then \ ! cp ../prev-gcc/cc1-checksum.c cc1-checksum.c; \ ! else \ ! build/genchecksum$(build_exeext) $(C_OBJS) $(BACKEND) $(LIBDEPS) \ checksum-options > cc1-checksum.c.tmp && \ ! $(srcdir)/../move-if-change cc1-checksum.c.tmp cc1-checksum.c; \ ! fi cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) \ Index: gcc/cp/Make-lang.in =================================================================== *** gcc/cp/Make-lang.in (revision 235623) --- gcc/cp/Make-lang.in (working copy) *************** c++_OBJS = $(CXX_OBJS) cc1plus-checksum. *** 90,100 **** cp-warn = $(STRICT_WARN) # compute checksum over all object files and the options cc1plus-checksum.c : build/genchecksum$(build_exeext) checksum-options \ $(CXX_OBJS) $(BACKEND) $(LIBDEPS) ! build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(LIBDEPS) \ checksum-options > cc1plus-checksum.c.tmp && \ ! $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ --- 90,107 ---- cp-warn = $(STRICT_WARN) # compute checksum over all object files and the options + # re-use the checksum from the prev-final stage so it passes + # the bootstrap comparison and allows comparing of the cc1 binary cc1plus-checksum.c : build/genchecksum$(build_exeext) checksum-options \ $(CXX_OBJS) $(BACKEND) $(LIBDEPS) ! if [ -f ../stage_final ] \ ! && cmp -s ../stage_current ../stage_final; then \ ! cp ../prev-gcc/cc1plus-checksum.c cc1plus-checksum.c; \ ! else \ ! build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(LIBDEPS) \ checksum-options > cc1plus-checksum.c.tmp && \ ! $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c; \ ! fi cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \