Patchwork [AArch64,ILP32] 1/5 Initial support - configury changes

login
register
mail settings
Submitter Yufeng Zhang
Date July 2, 2013, 6:53 p.m.
Message ID <51D32190.4060908@arm.com>
Download mbox | patch
Permalink /patch/256475/
State New
Headers show

Comments

Yufeng Zhang - July 2, 2013, 6:53 p.m.
Hi Andrew,

Please find the updated patch in the attachment that addresses your 
comments.

It now builds both ilp32 and lp64 multilibs by default, with the 
--with-multilib-list support remaining to provide options to turn off 
one of them.

-mabi=ilp32 and -mabi=lp64 are now the command line options to use.  The 
SPECs have been updated as well.

Thanks,
Yufeng


gcc/
         * config.gcc (aarch64*-*-*): Support --with-abi.
         (aarch64*-*-elf): Support --with-multilib-list.
         (aarch64*-*-linux*): Likewise.
         (supported_defaults): Add abi to aarch64*-*-*.
         * configure.ac: Mention AArch64 for --with-multilib-list.
         * configure: Re-generated.
         * config/aarch64/biarchilp32.h: New file.
         * config/aarch64/biarchlp64.h: New file.
         * config/aarch64/aarch64-elf.h (ENDIAN_SPEC): New define.
         (ABI_SPEC): Ditto.
         (MULTILIB_DEFAULTS): Ditto.
         (DRIVER_SELF_SPECS): Ditto.
         (ASM_SPEC): Update to also substitute -mabi.
         * config/aarch64/aarch64-elf-raw.h (LINK_SPEC): Add linker script
         file whose name depends on -mabi= and -mbig-endian.
         * config/aarch64/aarch64.h (LONG_TYPE_SIZE): Change to depend on
         TARGET_ILP32.
         (POINTER_SIZE): New define.
         (POINTERS_EXTEND_UNSIGNED): Ditto.
         (enum aarch64_abi_type): New enumeration tag.
         (AARCH64_ABI_LP64, AARCH64_ABI_ILP32): New enumerators.
         (AARCH64_ABI_DEFAULT): Define to AARCH64_ABI_LP64 if undefined.
         (TARGET_ILP32): New define.
         * config/aarch64/aarch64.opt (mabi): New.
         (aarch64_abi): New.
         (ilp32, lp64): New values for -mabi.
         * config/aarch64/t-aarch64 (comma): New define.
         (MULTILIB_OPTIONS): Ditto.
         (MULTILIB_DIRNAMES): Ditto.
         * config/aarch64/t-aarch64-linux (MULTIARCH_DIRNAME): New define.
         * doc/invoke.texi: Document -mabi for AArch64.



On 06/26/13 23:59, Andrew Pinski wrote:
> On Wed, Jun 26, 2013 at 3:33 PM, Yufeng Zhang<Yufeng.Zhang@arm.com>  wrote:
>> This patch adds the configuration changes to the AArch64 GCC to support:
>>
>> * -milp32 and -mlp64 options in the compiler and the driver
>> * multilib of ilp32 and/or lp64 libraries
>> * differentiation of basic types in the compiler backend
>>
>> The patch enables --with-multilib-list configuration option for specifying
>> the list of library flavors to enable; the default value is "mlp64" and can
>> be overridden by --with-abi to "milp32".
>>
>> It also enables --with-abi for setting the default model in the compiler.
>> Its default value is "mlp64" unless --with-multilib-list is explicitly
>> specified with "milp32", in which case it defaults to "milp32".
>>
>> In the backend, two target flags are introduced: TARGET_ILP32 and
>> TARGET_LP64.  They are set by -milp32 and -mlp64 respectively, exclusive to
>> each other.  The default setting is via the option variable
>> aarch64_pmodel_flags, which defaults to TARGET_DEFAULT_PMODEL, which is
>> further defined in biarchlp64.h or biarchilp32.h depending which header file
>> is included.
>>
>>                            biarchlp64.h         biarchilp32.h
>> TARGET_DEFAULT_PMODEL     OPTION_MASK_LP64     OPTION_MASK_ILP32
>> TARGET_PMODEL             1                    2
>>
>> TARGET_ILP32 and TARGET_LP64 are implicitly defined as:
>>
>> #define TARGET_ILP32 ((aarch64_pmodel_flags&  OPTION_MASK_ILP32) != 0)
>> #define TARGET_LP64 ((aarch64_pmodel_flags&  OPTION_MASK_LP64) != 0)
>>
>> Note that the multilib support in the Linux toolchain is suppressed
>> deliberately.
>>
>> OK for the trunk?
>
>
> I think you should not support --with-multilib-list at all.  It should
> just include ilp32 multilib no matter what.  Note the linux multilib
> has to wait until the glibc/kernel side is done.
>
> Also:
> +#if TARGET_BIG_ENDIAN_DEFAULT == 1
> +#define EMUL_SUFFIX "b"
> +#else
> +#define EMUL_SUFFIX ""
> +#endif
>
> is broken when you supply the opposite endian option.
>
> Also you really should just use -mabi=ilp32 and -mabi=lp64 which
> reduces the number of changes needed to be done to config.gcc.
>
> You should use DRIVER_SELF_SPECS to simplify your LINKS_SPECS.
> Something like:
> #ifdef TARGET_BIG_ENDIAN_DEFAULT
> #define ENDIAN_SPEC "-mbig-endian"
> #else
> #define ENDIAN_SPEC "-mlittle-endian"
> #endif
> /* Force the default endianness and ABI flags onto the command line
>     in order to make the other specs easier to write.  */
> #undef DRIVER_SELF_SPECS
> #define DRIVER_SELF_SPECS \
>    " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \
>    " %{!milp32:%{!mlp64:-mlp64}}"
>
> or rather:
> " %{!mabi=*: -mabi=lp64}"
>
>
>
> And then in aarch64-elf-raw.h:
> #ifndef LINK_SPEC
> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
> -maarch64elf%{milp32:32}%{mbig-endian:b}"
> #endif
>
> Or using the -mabi=* way:
> #ifndef LINK_SPEC
> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
> -maarch64elf%{mabi=ilp32:32}%{mbig-endian:b}"
> #endif
>
>
>
> Thanks,
> Andrew Pinski
Andrew Pinski - July 2, 2013, 8:57 p.m.
On Tue, Jul 2, 2013 at 11:53 AM, Yufeng Zhang <Yufeng.Zhang@arm.com> wrote:
> Hi Andrew,
>
> Please find the updated patch in the attachment that addresses your
> comments.
>
> It now builds both ilp32 and lp64 multilibs by default, with the
> --with-multilib-list support remaining to provide options to turn off one of
> them.
>
> -mabi=ilp32 and -mabi=lp64 are now the command line options to use.  The
> SPECs have been updated as well.

Thanks for doing this.  I like this patch much better than the first one.

Thanks,
Andrew

>
>
> Thanks,
> Yufeng
>
>
> gcc/
>         * config.gcc (aarch64*-*-*): Support --with-abi.
>         (aarch64*-*-elf): Support --with-multilib-list.
>         (aarch64*-*-linux*): Likewise.
>         (supported_defaults): Add abi to aarch64*-*-*.
>         * configure.ac: Mention AArch64 for --with-multilib-list.
>         * configure: Re-generated.
>         * config/aarch64/biarchilp32.h: New file.
>         * config/aarch64/biarchlp64.h: New file.
>         * config/aarch64/aarch64-elf.h (ENDIAN_SPEC): New define.
>         (ABI_SPEC): Ditto.
>         (MULTILIB_DEFAULTS): Ditto.
>         (DRIVER_SELF_SPECS): Ditto.
>         (ASM_SPEC): Update to also substitute -mabi.
>         * config/aarch64/aarch64-elf-raw.h (LINK_SPEC): Add linker script
>         file whose name depends on -mabi= and -mbig-endian.
>
>         * config/aarch64/aarch64.h (LONG_TYPE_SIZE): Change to depend on
>         TARGET_ILP32.
>         (POINTER_SIZE): New define.
>         (POINTERS_EXTEND_UNSIGNED): Ditto.
>         (enum aarch64_abi_type): New enumeration tag.
>         (AARCH64_ABI_LP64, AARCH64_ABI_ILP32): New enumerators.
>         (AARCH64_ABI_DEFAULT): Define to AARCH64_ABI_LP64 if undefined.
>         (TARGET_ILP32): New define.
>         * config/aarch64/aarch64.opt (mabi): New.
>         (aarch64_abi): New.
>         (ilp32, lp64): New values for -mabi.
>
>         * config/aarch64/t-aarch64 (comma): New define.
>         (MULTILIB_OPTIONS): Ditto.
>         (MULTILIB_DIRNAMES): Ditto.
>         * config/aarch64/t-aarch64-linux (MULTIARCH_DIRNAME): New define.
>         * doc/invoke.texi: Document -mabi for AArch64.
>
>
>
>
> On 06/26/13 23:59, Andrew Pinski wrote:
>>
>> On Wed, Jun 26, 2013 at 3:33 PM, Yufeng Zhang<Yufeng.Zhang@arm.com>
>> wrote:
>>>
>>> This patch adds the configuration changes to the AArch64 GCC to support:
>>>
>>> * -milp32 and -mlp64 options in the compiler and the driver
>>> * multilib of ilp32 and/or lp64 libraries
>>> * differentiation of basic types in the compiler backend
>>>
>>> The patch enables --with-multilib-list configuration option for
>>> specifying
>>> the list of library flavors to enable; the default value is "mlp64" and
>>> can
>>> be overridden by --with-abi to "milp32".
>>>
>>> It also enables --with-abi for setting the default model in the compiler.
>>> Its default value is "mlp64" unless --with-multilib-list is explicitly
>>> specified with "milp32", in which case it defaults to "milp32".
>>>
>>> In the backend, two target flags are introduced: TARGET_ILP32 and
>>> TARGET_LP64.  They are set by -milp32 and -mlp64 respectively, exclusive
>>> to
>>> each other.  The default setting is via the option variable
>>> aarch64_pmodel_flags, which defaults to TARGET_DEFAULT_PMODEL, which is
>>> further defined in biarchlp64.h or biarchilp32.h depending which header
>>> file
>>> is included.
>>>
>>>                            biarchlp64.h         biarchilp32.h
>>> TARGET_DEFAULT_PMODEL     OPTION_MASK_LP64     OPTION_MASK_ILP32
>>> TARGET_PMODEL             1                    2
>>>
>>> TARGET_ILP32 and TARGET_LP64 are implicitly defined as:
>>>
>>> #define TARGET_ILP32 ((aarch64_pmodel_flags&  OPTION_MASK_ILP32) != 0)
>>> #define TARGET_LP64 ((aarch64_pmodel_flags&  OPTION_MASK_LP64) != 0)
>>>
>>>
>>> Note that the multilib support in the Linux toolchain is suppressed
>>> deliberately.
>>>
>>> OK for the trunk?
>>
>>
>>
>> I think you should not support --with-multilib-list at all.  It should
>> just include ilp32 multilib no matter what.  Note the linux multilib
>> has to wait until the glibc/kernel side is done.
>>
>> Also:
>> +#if TARGET_BIG_ENDIAN_DEFAULT == 1
>> +#define EMUL_SUFFIX "b"
>> +#else
>> +#define EMUL_SUFFIX ""
>> +#endif
>>
>> is broken when you supply the opposite endian option.
>>
>> Also you really should just use -mabi=ilp32 and -mabi=lp64 which
>> reduces the number of changes needed to be done to config.gcc.
>>
>> You should use DRIVER_SELF_SPECS to simplify your LINKS_SPECS.
>> Something like:
>> #ifdef TARGET_BIG_ENDIAN_DEFAULT
>> #define ENDIAN_SPEC "-mbig-endian"
>> #else
>> #define ENDIAN_SPEC "-mlittle-endian"
>> #endif
>> /* Force the default endianness and ABI flags onto the command line
>>     in order to make the other specs easier to write.  */
>> #undef DRIVER_SELF_SPECS
>> #define DRIVER_SELF_SPECS \
>>    " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \
>>    " %{!milp32:%{!mlp64:-mlp64}}"
>>
>> or rather:
>> " %{!mabi=*: -mabi=lp64}"
>>
>>
>>
>> And then in aarch64-elf-raw.h:
>> #ifndef LINK_SPEC
>> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
>> -maarch64elf%{milp32:32}%{mbig-endian:b}"
>> #endif
>>
>> Or using the -mabi=* way:
>> #ifndef LINK_SPEC
>> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
>> -maarch64elf%{mabi=ilp32:32}%{mbig-endian:b}"
>> #endif
>>
>>
>>
>> Thanks,
>> Andrew Pinski
Yufeng Zhang - July 18, 2013, 10:25 a.m.
Ping~

Thanks,
Yufeng

On 07/02/13 19:53, Yufeng Zhang wrote:
> Hi Andrew,
>
> Please find the updated patch in the attachment that addresses your
> comments.
>
> It now builds both ilp32 and lp64 multilibs by default, with the
> --with-multilib-list support remaining to provide options to turn off
> one of them.
>
> -mabi=ilp32 and -mabi=lp64 are now the command line options to use.  The
> SPECs have been updated as well.
>
> Thanks,
> Yufeng
>
>
> gcc/
>           * config.gcc (aarch64*-*-*): Support --with-abi.
>           (aarch64*-*-elf): Support --with-multilib-list.
>           (aarch64*-*-linux*): Likewise.
>           (supported_defaults): Add abi to aarch64*-*-*.
>           * configure.ac: Mention AArch64 for --with-multilib-list.
>           * configure: Re-generated.
>           * config/aarch64/biarchilp32.h: New file.
>           * config/aarch64/biarchlp64.h: New file.
>           * config/aarch64/aarch64-elf.h (ENDIAN_SPEC): New define.
>           (ABI_SPEC): Ditto.
>           (MULTILIB_DEFAULTS): Ditto.
>           (DRIVER_SELF_SPECS): Ditto.
>           (ASM_SPEC): Update to also substitute -mabi.
>           * config/aarch64/aarch64-elf-raw.h (LINK_SPEC): Add linker script
>           file whose name depends on -mabi= and -mbig-endian.
>           * config/aarch64/aarch64.h (LONG_TYPE_SIZE): Change to depend on
>           TARGET_ILP32.
>           (POINTER_SIZE): New define.
>           (POINTERS_EXTEND_UNSIGNED): Ditto.
>           (enum aarch64_abi_type): New enumeration tag.
>           (AARCH64_ABI_LP64, AARCH64_ABI_ILP32): New enumerators.
>           (AARCH64_ABI_DEFAULT): Define to AARCH64_ABI_LP64 if undefined.
>           (TARGET_ILP32): New define.
>           * config/aarch64/aarch64.opt (mabi): New.
>           (aarch64_abi): New.
>           (ilp32, lp64): New values for -mabi.
>           * config/aarch64/t-aarch64 (comma): New define.
>           (MULTILIB_OPTIONS): Ditto.
>           (MULTILIB_DIRNAMES): Ditto.
>           * config/aarch64/t-aarch64-linux (MULTIARCH_DIRNAME): New define.
>           * doc/invoke.texi: Document -mabi for AArch64.
>
>
>
> On 06/26/13 23:59, Andrew Pinski wrote:
>> On Wed, Jun 26, 2013 at 3:33 PM, Yufeng Zhang<Yufeng.Zhang@arm.com>   wrote:
>>> This patch adds the configuration changes to the AArch64 GCC to support:
>>>
>>> * -milp32 and -mlp64 options in the compiler and the driver
>>> * multilib of ilp32 and/or lp64 libraries
>>> * differentiation of basic types in the compiler backend
>>>
>>> The patch enables --with-multilib-list configuration option for specifying
>>> the list of library flavors to enable; the default value is "mlp64" and can
>>> be overridden by --with-abi to "milp32".
>>>
>>> It also enables --with-abi for setting the default model in the compiler.
>>> Its default value is "mlp64" unless --with-multilib-list is explicitly
>>> specified with "milp32", in which case it defaults to "milp32".
>>>
>>> In the backend, two target flags are introduced: TARGET_ILP32 and
>>> TARGET_LP64.  They are set by -milp32 and -mlp64 respectively, exclusive to
>>> each other.  The default setting is via the option variable
>>> aarch64_pmodel_flags, which defaults to TARGET_DEFAULT_PMODEL, which is
>>> further defined in biarchlp64.h or biarchilp32.h depending which header file
>>> is included.
>>>
>>>                             biarchlp64.h         biarchilp32.h
>>> TARGET_DEFAULT_PMODEL     OPTION_MASK_LP64     OPTION_MASK_ILP32
>>> TARGET_PMODEL             1                    2
>>>
>>> TARGET_ILP32 and TARGET_LP64 are implicitly defined as:
>>>
>>> #define TARGET_ILP32 ((aarch64_pmodel_flags&   OPTION_MASK_ILP32) != 0)
>>> #define TARGET_LP64 ((aarch64_pmodel_flags&   OPTION_MASK_LP64) != 0)
>>>
>>> Note that the multilib support in the Linux toolchain is suppressed
>>> deliberately.
>>>
>>> OK for the trunk?
>>
>>
>> I think you should not support --with-multilib-list at all.  It should
>> just include ilp32 multilib no matter what.  Note the linux multilib
>> has to wait until the glibc/kernel side is done.
>>
>> Also:
>> +#if TARGET_BIG_ENDIAN_DEFAULT == 1
>> +#define EMUL_SUFFIX "b"
>> +#else
>> +#define EMUL_SUFFIX ""
>> +#endif
>>
>> is broken when you supply the opposite endian option.
>>
>> Also you really should just use -mabi=ilp32 and -mabi=lp64 which
>> reduces the number of changes needed to be done to config.gcc.
>>
>> You should use DRIVER_SELF_SPECS to simplify your LINKS_SPECS.
>> Something like:
>> #ifdef TARGET_BIG_ENDIAN_DEFAULT
>> #define ENDIAN_SPEC "-mbig-endian"
>> #else
>> #define ENDIAN_SPEC "-mlittle-endian"
>> #endif
>> /* Force the default endianness and ABI flags onto the command line
>>      in order to make the other specs easier to write.  */
>> #undef DRIVER_SELF_SPECS
>> #define DRIVER_SELF_SPECS \
>>     " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \
>>     " %{!milp32:%{!mlp64:-mlp64}}"
>>
>> or rather:
>> " %{!mabi=*: -mabi=lp64}"
>>
>>
>>
>> And then in aarch64-elf-raw.h:
>> #ifndef LINK_SPEC
>> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
>> -maarch64elf%{milp32:32}%{mbig-endian:b}"
>> #endif
>>
>> Or using the -mabi=* way:
>> #ifndef LINK_SPEC
>> #define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
>> -maarch64elf%{mabi=ilp32:32}%{mbig-endian:b}"
>> #endif
>>
>>
>>
>> Thanks,
>> Andrew Pinski
Marcus Shawcroft - July 19, 2013, 9:07 a.m.
On 2 July 2013 19:53, Yufeng Zhang <Yufeng.Zhang@arm.com> wrote:
> Hi Andrew,
>
> Please find the updated patch in the attachment that addresses your
> comments.
>
> It now builds both ilp32 and lp64 multilibs by default, with the
> --with-multilib-list support remaining to provide options to turn off one of
> them.
>
> -mabi=ilp32 and -mabi=lp64 are now the command line options to use.  The
> SPECs have been updated as well.
>
>
> Thanks,
> Yufeng

OK
/Marcus
Andreas Schwab - Sept. 18, 2013, 10:21 a.m.
Yufeng Zhang <Yufeng.Zhang@arm.com> writes:

>         (ASM_SPEC): Update to also substitute -mabi.

You should check that the assembler actually understands that option.
Currently it is impossible to build an aarch64-linux compiler with
binutils from the binutils-2_23 branch.

Andreas.
Yufeng Zhang - Sept. 18, 2013, 10:37 a.m.
On 09/18/13 11:21, Andreas Schwab wrote:
> Yufeng Zhang<Yufeng.Zhang@arm.com>  writes:
>
>>          (ASM_SPEC): Update to also substitute -mabi.
>
> You should check that the assembler actually understands that option.
> Currently it is impossible to build an aarch64-linux compiler with
> binutils from the binutils-2_23 branch.

Ah, I didn't think too much at then on the backward compatibility issue 
with binutils-2_23.  One potential solution can be to backport part of 
configury change from binutils trunk to 2_23.  Can I ask if there is any 
particular reason that you wouldn't like to build the trunk compiler 
with the trunk binutils?  Also since binutils 2.24 release shall not be 
far away, would you be happy to wait for that instead?

Thanks,
Yufeng
Andreas Schwab - Sept. 18, 2013, 12:01 p.m.
Yufeng Zhang <Yufeng.Zhang@arm.com> writes:

> Ah, I didn't think too much at then on the backward compatibility issue
> with binutils-2_23.  One potential solution can be to backport part of
> configury change from binutils trunk to 2_23.  Can I ask if there is any
> particular reason that you wouldn't like to build the trunk compiler with
> the trunk binutils?

You also get the error with a slightly older binutils trunk.  There
should be a configure check instead of failing to build.  It should
either require that the assembler is new enough, or drop the unknown
option (for aarch64-linux where multilibs are not enabled you don't need
it anyway).

Andreas.

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 0ad7217..50dd045 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -497,6 +497,26 @@  then
 fi
 
 case ${target} in
+aarch64*-*-*)
+	case ${with_abi} in
+	"")
+		if test "x$with_multilib_list" = xilp32; then
+			tm_file="aarch64/biarchilp32.h ${tm_file}"
+		else
+			tm_file="aarch64/biarchlp64.h ${tm_file}"
+		fi
+		;;
+	ilp32)
+		tm_file="aarch64/biarchilp32.h ${tm_file}"
+		;;
+	lp64)
+		tm_file="aarch64/biarchlp64.h ${tm_file}"
+		;;
+	*)
+		echo "Unknown ABI used in --with-abi=$with_abi"
+		exit 1
+	esac
+	;;
 i[34567]86-*-*)
 	if test "x$with_abi" != x; then
 		echo "This target does not support --with-abi."
@@ -827,6 +847,22 @@  aarch64*-*-elf)
 		tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
 		;;
 	esac
+	aarch64_multilibs="${with_multilib_list}"
+	if test "$aarch64_multilibs" = "default"; then
+		aarch64_multilibs="lp64,ilp32"
+	fi
+	aarch64_multilibs=`echo $aarch64_multilibs | sed -e 's/,/ /g'`
+	for aarch64_multilib in ${aarch64_multilibs}; do
+		case ${aarch64_multilib} in
+		ilp32 | lp64 )
+			TM_MULTILIB_CONFIG="${TM_MULTILIB_CONFIG},${aarch64_multilib}"
+			;;
+		*)
+			echo "--with-multilib-list=${aarch64_multilib} not supported."
+			exit 1
+		esac
+	done
+	TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'`
 	;;
 aarch64*-*-linux*)
 	tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h"
@@ -837,6 +873,24 @@  aarch64*-*-linux*)
 		tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
 		;;
 	esac
+	aarch64_multilibs="${with_multilib_list}"
+	if test "$aarch64_multilibs" = "default"; then
+		# TODO: turn on ILP32 multilib build after its support is mature.
+		# aarch64_multilibs="lp64,ilp32"
+		aarch64_multilibs="lp64"
+	fi
+	aarch64_multilibs=`echo $aarch64_multilibs | sed -e 's/,/ /g'`
+	for aarch64_multilib in ${aarch64_multilibs}; do
+		case ${aarch64_multilib} in
+		ilp32 | lp64 )
+			TM_MULTILIB_CONFIG="${TM_MULTILIB_CONFIG},${aarch64_multilib}"
+			;;
+		*)
+			echo "--with-multilib-list=${aarch64_multilib} not supported."
+			exit 1
+		esac
+	done
+	TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'`
 	;;
 alpha*-*-linux*)
 	tm_file="elfos.h ${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h glibc-stdint.h"
@@ -3147,7 +3201,7 @@  fi
 supported_defaults=
 case "${target}" in
 	aarch64*-*-*)
-		supported_defaults="cpu arch"
+		supported_defaults="abi cpu arch"
 		for which in cpu arch; do
 
 			eval "val=\$with_$which"
diff --git a/gcc/config/aarch64/aarch64-elf-raw.h b/gcc/config/aarch64/aarch64-elf-raw.h
index 1cd0155..dfaa9f4 100644
--- a/gcc/config/aarch64/aarch64-elf-raw.h
+++ b/gcc/config/aarch64/aarch64-elf-raw.h
@@ -26,7 +26,8 @@ 
 #define ENDFILE_SPEC " crtend%O%s crtn%O%s"
 
 #ifndef LINK_SPEC
-#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X"
+#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X \
+  -maarch64elf%{mabi=ilp32*:32}%{mbig-endian:b}"
 #endif
 
 #endif /* GCC_AARCH64_ELF_RAW_H */
diff --git a/gcc/config/aarch64/aarch64-elf.h b/gcc/config/aarch64/aarch64-elf.h
index 3f3ae52..315a510 100644
--- a/gcc/config/aarch64/aarch64-elf.h
+++ b/gcc/config/aarch64/aarch64-elf.h
@@ -111,12 +111,37 @@ 
 
 #define GLOBAL_ASM_OP "\t.global\t"
 
+#ifdef TARGET_BIG_ENDIAN_DEFAULT
+#define ENDIAN_SPEC "-mbig-endian"
+#else
+#define ENDIAN_SPEC "-mlittle-endian"
+#endif
+
+#if TARGET_DATA_MODEL == 1
+#define ABI_SPEC  "-mabi=lp64"
+#define MULTILIB_DEFAULTS { "mabi=lp64" }
+#elif TARGET_DATA_MODEL == 2
+#define ABI_SPEC  "-mabi=ilp32"
+#define MULTILIB_DEFAULTS { "mabi=ilp32" }
+#else
+#error "Unknown or undefined TARGET_DATA_MODEL!"
+#endif
+
+/* Force the default endianness and ABI flags onto the command line
+   in order to make the other specs easier to write.  */
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+  " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \
+  " %{!mabi=*:" ABI_SPEC "}"
+
 #ifndef ASM_SPEC
 #define ASM_SPEC "\
 %{mbig-endian:-EB} \
 %{mlittle-endian:-EL} \
 %{mcpu=*:-mcpu=%*} \
-%{march=*:-march=%*}"
+%{march=*:-march=%*} \
+%{mabi=ilp32*:-milp32} \
+%{mabi=lp64*:-mlp64}"
 #endif
 
 #undef TYPE_OPERAND_FMT
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 7bdb1e2..6011ab8 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -95,7 +95,9 @@ 
 
 #define INT_TYPE_SIZE		32
 
-#define LONG_TYPE_SIZE		64	/* XXX This should be an option */
+#define LONG_TYPE_SIZE		(TARGET_ILP32 ? 32 : 64)
+
+#define POINTER_SIZE		(TARGET_ILP32 ? 32 : 64)
 
 #define LONG_LONG_TYPE_SIZE	64
 
@@ -520,6 +522,18 @@  typedef struct GTY (()) machine_function
 } machine_function;
 #endif
 
+/* Which ABI to use.  */
+enum aarch64_abi_type
+{
+  AARCH64_ABI_LP64 = 0,
+  AARCH64_ABI_ILP32 = 1
+};
+
+#ifndef AARCH64_ABI_DEFAULT
+#define AARCH64_ABI_DEFAULT AARCH64_ABI_LP64
+#endif
+
+#define TARGET_ILP32	(aarch64_abi & AARCH64_ABI_ILP32)
 
 enum arm_pcs
 {
@@ -694,7 +708,18 @@  do {									     \
 
 #define NO_FUNCTION_CSE	1
 
+/* Specify the machine mode that the hardware addresses have.
+   After generation of rtl, the compiler makes no further distinction
+   between pointers and any other objects of this machine mode.  */
 #define Pmode		DImode
+
+/* A C expression whose value is zero if pointers that need to be extended
+   from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and
+   greater then zero if they are zero-extended and less then zero if the
+   ptr_extend instruction should be used.  */
+#define POINTERS_EXTEND_UNSIGNED 1
+
+/* Mode of a function address in a call instruction (for indexing purposes).  */
 #define FUNCTION_MODE	Pmode
 
 #define SELECT_CC_MODE(OP, X, Y)	aarch64_select_cc_mode (OP, X, Y)
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 3518248..8ff6ca1 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -98,3 +98,17 @@  Target RejectNegative Joined Var(aarch64_cpu_string)
 mtune=
 Target RejectNegative Joined Var(aarch64_tune_string)
 -mtune=CPU	Optimize for CPU
+
+mabi=
+Target RejectNegative Joined Enum(aarch64_abi) Var(aarch64_abi) Init(AARCH64_ABI_DEFAULT)
+-mabi=ABI	Generate code that conforms to the specified ABI
+
+Enum
+Name(aarch64_abi) Type(int)
+Known AArch64 ABIs (for use with the -mabi= option):
+
+EnumValue
+Enum(aarch64_abi) String(ilp32) Value(AARCH64_ABI_ILP32)
+
+EnumValue
+Enum(aarch64_abi) String(lp64) Value(AARCH64_ABI_LP64)
diff --git a/gcc/config/aarch64/biarchilp32.h b/gcc/config/aarch64/biarchilp32.h
new file mode 100644
index 0000000..fe13837
--- /dev/null
+++ b/gcc/config/aarch64/biarchilp32.h
@@ -0,0 +1,29 @@ 
+/* Make configure files to produce biarch compiler defaulting to ilp32 ABI.
+   This file must be included very first, while the OS specific file later
+   to overwrite otherwise wrong defaults.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   Contributed by ARM Ltd.
+
+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 AARCH64_ABI_DEFAULT AARCH64_ABI_ILP32
+#define TARGET_DATA_MODEL 2
diff --git a/gcc/config/aarch64/biarchlp64.h b/gcc/config/aarch64/biarchlp64.h
new file mode 100644
index 0000000..86803af
--- /dev/null
+++ b/gcc/config/aarch64/biarchlp64.h
@@ -0,0 +1,29 @@ 
+/* Make configure files to produce biarch compiler defaulting to ilp64 ABI.
+   This file must be included very first, while the OS specific file later
+   to overwrite otherwise wrong defaults.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   Contributed by ARM Ltd.
+
+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 AARCH64_ABI_DEFAULT AARCH64_ABI_LP64
+#define TARGET_DATA_MODEL 1
diff --git a/gcc/config/aarch64/t-aarch64 b/gcc/config/aarch64/t-aarch64
index 4c265eb..2975850 100644
--- a/gcc/config/aarch64/t-aarch64
+++ b/gcc/config/aarch64/t-aarch64
@@ -34,3 +34,7 @@  aarch64-builtins.o: $(srcdir)/config/aarch64/aarch64-builtins.c $(CONFIG_H) \
   $(srcdir)/config/aarch64/aarch64-simd-builtins.def
 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
 		$(srcdir)/config/aarch64/aarch64-builtins.c
+
+comma=,
+MULTILIB_OPTIONS    = $(patsubst %, mabi=%, $(subst $(comma), ,$(TM_MULTILIB_CONFIG)))
+MULTILIB_DIRNAMES   = $(subst $(comma), ,$(TM_MULTILIB_CONFIG))
diff --git a/gcc/config/aarch64/t-aarch64-linux b/gcc/config/aarch64/t-aarch64-linux
index a7a0a88..ca1525e 100644
--- a/gcc/config/aarch64/t-aarch64-linux
+++ b/gcc/config/aarch64/t-aarch64-linux
@@ -23,3 +23,9 @@  LIB1ASMFUNCS = _aarch64_sync_cache_range
 
 AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be)
 MULTILIB_OSDIRNAMES = .=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
+MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu)
+
+# Disable the multilib for linux-gnu targets for the time being; focus
+# on the baremetal targets.
+MULTILIB_OPTIONS    =
+MULTILIB_DIRNAMES   =
diff --git a/gcc/configure.ac b/gcc/configure.ac
index eff48d6..6bad7d5 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -839,7 +839,7 @@  esac],
 [enable_languages=c])
 
 AC_ARG_WITH(multilib-list,
-[AS_HELP_STRING([--with-multilib-list], [select multilibs (SH and x86-64 only)])],
+[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and x86-64 only)])],
 :,
 with_multilib_list=default)
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index dd82880..c3eff15 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -470,7 +470,7 @@  Objective-C and Objective-C++ Dialects}.
 @c so users have a clue at guessing where the ones they want will be.
 
 @emph{AArch64 Options}
-@gccoptlist{-mbig-endian  -mlittle-endian @gol
+@gccoptlist{-mabi=@var{name}  -mbig-endian  -mlittle-endian @gol
 -mgeneral-regs-only @gol
 -mcmodel=tiny  -mcmodel=small  -mcmodel=large @gol
 -mstrict-align @gol
@@ -10967,6 +10967,17 @@  These options are defined for AArch64 implementations:
 
 @table @gcctabopt
 
+@item -mabi=@var{name}
+@opindex mabi
+Generate code for the specified data model.  Permissible values
+are @samp{ilp32} for SysV-like data model where int, long int and pointer
+are 32-bit, and @samp{lp64} for SysV-like data model where int is 32-bit,
+but long int and pointer are 64-bit.
+
+The default depends on the specific target configuration.  Note that
+the LP64 and ILP32 ABIs are not link-compatible; you must compile your
+entire program with the same ABI, and link with a compatible set of libraries.
+
 @item -mbig-endian
 @opindex mbig-endian
 Generate big-endian code.  This is the default when GCC is configured for an