Date: Fri, 13 May 2016 14:20:57 -0700 From: Bryan Drewery <bdrewery@FreeBSD.org> To: toolchain@FreeBSD.org Cc: arch@FreeBSD.org Subject: universe/buildworld: Skipping building cross clang when /usr/bin/cc matches the source tree. Message-ID: <9c5bdbae-9faf-1f16-8358-e35f5e079426@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
Review at: https://reviews.freebsd.org/D6357 Full patch: https://people.freebsd.org/~bdrewery/patches/skip-clang-bootstrap-1.diff For context, when using an external compiler with our build currently it will use --sysroot/-L/-B flags as well as -target with clang. GCC assumes it is building the same arch as the compiler is built for since it lacks -target support. [This is just my commit message but I think it explains it well enough] Opportunistically skip building a cross-compiler with SMART_CROSS_COMPILER set. This will still build the compiler for the target but will not build the bootstrap cross-compiler in the cross-tools phase. Other toolchain bootstrapping, such as elftoolchan an binutils, currently still occurs. This will utilize the default CC (cc, /usr/bin/cc) as an external compile= r. This is planned to be on-by-default eventually. This will utilize the __FreeBSD_cc_version compiler macro defined in the source tree and compare it to CC's version. If they match then the cross-compiler is skipped. If [X]CC is an external compiler (absolute path) or WITHOUT_CROSS_COMPILER is already set, then this logic is skippe= d. If the expected bootstrap compiler type no longer matches the found CC compiler type (clang vs gcc), then the logic is skipped. As an extra safety check the version number is also compared from the compiler to the tree version. Clang: The macro FREEBSD_CC_VERSION is defined in: lib/clang/include/clang/Basic/Version.inc For clang -target will be used if TARGET_ARCH !=3D MACHINE_ARCH. This is from the current external toolchain logic. There is currently an assumption that the host compiler can build the TARGET_ARCH. This will usually be the case since we don't conditionalize target arch support in clang, but it will break when introducing new architectures. This problem is mitigated by incrementing the version when adding new architectures. GCC: The macro FBSD_CC_VER is defined in: gnu/usr.bin/cc/cc_tools/freebsd-native.h For GCC there is no simple -target support when TARGET_ARCH !=3D MACHINE_ARCH. In this case the opportunistic skip is not done. If we add proper support for this case in external toolchain logic then it will be fine to enable. This relies on the macros being incremented whenever any change occurs to these compilers that warrant rebuilding files. It also should never repeat earlier values. This also depends on http://reviews.llvm.org/D20037 and a change such as this: > index 94dc282..373cdb4 100644 > --- lib/clang/include/clang/Basic/Version.inc > +++ lib/clang/include/clang/Basic/Version.inc > @@ -8,3 +8,5 @@ > #define CLANG_VENDOR "FreeBSD " >=20 > #define SVN_REVISION "262564" > + > +#define FREEBSD_CC_VERSION 1100001U Here is a ministat as well (no ccache and clean build on all 6 builds). It's kind of obvious that skipping one of the clangs helps but I wanted to show how much it did for me: > x before > + after > +----------------------------------------------------------------------= ----+ > | + = x| > |+ + = x| > ||AM| = A| > +----------------------------------------------------------------------= ----+ > N Min Max Median Avg St= ddev > x 3 2966 2968 2966 2966.6667 1.154= 7005 > + 3 2300 2319 2318 2312.3333 10.69= 2677 > Difference at 95.0% confidence > -654.333 +/- 17.2371 > -22.0562% +/- 0.581024% > (Student's t, pooled s =3D 7.60482) This also works for universe! > ~/git/freebsd # grep SMART _*.buildworld > _.amd64.amd64.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" lin= e 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache c= c matches the source tree. Not bootstrapping a cross-compiler. > _.arm.arm.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" line 14= 4: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache cc ma= tches the source tree. Not bootstrapping a cross-compiler. > _.arm.armeb.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" line = 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache cc = matches the source tree. Not bootstrapping a cross-compiler. > _.arm.armv6.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" line = 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache cc = matches the source tree. Not bootstrapping a cross-compiler. > _.arm.armv6hf.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" lin= e 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache c= c matches the source tree. Not bootstrapping a cross-compiler. > _.i386.i386.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" line = 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache cc = matches the source tree. Not bootstrapping a cross-compiler. > _.pc98.i386.buildworld:make[2]: "/root/git/freebsd/Makefile.inc1" line = 144: SMART_CROSS_COMPILER: Determined that CC=3D/usr/local/bin/ccache cc = matches the source tree. Not bootstrapping a cross-compiler. A future improvement will be to build 1 clang before universe if /usr/bin/cc cannot be used. It will not be a cross-compiler but just a staged (in OBJDIR) external compiler that will use -target. I won't give GCC the same treatment since it lacks the nice -target support. --=20 Regards, Bryan Drewery
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9c5bdbae-9faf-1f16-8358-e35f5e079426>