On Wed, Jun 26, 2013 at 3:33 PM, Yufeng Zhang <[email protected]> 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
>
> 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 (SPEC_LP64): New define.
> (SPEC_ILP32): Ditto.
> (ASM_SPEC): Update to SPEC_LP64 and SPEC_ILP32.
> (MULTILIB_DEFAULTS): New define.
> * config/aarch64/aarch64-elf-raw.h (EMUL_SUFFIX): New define.
> (LINK_SPEC): Change to depend on SPEC_LP64 and SPEC_ILP32 and also
> to use EMUL_SUFFIX.
> * config/aarch64/aarch64.h (LONG_TYPE_SIZE): Change to depend on
> TARGET_ILP32.
> (POINTER_SIZE): New define.
> (POINTERS_EXTEND_UNSIGNED): Ditto.
> * config/aarch64/aarch64.c (initialize_aarch64_programming_model):
> New declaration and definition.
> (aarch64_override_options): Call the new function.
> * config/aarch64/aarch64.opt (aarch64_pmodel_flags): New.
> (milp32, mlp64): New.
> * config/aarch64/t-aarch64 (comma): New define.
> (MULTILIB_OPTIONS): Ditto.
> (MULTILIB_DIRNAMES): Ditto.
> * config/aarch64/t-aarch64-linux (MULTIARCH_DIRNAME): New define.
>