[PATCH] newlib: libc: return back support for AArch64 ILP32
Corinna Vinschen
vinschen@redhat.com
Thu Jul 24 11:07:19 GMT 2025
Joel, can you please test?
Thanks,
Corinna
On Jul 24 11:04, Radek Barton via Newlib wrote:
> Hello.
>
> As discussed at https://sourceware.org/pipermail/newlib/2025/022045.html, sending a patch reverting removal of AArch64 ILP32 ABI support.
>
> Radek
>
> ---
> >From 0b67661adf790719d91f1ee8be3a737316dfc4d6 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Radek=20Barto=C5=88?= <radek.barton@microsoft.com>
> Date: Thu, 24 Jul 2025 12:36:02 +0200
> Subject: [PATCH] newlib: libc: return back support for AArch64 ILP32
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> This patch is returning back support for AArch64 ILP32 ABI that was
> removed in de479a54e22e8fcb6262639a8e67fe8b00a27c37 commit but is needed
> to ensure source code compatibility with GCC 14.
>
> The change in newlib/libc/machine/aarch64/asmdefs.h makes it
> out-of-the-sync with the current upstream implementation in
> https://github.com/ARM-software/optimized-routines repository.
>
> Signed-off-by: Radek Bartoň <radek.barton@microsoft.com>
> ---
> newlib/libc/machine/aarch64/asmdefs.h | 14 ++++++++++++++
> newlib/libc/machine/aarch64/memchr.S | 2 ++
> newlib/libc/machine/aarch64/memcmp.S | 4 ++++
> newlib/libc/machine/aarch64/memcpy.S | 3 +++
> newlib/libc/machine/aarch64/memrchr.S | 1 +
> newlib/libc/machine/aarch64/memset.S | 3 +++
> newlib/libc/machine/aarch64/strchr.S | 1 +
> newlib/libc/machine/aarch64/strchrnul.S | 1 +
> newlib/libc/machine/aarch64/strcmp.S | 2 ++
> newlib/libc/machine/aarch64/strcpy.S | 2 ++
> newlib/libc/machine/aarch64/strlen.S | 1 +
> newlib/libc/machine/aarch64/strncmp.S | 3 +++
> newlib/libc/machine/aarch64/strnlen.S | 2 ++
> newlib/libc/machine/aarch64/strrchr.S | 1 +
> 14 files changed, 40 insertions(+)
>
> diff --git a/newlib/libc/machine/aarch64/asmdefs.h b/newlib/libc/machine/aarch64/asmdefs.h
> index 6c99fa704..cf156a5a8 100644
> --- a/newlib/libc/machine/aarch64/asmdefs.h
> +++ b/newlib/libc/machine/aarch64/asmdefs.h
> @@ -88,4 +88,18 @@ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC)
>
> #define L(l) .L ## l
>
> +#ifdef __ILP32__
> + /* Sanitize padding bits of pointer arguments as per aapcs64 */
> +#define PTR_ARG(n) mov w##n, w##n
> +#else
> +#define PTR_ARG(n)
> +#endif
> +
> +#ifdef __ILP32__
> + /* Sanitize padding bits of size arguments as per aapcs64 */
> +#define SIZE_ARG(n) mov w##n, w##n
> +#else
> +#define SIZE_ARG(n)
> +#endif
> +
> #endif
> diff --git a/newlib/libc/machine/aarch64/memchr.S b/newlib/libc/machine/aarch64/memchr.S
> index 074a004cf..a0f305e0f 100644
> --- a/newlib/libc/machine/aarch64/memchr.S
> +++ b/newlib/libc/machine/aarch64/memchr.S
> @@ -50,6 +50,8 @@
> */
>
> ENTRY (memchr)
> + PTR_ARG (0)
> + SIZE_ARG (2)
> /* Do not dereference srcin if no bytes to compare. */
> cbz cntin, L(zero_length)
> /*
> diff --git a/newlib/libc/machine/aarch64/memcmp.S b/newlib/libc/machine/aarch64/memcmp.S
> index 2a9c446bb..18874d321 100644
> --- a/newlib/libc/machine/aarch64/memcmp.S
> +++ b/newlib/libc/machine/aarch64/memcmp.S
> @@ -34,6 +34,10 @@
>
>
> ENTRY (memcmp)
> + PTR_ARG (0)
> + PTR_ARG (1)
> + SIZE_ARG (2)
> +
> cmp limit, 16
> b.lo L(less16)
> ldp data1, data3, [src1]
> diff --git a/newlib/libc/machine/aarch64/memcpy.S b/newlib/libc/machine/aarch64/memcpy.S
> index 252d2452a..248e7843a 100644
> --- a/newlib/libc/machine/aarch64/memcpy.S
> +++ b/newlib/libc/machine/aarch64/memcpy.S
> @@ -58,6 +58,9 @@
>
> ENTRY_ALIAS (memmove)
> ENTRY (memcpy)
> + PTR_ARG (0)
> + PTR_ARG (1)
> + SIZE_ARG (2)
> add srcend, src, count
> add dstend, dstin, count
> cmp count, 128
> diff --git a/newlib/libc/machine/aarch64/memrchr.S b/newlib/libc/machine/aarch64/memrchr.S
> index 2525cf190..ba9915cc3 100644
> --- a/newlib/libc/machine/aarch64/memrchr.S
> +++ b/newlib/libc/machine/aarch64/memrchr.S
> @@ -45,6 +45,7 @@
> exactly which byte matched. */
>
> ENTRY (memrchr)
> + PTR_ARG (0)
> add end, srcin, cntin
> sub endm1, end, 1
> bic src, endm1, 15
> diff --git a/newlib/libc/machine/aarch64/memset.S b/newlib/libc/machine/aarch64/memset.S
> index 5bf4851f3..ca76439a9 100644
> --- a/newlib/libc/machine/aarch64/memset.S
> +++ b/newlib/libc/machine/aarch64/memset.S
> @@ -25,6 +25,9 @@
> #define zva_val x5
>
> ENTRY (memset)
> + PTR_ARG (0)
> + SIZE_ARG (2)
> +
> dup v0.16B, valw
> add dstend, dstin, count
>
> diff --git a/newlib/libc/machine/aarch64/strchr.S b/newlib/libc/machine/aarch64/strchr.S
> index a4e089b99..500d9aff2 100644
> --- a/newlib/libc/machine/aarch64/strchr.S
> +++ b/newlib/libc/machine/aarch64/strchr.S
> @@ -54,6 +54,7 @@
> /* Locals and temporaries. */
>
> ENTRY (strchr)
> + PTR_ARG (0)
> /* Magic constant 0xc0300c03 to allow us to identify which lane
> matches the requested byte. Even bits are set if the character
> matches, odd bits if either the char is NUL or matches. */
> diff --git a/newlib/libc/machine/aarch64/strchrnul.S b/newlib/libc/machine/aarch64/strchrnul.S
> index 4d6093be7..ceaf4dca1 100644
> --- a/newlib/libc/machine/aarch64/strchrnul.S
> +++ b/newlib/libc/machine/aarch64/strchrnul.S
> @@ -50,6 +50,7 @@
> /* Locals and temporaries. */
>
> ENTRY (strchrnul)
> + PTR_ARG (0)
> /* Magic constant 0x40100401 to allow us to identify which lane
> matches the termination condition. */
> mov wtmp2, #0x0401
> diff --git a/newlib/libc/machine/aarch64/strcmp.S b/newlib/libc/machine/aarch64/strcmp.S
> index 1d85da432..691a1760e 100644
> --- a/newlib/libc/machine/aarch64/strcmp.S
> +++ b/newlib/libc/machine/aarch64/strcmp.S
> @@ -54,6 +54,8 @@
>
>
> ENTRY (strcmp)
> + PTR_ARG (0)
> + PTR_ARG (1)
> sub off2, src2, src1
> mov zeroones, REP8_01
> and tmp, src1, 7
> diff --git a/newlib/libc/machine/aarch64/strcpy.S b/newlib/libc/machine/aarch64/strcpy.S
> index 1f5f70792..57c46f390 100644
> --- a/newlib/libc/machine/aarch64/strcpy.S
> +++ b/newlib/libc/machine/aarch64/strcpy.S
> @@ -55,6 +55,8 @@
> exactly which byte matched. */
>
> ENTRY (STRCPY)
> + PTR_ARG (0)
> + PTR_ARG (1)
> bic src, srcin, 15
> ld1 {vdata.16b}, [src]
> cmeq vhas_nul.16b, vdata.16b, 0
> diff --git a/newlib/libc/machine/aarch64/strlen.S b/newlib/libc/machine/aarch64/strlen.S
> index a3345a3ab..68a6f357c 100644
> --- a/newlib/libc/machine/aarch64/strlen.S
> +++ b/newlib/libc/machine/aarch64/strlen.S
> @@ -78,6 +78,7 @@
> character, return the length, if not, continue in the main loop. */
>
> ENTRY (strlen)
> + PTR_ARG (0)
> and tmp1, srcin, MIN_PAGE_SIZE - 1
> cmp tmp1, MIN_PAGE_SIZE - 32
> b.hi L(page_cross)
> diff --git a/newlib/libc/machine/aarch64/strncmp.S b/newlib/libc/machine/aarch64/strncmp.S
> index 6b1994ef5..373695503 100644
> --- a/newlib/libc/machine/aarch64/strncmp.S
> +++ b/newlib/libc/machine/aarch64/strncmp.S
> @@ -58,6 +58,9 @@
> #endif
>
> ENTRY (strncmp)
> + PTR_ARG (0)
> + PTR_ARG (1)
> + SIZE_ARG (2)
> cbz limit, L(ret0)
> eor tmp1, src1, src2
> mov zeroones, #REP8_01
> diff --git a/newlib/libc/machine/aarch64/strnlen.S b/newlib/libc/machine/aarch64/strnlen.S
> index dc9fcb2fd..091002e0b 100644
> --- a/newlib/libc/machine/aarch64/strnlen.S
> +++ b/newlib/libc/machine/aarch64/strnlen.S
> @@ -39,6 +39,8 @@
> identifies the first zero byte. */
>
> ENTRY (strnlen)
> + PTR_ARG (0)
> + SIZE_ARG (1)
> bic src, srcin, 15
> cbz cntin, L(nomatch)
> ld1 {vdata.16b}, [src]
> diff --git a/newlib/libc/machine/aarch64/strrchr.S b/newlib/libc/machine/aarch64/strrchr.S
> index 67013e39d..b0574228b 100644
> --- a/newlib/libc/machine/aarch64/strrchr.S
> +++ b/newlib/libc/machine/aarch64/strrchr.S
> @@ -58,6 +58,7 @@
> identify exactly which byte is causing the termination, and why. */
>
> ENTRY (strrchr)
> + PTR_ARG (0)
> /* Magic constant 0x40100401 to allow us to identify which lane
> matches the requested byte. Magic constant 0x80200802 used
> similarly for NUL termination. */
> --
> 2.50.1.vfs.0.0
>
More information about the Newlib
mailing list