This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] glibc / uclibc / bionic switch vs. non-Linux, GNU-based systems
On Dec 8, 2010, at 7:33 PM, Joseph S. Myers wrote:
> On Wed, 8 Dec 2010, Thomas Schwinge wrote:
>
>> Hallo!
>>
>> This patch makes GNU/Hurd buildable again. Previously, I had made this
>> Linux libc switch depend on Linux kernel only, but when Maxim added
>> support for bionic on 2010-05-27 in r159917, then it broke again, and I'm
>> now finally giving in... Let the libc options be there at run-time; we
>> simply won't use them.
>
> This alternative patch limits use of linux.opt to those targets for
> which it is relevant - that is, *-*-linux* (systems using the Linux
> kernel and an MMU-based ABI), as those are the systems for which
> alternative libcs may be available withing a single compiler
> configuration.
The patch looks OK to me, thanks for cleaning this up! Any global maintainer wishes to bless it?
Even though it may be debatable that MMU-less systems may benefit from multiple C libraries supported within a single compiler configuration, it's very clear that definitions of such C libraries and corresponding -m<library> options should be located outside of linux.opt.
--
Maxim Kuvyrkov
CodeSourcery
+1-650-331-3385 x724
>
> This patch works by defining SINGLE_LIBC (along with DEFAULT_LIBC) for
> the configurations without libc switching that might however use
> linux.h. In addition to those configurations fixed by your patch it
> also avoids problems with uClinux configurations that use linux.h
> needing to use linux.opt and define DEFAULT_LIBC individually; thus,
> it fixes the problems I recently noticed building for lm32-uclinux.
> It does not fix the underlying problem with linux.h being used for an
> ill-defined set of targets and needing splitting into "Linux kernel",
> "MMU-based Linux kernel" and "may use glibc" (or similar) parts.
>
> Tested building cc1 and xgcc for crosses to: i686-gnu
> i686-kfreebsd-gnu i686-knetbsd-gnu i686-kopensolaris-gnu bfin-uclinux
> moxie-uclinux lm32-uclinux m68k-uclinux alpha-linux-gnu
> powerpc-linux-gnu powerpc64-linux-gnu. OK to commit?
>
> 2010-12-08 Joseph Myers <joseph@codesourcery.com>
>
> * config/alpha/linux.h (OPTION_GLIBC): Define differently if
> SINGLE_LIBC.
> * config/linux.h (OPTION_GLIBC, OPTION_UCLIBC, OPTION_BIONIC):
> Define differently if SINGLE_LIBC.
> * config/rs6000/linux.h (OPTION_GLIBC): Define differently if
> SINGLE_LIBC.
> * config/rs6000/linux64.h (OPTION_GLIBC): Define differently if
> SINGLE_LIBC.
> * config.gcc (*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu |
> *-*-knetbsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu): Define
> DEFAULT_LIBC and SINGLE_LIBC instead of OPTION_GLIBC.
> (*-*-uclinux*): Define DEFAULT_LIBC and SINGLE_LIBC.
> (bfin*-uclinux*, moxie-*-uclinux*, m68k-*-uclinux*): Don't define
> DEFAULT_LIBC or use linux.opt.
>
> diff -rupN --exclude=.svn gcc-mainline-3/gcc/config/alpha/linux.h gcc-mainline/gcc/config/alpha/linux.h
> --- gcc-mainline-3/gcc/config/alpha/linux.h 2010-11-19 13:20:56.000000000 -0800
> +++ gcc-mainline/gcc/config/alpha/linux.h 2010-12-08 07:36:21.000000000 -0800
> @@ -61,7 +61,11 @@ along with GCC; see the file COPYING3.
> #undef WCHAR_TYPE
> #define WCHAR_TYPE "int"
>
> +#ifdef SINGLE_LIBC
> +#define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
> +#else
> #define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
> +#endif
>
> /* Determine whether the entire c99 runtime is present in the
> runtime library. */
> diff -rupN --exclude=.svn gcc-mainline-3/gcc/config/linux.h gcc-mainline/gcc/config/linux.h
> --- gcc-mainline-3/gcc/config/linux.h 2010-12-06 06:39:42.000000000 -0800
> +++ gcc-mainline/gcc/config/linux.h 2010-12-08 07:35:55.000000000 -0800
> @@ -80,9 +80,15 @@ see the files COPYING3 and COPYING.RUNTI
> #define LIB_SPEC LINUX_TARGET_LIB_SPEC
>
> /* C libraries supported on Linux. */
> +#ifdef SINGLE_LIBC
> +#define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
> +#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
> +#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
> +#else
> #define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
> #define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
> #define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
> +#endif
>
> #define LINUX_TARGET_OS_CPP_BUILTINS() \
> do { \
> diff -rupN --exclude=.svn gcc-mainline-3/gcc/config/rs6000/linux.h gcc-mainline/gcc/config/rs6000/linux.h
> --- gcc-mainline-3/gcc/config/rs6000/linux.h 2010-12-06 06:41:23.000000000 -0800
> +++ gcc-mainline/gcc/config/rs6000/linux.h 2010-12-08 07:36:41.000000000 -0800
> @@ -27,7 +27,11 @@
> /* We use glibc _mcount for profiling. */
> #define NO_PROFILE_COUNTERS 1
>
> +#ifdef SINGLE_LIBC
> +#define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
> +#else
> #define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
> +#endif
>
> /* glibc has float and long double forms of math functions. */
> #undef TARGET_C99_FUNCTIONS
> diff -rupN --exclude=.svn gcc-mainline-3/gcc/config/rs6000/linux64.h gcc-mainline/gcc/config/rs6000/linux64.h
> --- gcc-mainline-3/gcc/config/rs6000/linux64.h 2010-12-06 06:41:42.000000000 -0800
> +++ gcc-mainline/gcc/config/rs6000/linux64.h 2010-12-08 07:36:53.000000000 -0800
> @@ -308,7 +308,11 @@ extern int dot_symbols;
> process. */
> #define OS_MISSING_POWERPC64 !TARGET_64BIT
>
> +#ifdef SINGLE_LIBC
> +#define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
> +#else
> #define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
> +#endif
>
> /* glibc has float and long double forms of math functions. */
> #undef TARGET_C99_FUNCTIONS
> diff -rupN --exclude=.svn gcc-mainline-3/gcc/config.gcc gcc-mainline/gcc/config.gcc
> --- gcc-mainline-3/gcc/config.gcc 2010-12-06 03:31:49.000000000 -0800
> +++ gcc-mainline/gcc/config.gcc 2010-12-08 07:49:50.000000000 -0800
> @@ -562,7 +562,7 @@ case ${target} in
> *linux*)
> extra_options="$extra_options linux.opt";;
> *)
> - tm_defines="$tm_defines OPTION_GLIBC=1";;
> + tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC SINGLE_LIBC";;
> esac
> case $target in
> *-*-*android*)
> @@ -657,6 +657,7 @@ case ${target} in
> ;;
> *-*-uclinux*)
> use_gcc_stdint=wrap
> + tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC SINGLE_LIBC"
> ;;
> *-*-solaris2*)
> extra_options="${extra_options} sol2.opt"
> @@ -906,8 +907,6 @@ bfin*-elf*)
> bfin*-uclinux*)
> tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h glibc-stdint.h bfin/uclinux.h"
> tmake_file=bfin/t-bfin-uclinux
> - tm_defines="${tm_defines} DEFAULT_LIBC=LIBC_UCLIBC"
> - extra_options="${extra_options} linux.opt"
> use_collect2=no
> ;;
> bfin*-linux-uclibc*)
> @@ -989,8 +988,6 @@ moxie-*-uclinux*)
> tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h glibc-stdint.h moxie/uclinux.h"
> extra_parts="crti.o crtn.o crtbegin.o crtend.o"
> tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp"
> - tm_defines="${tm_defines} DEFAULT_LIBC=LIBC_UCLIBC"
> - extra_options="${extra_options} linux.opt"
> ;;
> moxie-*-rtems*)
> tmake_file="${tmake_file} moxie/t-moxie moxie/t-moxie-softfp soft-fp/t-softfp t-rtems"
> @@ -1726,8 +1723,7 @@ m68k-*-uclinux*) # Motorola m68k/ColdFi
> default_m68k_cpu=68020
> default_cf_cpu=5206
> tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h glibc-stdint.h flat.h m68k/linux.h m68k/uclinux.h ./sysroot-suffix.h"
> - tm_defines="${tm_defines} MOTOROLA=1 DEFAULT_LIBC=LIBC_UCLIBC"
> - extra_options="${extra_options} linux.opt"
> + tm_defines="${tm_defines} MOTOROLA=1"
> tmake_file="m68k/t-floatlib m68k/t-uclinux m68k/t-mlibs"
> ;;
> m68k-*-linux*) # Motorola m68k's running GNU/Linux
>
> --
> Joseph S. Myers
> joseph@codesourcery.com