Evgeny Karpov <evgeny.kar...@microsoft.com> writes:
> From: Zac Walker <zacwal...@microsoft.com>
> Date: Fri, 1 Mar 2024 09:56:59 +0100
> Subject: [PATCH v2 03/13] aarch64: Mark x18 register as a fixed register for
>  MS ABI
>
> Define the MS ABI for aarch64-w64-mingw32.
> Adjust FIXED_REGISTERS, CALL_REALLY_USED_REGISTERS and
> STATIC_CHAIN_REGNUM for AArch64 MS ABI.
> The X18 register is reserved on Windows for the TEB.
>
> gcc/ChangeLog:
>
>       * config.gcc: Define TARGET_AARCH64_MS_ABI when
>       AArch64 MS ABI is used.
>       * config/aarch64/aarch64-abi-ms.h: New file. Adjust
>       FIXED_REGISTERS, CALL_REALLY_USED_REGISTERS and
>       STATIC_CHAIN_REGNUM for AArch64 MS ABI.
> ---
>  gcc/config.gcc                      |  1 +
>  gcc/config/aarch64/aarch64-abi-ms.h | 64 +++++++++++++++++++++++++++++
>  2 files changed, 65 insertions(+)
>  create mode 100644 gcc/config/aarch64/aarch64-abi-ms.h
>
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 2756377e50b..b762393b64c 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1265,6 +1265,7 @@ aarch64*-*-linux*)
>       TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'`
>       ;;
>  aarch64-*-mingw*)
> +     tm_file="${tm_file} aarch64/aarch64-abi-ms.h"
>       tmake_file="${tmake_file} aarch64/t-aarch64"
>       case ${enable_threads} in
>         "" | yes | win32)
> diff --git a/gcc/config/aarch64/aarch64-abi-ms.h 
> b/gcc/config/aarch64/aarch64-abi-ms.h
> new file mode 100644
> index 00000000000..90b0dcc5edf
> --- /dev/null
> +++ b/gcc/config/aarch64/aarch64-abi-ms.h
> @@ -0,0 +1,64 @@
> +/* Machine description for AArch64 MS ABI.
> +   Copyright (C) 2024 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.
> +
> +You should have received a copy of the GNU General Public License
> +along with GCC; see the file COPYING3.  If not see
> +<http://www.gnu.org/licenses/>.  */
> +
> +#ifndef GCC_AARCH64_ABI_MS_H
> +#define GCC_AARCH64_ABI_MS_H
> +
> +/* X18 reserved for the TEB on Windows.  */
> +
> +#undef FIXED_REGISTERS
> +#define FIXED_REGISTERS                                      \
> +  {                                                  \
> +    0, 0, 0, 0,   0, 0, 0, 0,        /* R0 - R7.  */         \
> +    0, 0, 0, 0,   0, 0, 0, 0,        /* R8 - R15.  */        \
> +    0, 0, 1, 0,   0, 0, 0, 0,        /* R16 - R23.  */       \
> +    0, 0, 0, 0,   0, 1, 0, 1,        /* R24 - R30, SP.  */   \
> +    0, 0, 0, 0,   0, 0, 0, 0,        /* V0 - V7.  */         \
> +    0, 0, 0, 0,   0, 0, 0, 0,   /* V8 - V15.  */     \
> +    0, 0, 0, 0,   0, 0, 0, 0,   /* V16 - V23.  */    \
> +    0, 0, 0, 0,   0, 0, 0, 0,   /* V24 - V31.  */    \
> +    1, 1, 1, 1,                      /* SFP, AP, CC, VG.  */ \
> +    0, 0, 0, 0,   0, 0, 0, 0,        /* P0 - P7.  */         \
> +    0, 0, 0, 0,   0, 0, 0, 0,   /* P8 - P15.  */     \
> +    1, 1,                    /* FFR and FFRT.  */    \
> +    1, 1, 1, 1, 1, 1, 1, 1   /* Fake registers.  */  \
> +  }
> +
> +#undef CALL_REALLY_USED_REGISTERS
> +#define CALL_REALLY_USED_REGISTERS                   \
> +  {                                                  \
> +    1, 1, 1, 1,   1, 1, 1, 1,        /* R0 - R7.  */         \
> +    1, 1, 1, 1,   1, 1, 1, 1,        /* R8 - R15.  */        \
> +    1, 1, 0, 0,   0, 0, 0, 0,   /* R16 - R23.  */    \
> +    0, 0, 0, 0,   0, 1, 1, 1,        /* R24 - R30, SP.  */   \
> +    1, 1, 1, 1,   1, 1, 1, 1,        /* V0 - V7.  */         \
> +    0, 0, 0, 0,   0, 0, 0, 0,        /* V8 - V15.  */        \
> +    1, 1, 1, 1,   1, 1, 1, 1,   /* V16 - V23.  */    \
> +    1, 1, 1, 1,   1, 1, 1, 1,   /* V24 - V31.  */    \
> +    1, 1, 1, 0,                      /* SFP, AP, CC, VG.  */ \
> +    1, 1, 1, 1,   1, 1, 1, 1,        /* P0 - P7.  */         \
> +    1, 1, 1, 1,   1, 1, 1, 1,        /* P8 - P15.  */        \
> +    1, 1,                    /* FFR and FFRT.  */    \
> +    0, 0, 0, 0, 0, 0, 0, 0   /* Fake registers.  */  \
> +  }
> +
> +#undef  STATIC_CHAIN_REGNUM
> +#define STATIC_CHAIN_REGNUM R17_REGNUM
> +
> +#endif /* GCC_AARCH64_ABI_MS_H.  */

Gah, I think there was a miscommunication, sorry.  The way I'd interpreted
Richard's comment:

> +/* X18 reserved for the TEB on Windows.  */
> +#ifdef TARGET_ARM64_MS_ABI
> +# define FIXED_X18 1
> +# define CALL_USED_X18 0
> +#else
> +# define FIXED_X18 0
> +# define CALL_USED_X18 1
> +#endif
>
> I'm not overly keen on ifdefs like this (and the one below), it can
> get quite confusing if we have to support more than a couple of ABIs.
> Perhaps we could create a couple of new headers, one for the EABI
> (which all existing targets would then need to include) and one for
> the MS ABI.  Then the mingw port would use that instead of the EABI
> header.

was that aarch64.h should have:

#define FIXED_X18 0
#define CALL_USED_X18 1

and then aarch64-abi-ms.h should have:

#undef FIXED_X18
#define FIXED_X18 1

#undef CALL_USED_X18
#define CALL_USED_X18 0

similarly to STATIC_CHAIN_REGNUM.  The goal is to keep aarch64.h "generic"
and have the port-specific files define the variations.

At least, that's what I'd prefer.  It's certainly better not to
duplicate the whole of FIXED_REGISTERS, since there's a risk that
non-aarch64.h versions could get out of sync.

Thanks,
Richard

Reply via email to