> On 23 Jul 2019, at 21:31, Iain Sandoe <i...@sandoe.co.uk> wrote: > > This is about 32/64b host and multilib support across the range of Darwin > systems. > > Prior to Darwin8 (OS X 10.4), the toolchains support only PowerPC and only > 32b. > > On Darwin8 it is possible to target a 64b multilib, but with support limited > to a few of the main libraries on the system (not a recommended > configuration). > > From Darwin9 to Darwin17 (OSX 10.5 to 10.13) it is possible to have either > 32 or 64b hosted toolchains, with support for a 64 or 32b multilib > respectively. > > On Darwin9 the kernel is 32b, but with support for 64b executables, so it's > conventional to build a 32b host toolchain supporting a 64b multilib. However > this is not enforced (merely a convention). > > There is also some platform hardware supporting Darwin10/11 which is only 32b > and for which the same situation applies. However, from Darwin10 to Darwin17, > the majority of platform hardware supports a 64b kernel and it's conventional > to build a 64b host toolchain with support for a 32b multilib. > > On/from Darwin18 (OS X 10.14), the development headers (in the SDK) no longer > expose the interfaces for the 32b multilib support (although sufficient > runtime > support remains installed that the testsuite can be run for a 32b multilib). > > The PR is raised against this latter situation since the absence of exposed > interfaces causes a 'default' bootstrap fail regardless of the availability of > the runtimes. Given the number of permutations, I felt it warranted a general > solution, especially since the current scheme of target headers and t-make > fragments has become somewhat messy. > > The changes here enforce the single 32b PowerPC multilib for Darwin < 8 and > the > single X86 64b multilib for Darwin >= 18. This means that there is no longer > any need to configure Darwin18+ '--disable-multilib', but also that if you > want > to use the ability to continue to test the compiler's 32b multilib there, you > need to make a configuration targeting an earlier OS version (and using the > SDK from that). > > It has been tested across a range of Darwin systems (back to Darwin9, since > self- > hosting on Darwin8 and 7 is currently in need of some tweaks). > > applied to mainline > thanks > Iain
I missed committing the changes to one file and some comments, and failed to add the patch here too. corrected below. Iain > > gcc/ > > PR bootstrap/87030 > * config.gcc (*-*-darwin*): Don't include CPU t-darwin here. > (i[34567]86-*-darwin*): Adjust to use biarch files. Produce > an error message if i686-darwin configuration is attempted for > Darwin >= 18. > (x86_64-*-darwin*): Switch to single multilib for Darwin >= 18. > (powerpc-*-darwin*): Use biarch files where needed. > (powerpc64-*-darwin*): Likewise. > * config/i386/darwin.h (REAL_LIBGCC_SPEC): Move to new biarch file. > (DARWIN_ARCH_SPEC, DARWIN_SUBARCH_SPEC): Revise for default single > arch case. > * config/i386/darwin32-biarch.h: New. > * config/i386/darwin64.h: Rename. > * gcc/config/i386/darwin64-biarch.h: To this. > * config/i386/t-darwin: Rename. > * gcc/config/i386/t-darwin32-biarch: To this. > * config/i386/t-darwin64: Rename. > * gcc/config/i386/t-darwin64-biarch: To this. > * config/rs6000/darwin32-biarch.h: New. > * config/rs6000/darwin64.h: Rename. > * config/rs6000/darwin64-biarch.h: To this. > (DARWIN_ARCH_SPEC, DARWIN_SUBARCH_SPEC): Revise for default single > arch case. > * config/rs6000/t-darwin8: Rename. > * config/rs6000/t-darwin32-biarch: To this. > * config/rs6000/t-darwin64 Rename. > * config/rs6000/t-darwin64-biarch: To this diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index 93bd5588b8..fea3f73854 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -139,9 +139,6 @@ along with GCC; see the file COPYING3. If not see " ASM_OPTIONS " -force_cpusubtype_ALL \ %{static}" ASM_MMACOSX_VERSION_MIN_SPEC -#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}" -#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC - #undef ENDFILE_SPEC #define ENDFILE_SPEC \ "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ @@ -149,12 +146,15 @@ along with GCC; see the file COPYING3. If not see %{mpc64:crtprec64.o%s} \ %{mpc80:crtprec80.o%s}" TM_DESTRUCTOR +#define DARWIN_ARCH_SPEC "x86_64" + +/* We default to x86_64 for single-arch builds, bi-arch overrides. */ #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ DARWIN_EXTRA_SPECS \ - { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ { "darwin_crt2", "" }, \ - { "darwin_subarch", DARWIN_SUBARCH_SPEC }, + { "darwin_subarch", DARWIN_ARCH_SPEC }, /* The Darwin assembler mostly follows AT&T syntax. */ #undef ASSEMBLER_DIALECT diff --git a/gcc/config/i386/darwin32-biarch.h b/gcc/config/i386/darwin32-biarch.h new file mode 100644 index 0000000000..b7f53bf2c8 --- /dev/null +++ b/gcc/config/i386/darwin32-biarch.h @@ -0,0 +1,32 @@ +/* Target definitions for i386 running Darwin. + Copyright (C) 2019 Free Software Foundation, Inc. + Contributed by Apple Computer Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#undef DARWIN_ARCH_SPEC +#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}" + +#undef DARWIN_SUBARCH_SPEC +#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", "" }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/i386/darwin64.h b/gcc/config/i386/darwin64-biarch.h similarity index 100% rename from gcc/config/i386/darwin64.h rename to gcc/config/i386/darwin64-biarch.h diff --git a/gcc/config/i386/t-darwin b/gcc/config/i386/t-darwin32-biarch similarity index 100% rename from gcc/config/i386/t-darwin rename to gcc/config/i386/t-darwin32-biarch diff --git a/gcc/config/i386/t-darwin64 b/gcc/config/i386/t-darwin64-biarch similarity index 100% rename from gcc/config/i386/t-darwin64 rename to gcc/config/i386/t-darwin64-biarch diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h index 1bfb577750..ee44236961 100644 --- a/gcc/config/rs6000/darwin.h +++ b/gcc/config/rs6000/darwin.h @@ -117,11 +117,10 @@ extern int darwin_emit_picsym_stub; %<faltivec %<fno-altivec " \ DARWIN_CC1_SPEC -#define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}" +/* Default to PPC for single arch builds. */ +#define DARWIN_ARCH_SPEC "ppc" #define DARWIN_SUBARCH_SPEC " \ - %{m64: ppc64} \ - %{!m64: \ %{mcpu=601:ppc601; \ mcpu=603:ppc603; \ mcpu=603e:ppc603; \ @@ -136,7 +135,7 @@ extern int darwin_emit_picsym_stub; mcpu=970:ppc970; \ mcpu=power4:ppc970; \ mcpu=G5:ppc970; \ - :ppc}}" + :ppc}" /* We need to jam the crt to 10.5 for 10.6 (Rosetta) use. */ #undef DARWIN_CRT1_SPEC diff --git a/gcc/config/rs6000/darwin32-biarch.h b/gcc/config/rs6000/darwin32-biarch.h new file mode 100644 index 0000000000..35ea0752c8 --- /dev/null +++ b/gcc/config/rs6000/darwin32-biarch.h @@ -0,0 +1,49 @@ +/* Target definitions for PowerPC running Darwin (Mac OS X). + Copyright (C) 2006-2019 Free Software Foundation, Inc. + Contributed by Apple Computer Inc. + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + +#undef DARWIN_ARCH_SPEC +#define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}" + +#undef DARWIN_SUBARCH_SPEC +#define DARWIN_SUBARCH_SPEC " \ + %{m64: ppc64} \ + %{!m64: \ + %{mcpu=601:ppc601; \ + mcpu=603:ppc603; \ + mcpu=603e:ppc603; \ + mcpu=604:ppc604; \ + mcpu=604e:ppc604e; \ + mcpu=740:ppc750; \ + mcpu=750:ppc750; \ + mcpu=G3:ppc750; \ + mcpu=7400:ppc7400; \ + mcpu=G4:ppc7400; \ + mcpu=7450:ppc7450; \ + mcpu=970:ppc970; \ + mcpu=power4:ppc970; \ + mcpu=G5:ppc970; \ + :ppc}}" + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", DARWIN_CRT2_SPEC }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/rs6000/darwin64.h b/gcc/config/rs6000/darwin64-biarch.h similarity index 74% rename from gcc/config/rs6000/darwin64.h rename to gcc/config/rs6000/darwin64-biarch.h index a131ff20bb..9f72524c7e 100644 --- a/gcc/config/rs6000/darwin64.h +++ b/gcc/config/rs6000/darwin64-biarch.h @@ -1,4 +1,4 @@ -/* Target definitions for PowerPC running Darwin (Mac OS X). +/* Target definitions for PowerPC64 running Darwin (Mac OS X). Copyright (C) 2006-2019 Free Software Foundation, Inc. Contributed by Apple Computer Inc. @@ -25,8 +25,13 @@ #undef DARWIN_ARCH_SPEC #define DARWIN_ARCH_SPEC "%{m32:ppc;:ppc64}" +/* Actually, there's really only 970 as an active option. */ #undef DARWIN_SUBARCH_SPEC #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC -#undef DARWIN_CRT2_SPEC -#define DARWIN_CRT2_SPEC "" +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", "" }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/rs6000/t-darwin8 b/gcc/config/rs6000/t-darwin32-biarch similarity index 100% rename from gcc/config/rs6000/t-darwin8 rename to gcc/config/rs6000/t-darwin32-biarch diff --git a/gcc/config/rs6000/t-darwin64 b/gcc/config/rs6000/t-darwin64-biarch similarity index 100% rename from gcc/config/rs6000/t-darwin64 rename to gcc/config/rs6000/t-darwin64-biarch 2019-07-24 Iain Sandoe <i...@sandoe.co.uk> gcc/ PR bootstrap/87030 * config/i386/darwin.h (REAL_LIBGCC_SPEC): Move from here... * config/i386/darwin32-biarch.h .. to here. * config/i386/darwin64-biarch.h: Adjust comments. * config/rs6000/darwin32-biarch.h: Likewise. * config/rs6000/darwin64-biarch.h: Likewise. * config.gcc: Missed commit from r273746 (*-*-darwin*): Don't include CPU t-darwin here. (i[34567]86-*-darwin*): Adjust to use biarch files. Produce an error message if i686-darwin configuration is attempted for Darwin >= 18. diff --git a/gcc/config.gcc b/gcc/config.gcc index 58262e5b86..e55c67a424 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -673,7 +673,7 @@ x86_cpus="generic intel" # Common parts for widely ported systems. case ${target} in *-*-darwin*) - tmake_file="t-darwin ${cpu_type}/t-darwin" + tmake_file="t-darwin " tm_file="${tm_file} darwin.h" case ${target} in *-*-darwin9*) @@ -1645,16 +1645,25 @@ hppa[12]*-*-hpux11*) dwarf2=no fi ;; +i[34567]86-*-darwin1[89]*) + echo "Error: 32bit target is not supported after Darwin17" 1>&2 + ;; i[34567]86-*-darwin*) need_64bit_isa=yes # Baseline choice for a machine that allows m64 support. with_cpu=${with_cpu:-core2} + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + ;; +x86_64-*-darwin1[89]* | x86_64-*-darwin2[01]*) + # Only 64b from now + with_cpu=${with_cpu:-core2} tmake_file="${tmake_file} t-slibgcc" ;; x86_64-*-darwin*) with_cpu=${with_cpu:-core2} - tmake_file="${tmake_file} ${cpu_type}/t-darwin64 t-slibgcc" - tm_file="${tm_file} ${cpu_type}/darwin64.h" + tmake_file="${tmake_file} ${cpu_type}/t-darwin64-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin64-biarch.h" ;; i[34567]86-*-elfiamcu) tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/iamcu.h" @@ -2616,24 +2625,31 @@ pdp11-*-*) # extra_headers= # ;; powerpc-*-darwin*) - extra_options="${extra_options} rs6000/darwin.opt" + extra_options="${extra_options} ${cpu_type}/darwin.opt" case ${target} in - *-darwin1[0-9]* | *-darwin[8-9]*) - tmake_file="${tmake_file} rs6000/t-darwin8" - tm_file="${tm_file} rs6000/darwin8.h" + *-darwin1[0-9]* | *-darwin9*) + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + ;; + *-darwin8*) + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + tm_file="${tm_file} ${cpu_type}/darwin8.h" ;; *-darwin7*) - tm_file="${tm_file} rs6000/darwin7.h" + tm_file="${tm_file} ${cpu_type}/darwin7.h" ;; - *-darwin[0-6]*) + *-darwin[456]*) + # Earlier - ingle arch, with 32b only + # OS X 10.0, the first edition is Darwin4 ;; esac tmake_file="${tmake_file} t-slibgcc" ;; powerpc64-*-darwin*) extra_options="${extra_options} ${cpu_type}/darwin.opt" - tmake_file="${tmake_file} ${cpu_type}/t-darwin64 t-slibgcc" - tm_file="${tm_file} ${cpu_type}/darwin8.h ${cpu_type}/darwin64.h" + tmake_file="${tmake_file} ${cpu_type}/t-darwin64-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin64-biarch.h" ;; powerpc*-*-freebsd*) tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h ${fbsd_tm_file} rs6000/sysv4.h" diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index fea3f73854..d9c8f200b9 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -39,32 +39,6 @@ along with GCC; see the file COPYING3. If not see #endif #endif -/* WORKAROUND pr80556: - For x86_64 Darwin10 and later, the unwinder is in libunwind (redirected - from libSystem). This doesn't use the keymgr (see keymgr.c) and therefore - the calls that libgcc makes to obtain the KEYMGR_GCC3_DW2_OBJ_LIST are not - updated to include new images, and might not even be valid for a single - image. - Therefore, for 64b exes at least, we must use the libunwind implementation, - even when static-libgcc is specified. We put libSystem first so that - unwinder symbols are satisfied from there. */ -#undef REAL_LIBGCC_SPEC -#define REAL_LIBGCC_SPEC \ - "%{static-libgcc|static: \ - %{m64:%:version-compare(>= 10.6 mmacosx-version-min= -lSystem)} \ - -lgcc_eh -lgcc; \ - shared-libgcc|fexceptions|fgnu-runtime: \ - %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4) \ - %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ - %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ - %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ - -lgcc ; \ - :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ - %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ - %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ - %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ - -lgcc }" - /* Size of the Obj-C jump buffer. */ #define OBJC_JBLEN ((TARGET_64BIT) ? ((9 * 2) + 3 + 16) : (18)) diff --git a/gcc/config/i386/darwin32-biarch.h b/gcc/config/i386/darwin32-biarch.h index b7f53bf2c8..8dcc4a3b0b 100644 --- a/gcc/config/i386/darwin32-biarch.h +++ b/gcc/config/i386/darwin32-biarch.h @@ -1,6 +1,6 @@ -/* Target definitions for i386 running Darwin. +/* Target definitions for i386 running Darwin with a 32b host and supporting + a 64b multilib. Copyright (C) 2019 Free Software Foundation, Inc. - Contributed by Apple Computer Inc. This file is part of GCC. @@ -21,6 +21,32 @@ along with GCC; see the file COPYING3. If not see #undef DARWIN_ARCH_SPEC #define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}" +/* WORKAROUND pr80556: + For x86_64 Darwin10 and later, the unwinder is in libunwind (redirected + from libSystem). This doesn't use the keymgr (see keymgr.c) and therefore + the calls that libgcc makes to obtain the KEYMGR_GCC3_DW2_OBJ_LIST are not + updated to include new images, and might not even be valid for a single + image. + Therefore, for 64b exes at least, we must use the libunwind implementation, + even when static-libgcc is specified. We put libSystem first so that + unwinder symbols are satisfied from there. */ +#undef REAL_LIBGCC_SPEC +#define REAL_LIBGCC_SPEC \ + "%{static-libgcc|static: \ + %{m64:%:version-compare(>= 10.6 mmacosx-version-min= -lSystem)} \ + -lgcc_eh -lgcc; \ + shared-libgcc|fexceptions|fgnu-runtime: \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4) \ + %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ + -lgcc ; \ + :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ + %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ + -lgcc }" + #undef DARWIN_SUBARCH_SPEC #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC diff --git a/gcc/config/i386/darwin64-biarch.h b/gcc/config/i386/darwin64-biarch.h index ebd65f9420..5af7665c2a 100644 --- a/gcc/config/i386/darwin64-biarch.h +++ b/gcc/config/i386/darwin64-biarch.h @@ -1,4 +1,5 @@ -/* Target definitions for x86_64 running Darwin. +/* Target definitions for x86_64 running Darwin with a 64b host supporting a + 32b multilib. Copyright (C) 2006-2019 Free Software Foundation, Inc. Contributed by Apple Computer Inc. diff --git a/gcc/config/rs6000/darwin32-biarch.h b/gcc/config/rs6000/darwin32-biarch.h index 35ea0752c8..743aabfcea 100644 --- a/gcc/config/rs6000/darwin32-biarch.h +++ b/gcc/config/rs6000/darwin32-biarch.h @@ -1,6 +1,6 @@ -/* Target definitions for PowerPC running Darwin (Mac OS X). - Copyright (C) 2006-2019 Free Software Foundation, Inc. - Contributed by Apple Computer Inc. +/* Target definitions for PowerPC running Darwin (Mac OS X) for a 32b host + with a 64b miultilib. + Copyright (C) 2019 Free Software Foundation, Inc. This file is part of GCC. diff --git a/gcc/config/rs6000/darwin64-biarch.h b/gcc/config/rs6000/darwin64-biarch.h index 9f72524c7e..4f789544b9 100644 --- a/gcc/config/rs6000/darwin64-biarch.h +++ b/gcc/config/rs6000/darwin64-biarch.h @@ -1,4 +1,5 @@ -/* Target definitions for PowerPC64 running Darwin (Mac OS X). +/* Target definitions for PowerPC64 running Darwin (Mac OS X) for a 64b host + supporting a 32b multilib. Copyright (C) 2006-2019 Free Software Foundation, Inc. Contributed by Apple Computer Inc.