diff mbox series

[v2,03/13] aarch64: Mark x18 register as a fixed register for MS ABI

Message ID VI1PR83MB0431632F79D188983B296B47F8232@VI1PR83MB0431.EURPRD83.prod.outlook.com
State New
Headers show
Series Add aarch64-w64-mingw32 target | expand

Commit Message

Evgeny Karpov March 4, 2024, 5:36 p.m. UTC
From: Zac Walker <zacwalker@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

Comments

Richard Sandiford April 10, 2024, 6:25 p.m. UTC | #1
Evgeny Karpov <Evgeny.Karpov@microsoft.com> writes:
> From: Zac Walker <zacwalker@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
diff mbox series

Patch

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.  */