[Bug target/105144] New: [12 Regression] Bootstrap + install failure on aarch64 due to aarch64-tune.md likely since r12-7842

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Apr 4 07:58:36 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105144

            Bug ID: 105144
           Summary: [12 Regression] Bootstrap + install failure on aarch64
                    due to aarch64-tune.md likely since r12-7842
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

Latest Fedora package builds fail on aarch64, I believe it is caused by
r12-7842-g9f37d31324f89d0b7b2abac988a976d121ae29c6 (but haven't actually
bisected).  See e.g.
https://kojipkgs.fedoraproject.org//work/tasks/8070/85048070/build.log

We are doing a --with-build-config=bootstrap-lto --enable-link-serialization=1
profiledbootstrap with system gcc less than 4 weeks old gcc trunk snapshot.
What I see in the log is that it bootstraps just fine, then during make install
does:
/bin/sh ../../gcc/config/aarch64/gentune.sh \
        ../../gcc/config/aarch64/aarch64-cores.def > \
        tmp-aarch64-tune.md
/bin/sh ../../gcc/../move-if-change tmp-aarch64-tune.md \
        ../../gcc/config/aarch64/aarch64-tune.md
echo timestamp > s-aarch64-tune-md
which hasn't been done during the bootstrap time, this changes aarch64-tune.md
and so it rebuilds quite a few but not all *.o files but with the system g++
rather than the new compiler and ICEs on lto1 because there were silent changes
in the LTO bytecode between compiler from ~ 4 weeks ago and current one.
There are multiple issues related to this:
1) the r12-7842 change changed aarch64-cores.def (moved neoverse-n2 entry
later)
   but didn't regenerate and commit aarch64-tune.md
2) the reason why gentune.sh isn't invoked during bootstrap but is during
   install is I believe caused by:
# Dependencies for the md file.  The first time through, we just assume
# the md file itself and the generated dependency file (in order to get
# it built).  The second time through we have the dependency file.
-include mddeps.mk
MD_DEPS = s-mddeps $(md_file) $(MD_INCLUDES)

s-mddeps: $(md_file) $(MD_INCLUDES) build/genmddeps$(build_exeext)
        $(RUN_GEN) build/genmddeps$(build_exeext) $(md_file) > tmp-mddeps
        $(SHELL) $(srcdir)/../move-if-change tmp-mddeps mddeps.mk
        $(STAMP) s-mddeps
   When bootstrapping gcc into a fresh new object directory (well, set of them,
   like stage{1,2,3}-gcc, stageprofile-gcc, prev-gcc, gcc etc.),
   mddeps.mk doesn't
   exist and so isn't included and everything that depends on the *.md file(s)
   depends just on s-mddeps that creates the mddeps.mk, on the main $(md_file)
   (gcc/config/aarch64/aarch64.md in this case) and that is it.  Not a big deal
   the first time, as everything is being rebuild.  But for aarch64 it means
   that gentune.sh which is from:
$(srcdir)/config/aarch64/aarch64-tune.md: s-aarch64-tune-md; @true
s-aarch64-tune-md: $(srcdir)/config/aarch64/gentune.sh \
        $(srcdir)/config/aarch64/aarch64-cores.def
        $(SHELL) $(srcdir)/config/aarch64/gentune.sh \
                $(srcdir)/config/aarch64/aarch64-cores.def > \
                tmp-aarch64-tune.md
        $(SHELL) $(srcdir)/../move-if-change tmp-aarch64-tune.md \
                $(srcdir)/config/aarch64/aarch64-tune.md
        $(STAMP) s-aarch64-tune-md
   isn't invoked at that point.  Next during make install, mddeps.mk already
   exists and so it invokes it, regenerates it and as it is different,
   move-if-change overwrites it
3) I think it is wrong to change files in $(srcdir) or its subdirs during
   build except for --enable-maintainer-mode, users could have the tree
   in read-only location etc.


More information about the Gcc-bugs mailing list