This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Add --with-abi= support to x86_64-*-*


On Fri, Mar 2, 2012 at 10:00 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> This patch adds --with-abi= support to x86_64-*-* to configure GCC with
>
> --with-abi=x32
> --with-abi=mx32
> --with-multilib-list=mx32
>
> to set the default ABI to x32. ?In i386 backend, ISA_64BIT is used to
> generate i386 code or x86-64 code. ?This patch adds a new bit,
> ISA_X86_64 to generate 32bit x86-64 code or 64bit x86-64 code. ?Now it
> has
>
> OPTION_MASK_ISA_64BIT ? ? ? ? ? 32bit x86-64 code or 64bit x86-64 code
> OPTION_MASK_ISA_X86_64 ? ? ? ? ?64bit x86-64 code
> OPTION_MASK_ISA_X32 ? ? ? ? ? ? 32bit x86-64 code
>
> It also extends TARGET_BI_ARCH to support
>
> TARGET_BI_ARCH == 1, by default, OPTION_MASK_ISA_X86_64
> TARGET_BI_ARCH == 2, by default, OPTION_MASK_ISA_X32
>
> I also added check --with-multilib-list for x86-64 Linux targets only if
> multilib is enabled.
>
> Tested on Linux/x32. ?OK for trunk?
>
> Thanks.
>
>
> H.J.
> ---
> 2012-03-02 ?H.J. Lu ?<hongjiu.lu@intel.com>
>
> ? ? ? ?* config.gcc: Use i386/biarchx32.h instead of i386/biarch64.h
> ? ? ? ?for --with-abi={x32|mx32} or --with-multilib-list=mx32.
> ? ? ? ?(supported_defaults): Add abi for i[34567]86-*-* and x86_64-*-*.
> ? ? ? ?Check --with-multilib-list for x86-64 Linux targets only if
> ? ? ? ?multilib is enabled.
>
> ? ? ? ?* config/i386/biarch64.h (TARGET_64BIT_DEFAULT): Add
> ? ? ? ?OPTION_MASK_ISA_X86_64.
>
> ? ? ? ?* config/i386/biarchx32.h: New.
>
> ? ? ? ?* config/i386/gnu-user64.h (SPEC_64): Support TARGET_BI_ARCH == 2.
> ? ? ? ?(SPEC_X32): Likewise.
> ? ? ? ?(MULTILIB_DEFAULTS): Likewise.
>
> ? ? ? ?* config/i386/i386.c (ix86_option_override_internal): Properly
> ? ? ? ?set OPTION_MASK_ISA_64BIT and OPTION_MASK_ISA_X32 as well as
> ? ? ? ?handle -m32, -m64 and -mx32.
>
> ? ? ? ?* config/i386/i386.h (TARGET_X86_64): New.
> ? ? ? ?(TARGET_LP64): Changed to TARGET_X86_64.
>
> ? ? ? ?* config/i386/i386.opt (m64): Replace ISA_64BIT with ISA_X86_64.
> ? ? ? ?(mx86-64): New.
>
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 99f0b47..5010739 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -486,6 +486,10 @@ fi
>
> ?case ${target} in
> ?i[34567]86-*-*)
> + ? ? ? if test "x$with_abi" != x; then
> + ? ? ? ? ? ? ? echo "This target does not support --with-abi."
> + ? ? ? ? ? ? ? exit 1
> + ? ? ? fi
> ? ? ? ?if test "x$enable_cld" = xyes; then
> ? ? ? ? ? ? ? ?tm_defines="${tm_defines} USE_IX86_CLD=1"
> ? ? ? ?fi
> @@ -495,7 +499,24 @@ i[34567]86-*-*)
> ? ? ? ?tm_file="vxworks-dummy.h ${tm_file}"
> ? ? ? ?;;
> ?x86_64-*-*)
> - ? ? ? tm_file="i386/biarch64.h ${tm_file}"
> + ? ? ? case ${with_abi} in
> + ? ? ? "")
> + ? ? ? ? ? ? ? if test "x$with_multilib_list" = xmx32; then
> + ? ? ? ? ? ? ? ? ? ? ? tm_file="i386/biarchx32.h ${tm_file}"
> + ? ? ? ? ? ? ? else
> + ? ? ? ? ? ? ? ? ? ? ? tm_file="i386/biarch64.h ${tm_file}"
> + ? ? ? ? ? ? ? fi
> + ? ? ? ? ? ? ? ;;
> + ? ? ? 64 | m64)
> + ? ? ? ? ? ? ? tm_file="i386/biarch64.h ${tm_file}"
> + ? ? ? ? ? ? ? ;;
> + ? ? ? x32 | mx32)
> + ? ? ? ? ? ? ? tm_file="i386/biarchx32.h ${tm_file}"
> + ? ? ? ? ? ? ? ;;
> + ? ? ? *)
> + ? ? ? ? ? ? ? echo "Unknown ABI used in --with-abi=$with_abi"
> + ? ? ? ? ? ? ? exit 1
> + ? ? ? esac
> ? ? ? ?if test "x$enable_cld" = xyes; then
> ? ? ? ? ? ? ? ?tm_defines="${tm_defines} USE_IX86_CLD=1"
> ? ? ? ?fi
> @@ -1304,22 +1325,24 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu)
> ? ? ? ? ? ? ? ?;;
> ? ? ? ?esac
> ? ? ? ?tmake_file="${tmake_file} i386/t-linux64"
> - ? ? ? x86_multilibs="${with_multilib_list}"
> - ? ? ? if test "$x86_multilibs" = "default"; then
> - ? ? ? ? ? ? ? x86_multilibs="m64,m32"
> + ? ? ? if test "x$enable_multilib" = "xyes"; then
> + ? ? ? ? ? ? ? x86_multilibs="${with_multilib_list}"
> + ? ? ? ? ? ? ? if test "$x86_multilibs" = "default"; then
> + ? ? ? ? ? ? ? ? ? ? ? x86_multilibs="m64,m32"
> + ? ? ? ? ? ? ? fi
> + ? ? ? ? ? ? ? x86_multilibs=`echo $x86_multilibs | sed -e 's/,/ /g'`
> + ? ? ? ? ? ? ? for x86_multilib in ${x86_multilibs}; do
> + ? ? ? ? ? ? ? ? ? ? ? case ${x86_multilib} in
> + ? ? ? ? ? ? ? ? ? ? ? m32 | m64 | mx32)
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TM_MULTILIB_CONFIG="${TM_MULTILIB_CONFIG},${x86_multilib}"
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;;
> + ? ? ? ? ? ? ? ? ? ? ? *)
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? echo "--with-multilib-list=${x86_with_multilib} not supported."
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exit 1
> + ? ? ? ? ? ? ? ? ? ? ? esac
> + ? ? ? ? ? ? ? done
> + ? ? ? ? ? ? ? TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'`
> ? ? ? ?fi
> - ? ? ? x86_multilibs=`echo $x86_multilibs | sed -e 's/,/ /g'`
> - ? ? ? for x86_multilib in ${x86_multilibs}; do
> - ? ? ? ? ? ? ? case ${x86_multilib} in
> - ? ? ? ? ? ? ? m32 | m64 | mx32)
> - ? ? ? ? ? ? ? ? ? ? ? TM_MULTILIB_CONFIG="${TM_MULTILIB_CONFIG},${x86_multilib}"
> - ? ? ? ? ? ? ? ? ? ? ? ;;
> - ? ? ? ? ? ? ? *)
> - ? ? ? ? ? ? ? ? ? ? ? echo "--with-multilib-list=${x86_with_multilib} not supported."
> - ? ? ? ? ? ? ? ? ? ? ? exit 1
> - ? ? ? ? ? ? ? esac
> - ? ? ? done
> - ? ? ? TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'`
> ? ? ? ?;;
> ?i[34567]86-pc-msdosdjgpp*)
> ? ? ? ?xm_file=i386/xm-djgpp.h
> @@ -3189,7 +3212,7 @@ case "${target}" in
> ? ? ? ? ? ? ? ?;;
>
> ? ? ? ?i[34567]86-*-* | x86_64-*-*)
> - ? ? ? ? ? ? ? supported_defaults="arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64"
> + ? ? ? ? ? ? ? supported_defaults="abi arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64"
> ? ? ? ? ? ? ? ?for which in arch arch_32 arch_64 cpu cpu_32 cpu_64 tune tune_32 tune_64; do
> ? ? ? ? ? ? ? ? ? ? ? ?eval "val=\$with_$which"
> ? ? ? ? ? ? ? ? ? ? ? ?case ${val} in
> diff --git a/gcc/config/i386/biarch64.h b/gcc/config/i386/biarch64.h
> index 629ec98..3dc9889 100644
> --- a/gcc/config/i386/biarch64.h
> +++ b/gcc/config/i386/biarch64.h
> @@ -25,5 +25,5 @@ a copy of the GCC Runtime Library Exception along with this program;
> ?see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
> ?<http://www.gnu.org/licenses/>. ?*/
>
> -#define TARGET_64BIT_DEFAULT OPTION_MASK_ISA_64BIT
> +#define TARGET_64BIT_DEFAULT (OPTION_MASK_ISA_64BIT | OPTION_MASK_ISA_X86_64)
> ?#define TARGET_BI_ARCH 1
> diff --git a/gcc/config/i386/biarchx32.h b/gcc/config/i386/biarchx32.h
> new file mode 100644
> index 0000000..963e390
> --- /dev/null
> +++ b/gcc/config/i386/biarchx32.h
> @@ -0,0 +1,28 @@
> +/* Make configure files to produce biarch compiler defaulting to x32 mode.
> + ? This file must be included very first, while the OS specific file later
> + ? to overwrite otherwise wrong defaults.
> + ? Copyright (C) 2012 Free Software Foundation, 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.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
> +<http://www.gnu.org/licenses/>. ?*/
> +
> +#define TARGET_64BIT_DEFAULT (OPTION_MASK_ISA_64BIT | OPTION_MASK_ISA_X32)
> +#define TARGET_BI_ARCH 2
> diff --git a/gcc/config/i386/gnu-user64.h b/gcc/config/i386/gnu-user64.h
> index 954f3b2..6f7b5de 100644
> --- a/gcc/config/i386/gnu-user64.h
> +++ b/gcc/config/i386/gnu-user64.h
> @@ -58,8 +58,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
>
> ?#if TARGET_64BIT_DEFAULT
> ?#define SPEC_32 "m32"
> +#if TARGET_BI_ARCH == 2
> +#define SPEC_64 "m64"
> +#define SPEC_X32 "m32|m64:;"
> +#else
> ?#define SPEC_64 "m32|mx32:;"
> ?#define SPEC_X32 "mx32"
> +#endif
> ?#else
> ?#define SPEC_32 "m64|mx32:;"
> ?#define SPEC_64 "m64"
> @@ -95,7 +100,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
> ? ?%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
>
> ?#if TARGET_64BIT_DEFAULT
> +#if TARGET_BI_ARCH == 2
> +#define MULTILIB_DEFAULTS { "mx32" }
> +#else
> ?#define MULTILIB_DEFAULTS { "m64" }
> +#endif
> ?#else
> ?#define MULTILIB_DEFAULTS { "m32" }
> ?#endif
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index f93583f..4b6ceab 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -3097,8 +3097,45 @@ ix86_option_override_internal (bool main_args_p)
> ? SUBSUBTARGET_OVERRIDE_OPTIONS;
> ?#endif
>
> + ?/* Turn off both OPTION_MASK_ISA_X86_64 and OPTION_MASK_ISA_X32 if
> + ? ? TARGET_64BIT is false. ?*/
> + ?if (!TARGET_64BIT)
> + ? ?ix86_isa_flags &= ~(OPTION_MASK_ISA_X86_64 | OPTION_MASK_ISA_X32);
> +#ifdef TARGET_BI_ARCH
> + ?else
> + ? ?{
> +#if TARGET_BI_ARCH == 1
> + ? ? ?/* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ISA_X86_64
> + ? ? ? ?is on and OPTION_MASK_ISA_X32 is off. ?We turn off
> + ? ? ? ?OPTION_MASK_ISA_X86_64 if OPTION_MASK_ISA_X32 is turned on by
> + ? ? ? ?-mx32. ?*/
> + ? ? ?if (TARGET_X32)
> + ? ? ? ix86_isa_flags &= ~OPTION_MASK_ISA_X86_64;
> +#else
> + ? ? ?/* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ISA_X32 is
> + ? ? ? ?on and OPTION_MASK_ISA_X86_64 is off. ?We turn off
> + ? ? ? ?OPTION_MASK_ISA_X32 if OPTION_MASK_ISA_X86_64 is turned on by
> + ? ? ? ?-m64. ?*/
> + ? ? ?if (TARGET_X86_64)
> + ? ? ? ix86_isa_flags &= ~OPTION_MASK_ISA_X32;
> +#endif
> + ? ?}
> +#endif
> +
> ? if (TARGET_X32)
> - ? ?ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
> + ? ?{
> + ? ? ?/* Always turn on OPTION_MASK_ISA_64BIT and turn off
> + ? ? ? ?OPTION_MASK_ISA_X86_64 for TARGET_X32. ?*/
> + ? ? ?ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
> + ? ? ?ix86_isa_flags &= ~OPTION_MASK_ISA_X86_64;
> + ? ?}
> + ?else if (TARGET_X86_64)
> + ? ?{
> + ? ? ?/* Always turn on OPTION_MASK_ISA_64BIT and turn off
> + ? ? ? ?OPTION_MASK_ISA_X32 for TARGET_X86_64. ?*/
> + ? ? ?ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
> + ? ? ?ix86_isa_flags &= ~OPTION_MASK_ISA_X32;
> + ? ?}
>
> ? /* -fPIC is the default for x86_64. ?*/
> ? if (TARGET_MACHO && TARGET_64BIT)
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 7721c46..39ff36a 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -41,6 +41,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
>
> ?/* Redefines for option macros. ?*/
>
> +#define TARGET_X86_64 ?OPTION_ISA_X86_64
> ?#define TARGET_64BIT ? OPTION_ISA_64BIT
> ?#define TARGET_X32 ? ? OPTION_ISA_X32
> ?#define TARGET_MMX ? ? OPTION_ISA_MMX
> @@ -76,7 +77,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. ?If not, see
> ?#define TARGET_RDRND ? OPTION_ISA_RDRND
> ?#define TARGET_F16C ? ?OPTION_ISA_F16C
>
> -#define TARGET_LP64 ? ?(TARGET_64BIT && !TARGET_X32)
> +#define TARGET_LP64 ? ?TARGET_X86_64
>
> ?/* SSE4.1 defines round instructions */
> ?#define ? ? ? ?OPTION_MASK_ISA_ROUND ? OPTION_MASK_ISA_SSE4_1
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index 6c516e7..16e99ed 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -411,13 +411,17 @@ Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_f
> ?Generate 32bit i386 code
>
> ?m64
> -Target RejectNegative Negative(mx32) Report Mask(ISA_64BIT) Var(ix86_isa_flags) Save
> +Target RejectNegative Negative(mx32) Report Mask(ISA_X86_64) Var(ix86_isa_flags) Save
> ?Generate 64bit x86-64 code
>
> ?mx32
> ?Target RejectNegative Negative(m32) Report Mask(ISA_X32) Var(ix86_isa_flags) Save
> ?Generate 32bit x86-64 code
>
> +mx86-64
> +Target Undocumented Mask(ISA_64BIT) Var(ix86_isa_flags) Save
> +Generate i386 code or x86-64 code
> +
> ?mmmx
> ?Target Report Mask(ISA_MMX) Var(ix86_isa_flags) Save
> ?Support MMX built-in functions


Hi,

Can any build maintainers review this patch?

Thanks.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]