[PATCH] newlib: libc: return back support for AArch64 ILP32

Joel Sherrill joel.sherrill@gmail.com
Thu Jul 24 14:41:08 GMT 2025


Yes. I will test. It may be tomorrow before results pop out.

Also ip32 is still in GCC 15. It is not the usual --enable-obsolete as the
nios2
requires in gcc 14. You needed to add   -Wno-error=deprecated to the target
CFLAGS. Different but works fine.

Thanks.

--joel

On Thu, Jul 24, 2025 at 6:07 AM Corinna Vinschen <vinschen@redhat.com>
wrote:

> 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
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/newlib/attachments/20250724/7d99f852/attachment.htm>


More information about the Newlib mailing list