>>>>> We currently have the problem that the compiler used in GUB for >>>>> compiling 32bit binaries gets an internal compiler fault for those >>>>> options. >>>>> >>>>> We'll need to figure out whether a newer compiler does the trick, and if >>>>> it does, update GUB. Or find a different way of proceeding. >>>>> >>>>> I'll see whether I can convince my current compilers to generate 32bit >>>>> code and see whether those are currently up to using those options. If >>>>> current compilers don't want them, we'll need to revert to a different >>>>> plan. >>>> >>>> It seems that static cast from `unsigned long long` to `double` >>>> by x86 SSE2 raises the internal compile error. >>>> However, static cast from `signed long long` to `double` >>>> does not raise the errir. >>>> I think it can be a workaround for rational.cc. >>>> >>>> i.e. >>>> First, static cast from `unsigned long long` to `signed long long` >>>> Then, static cast from `singed long long` to `double` >>> >>> Oh wow. I would never have thought one could identify something as >>> specific. I think I have convinced my system to build a 32bit Guile, >>> but have problems convincing LilyPond to do the same. So I cannot help >>> with debugging this situation yet or even finding out whether it >>> persists into newer compiler versions. >> >> I've attached the workaround patch for stable/2.20 branch. >> The results of my experiment is here. > > >>>From 2a3816e49067e026c7180dc6a3b2d5614d9c20d6 Mon Sep 17 00:00:00 2001 >> From: Masamichi Hosoda <truer...@trueroad.jp> >> Date: Tue, 4 Feb 2020 23:30:29 +0900 >> Subject: [PATCH] Add workaround for avoiding GUB darwin-x86 error >> >> In GUB, g++ 4.9.4 for darwin-x86 (macOS x86), >> it seems that static cast from `unsigned long long` to `double` >> by x86 SSE2 raises an internal compile error. >> However, static cast from `signed long long` to `double` >> does not raise the error. >> So we use it for a workaround. >> >> i.e. >> First, static cast from `unsigned long long` to `signed long long`. >> Then, static cast from `singed long long` to `double`. >> --- >> flower/rational.cc | 16 ++++++++++++++++ >> 1 file changed, 16 insertions(+) >> >> diff --git a/flower/rational.cc b/flower/rational.cc >> index 559e1646a0..9435edbb8f 100644 >> --- a/flower/rational.cc >> +++ b/flower/rational.cc >> @@ -31,7 +31,23 @@ double >> Rational::to_double () const >> { >> if (sign_ == -1 || sign_ == 1 || sign_ == 0) >> +// FIXME: workaround: In GUB, g++ 4.9.4 for darwin-x86, >> +// it seems that static cast from `unsigned long long` to `double` >> +// by x86 SSE2 raises an internal compile error. >> +// However, static cast from `signed long long` to `double` >> +// does not raise the error. >> +// So we use it for a workaround. >> +#if defined (__i386__) && defined (__APPLE__) && \ >> + defined (__SSE2_MATH__) && __GNUC__ < 5 > > Wouldn't the same problem occur on Windows? We have 32bit executables > there as well. Or is the compiler version we use there not afflicted?
Sorry, I forgot MinGW. The internal compiler error seems to raise only in darwin-x86. I don't have newer g++ for darwin-x86, so I'm not sure if it was fixed in the newer g++. without the patch: ``` $ ~gub/gub/target/darwin-x86/root/usr/cross/bin/i686-apple-darwin8-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc rational.cc:36:5: warning: floating constant exceeds range of 'double' [-Woverflow] return -HUGE_VAL; ^ rational.cc:38:5: warning: floating constant exceeds range of 'double' [-Woverflow] return HUGE_VAL; ^ rational.cc: In member function 'double Rational::to_double() const': rational.cc:43:1: internal compiler error: in gen_reg_rtx, at emit-rtl.c:838 } ^ 0x773934 gen_reg_rtx(machine_mode) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/emit-rtl.c:838 0xc53c53 gen_split_4130(rtx_def*, rtx_def**) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/config/i386/sse.md:884 0x7772a7 try_split(rtx_def*, rtx_def*, int) /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/emit-rtl.c:3444 0x8feb71 split_insn /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:2897 0x9034e4 split_all_insns() /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:2987 0x903578 rest_of_handle_split_after_reload /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:3938 0x903578 execute /home/gub/gub/target/darwin-x86/src/cross/gcc-4.9.4/gcc/recog.c:3967 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. $ ~gub/gub/target/linux-x86/root/usr/cross/bin/i686-linux-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/freebsd-x86/root/usr/cross/bin/i686-freebsd6-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/mingw/root/usr/cross/bin/i686-mingw32-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ``` with the patch: ``` $ ~gub/gub/target/darwin-x86/root/usr/cross/bin/i686-apple-darwin8-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc rational.cc:52:5: warning: floating constant exceeds range of 'double' [-Woverflow] return -HUGE_VAL; ^ rational.cc:54:5: warning: floating constant exceeds range of 'double' [-Woverflow] return HUGE_VAL; ^ $ ~gub/gub/target/linux-x86/root/usr/cross/bin/i686-linux-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/freebsd-x86/root/usr/cross/bin/i686-freebsd6-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ~gub/gub/target/mingw/root/usr/cross/bin/i686-mingw32-g++ -c -msse2 -mfpmath=sse -I include -I .. rational.cc $ ``` g++ version: ``` $ ~gub/gub/target/darwin-x86/root/usr/cross/bin/i686-apple-darwin8-g++ --version i686-apple-darwin8-g++ (GCC) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ~gub/gub/target/linux-x86/root/usr/cross/bin/i686-linux-g++ --version i686-linux-g++ (GCC) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ~gub/gub/target/freebsd-x86/root/usr/cross/bin/i686-freebsd6-g++ --version i686-freebsd6-g++ (GCC) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ~gub/gub/target/mingw/root/usr/cross/bin/i686-mingw32-g++ --version i686-mingw32-g++ (GCC) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ```