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...@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

Reply via email to