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

Joel Sherrill joel.sherrill@gmail.com
Fri Jul 25 17:27:20 GMT 2025


I will admit to pushing the local patch I had to revert it. I reverted my
revert
and then added Radek's again. I am building all RTEMS tool chains with
the newlib upstream hash with no patches.  This was needed whether I
made a mistake or not as I had to switch our build over to the upstream
with no patches.

Sorry.

--joel

On Fri, Jul 25, 2025 at 12:07 PM Joel Sherrill <joel.sherrill@gmail.com>
wrote:

> Seeing as I am the one who had the issue and has confirmed the fix,
> I went ahead and pushed it.
>
> Given that it is Friday afternoon, I wanted to leave a build of all RTEMS
> tools going with the new hash. That's 26 tool chains for our development
> main -- 13 targets each for GCC 13 and GCC 15. Thankfully, we obsoleted
> 5 target architectures after our last release or that number would be even
> higher.
>
> Thanks.
>
> --joel
>
> On Fri, Jul 25, 2025 at 11:57 AM Joel Sherrill <joel.sherrill@gmail.com>
> wrote:
>
>> Replying to this because the v2 post never showed up in my inbox.
>> I pulled it from the list archives and can report that now there are no
>> property warnings when linking and all aarch64 BSPs for RTEMS build
>> and link fine.
>>
>> I am ok for someone to push it.
>>
>> Thanks.
>>
>> --joel
>>
>> On Thu, Jul 24, 2025 at 2:28 PM Radek Barton <radek.barton@microsoft.com>
>> wrote:
>>
>>> Hello.
>>>
>>> Thank you for testing. I missed that hunk, sorry.
>>>
>>> Radek
>>>
>>> ---
>>> From c6ead049bee2efc5355f734425efaaaf833a0a6b 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 v2] 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   | 48 +++++++++++++++++++------
>>>  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, 64 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/newlib/libc/machine/aarch64/asmdefs.h
>>> b/newlib/libc/machine/aarch64/asmdefs.h
>>> index 6c99fa704..2aaa459ee 100644
>>> --- a/newlib/libc/machine/aarch64/asmdefs.h
>>> +++ b/newlib/libc/machine/aarch64/asmdefs.h
>>> @@ -30,18 +30,32 @@
>>>  #define FEATURE_1_PAC 2
>>>
>>>  /* Add a NT_GNU_PROPERTY_TYPE_0 note.  */
>>> +#ifdef __ILP32__
>>>  #define GNU_PROPERTY(type, value)      \
>>> -  .section .note.gnu.property, "a"  SEP \
>>> -  .p2align 3                       SEP \
>>> -  .word 4                          SEP \
>>> -  .word 16                         SEP \
>>> -  .word 5                          SEP \
>>> -  .asciz "GNU"                     SEP \
>>> -  .word type                       SEP \
>>> -  .word 4                          SEP \
>>> -  .word value                      SEP \
>>> -  .word 0                          SEP \
>>> +  .section .note.gnu.property, "a";    \
>>> +  .p2align 2;                          \
>>> +  .word 4;                             \
>>> +  .word 12;                            \
>>> +  .word 5;                             \
>>> +  .asciz "GNU";                                \
>>> +  .word type;                          \
>>> +  .word 4;                             \
>>> +  .word value;                         \
>>>    .text
>>> +#else
>>> +#define GNU_PROPERTY(type, value)      \
>>> +  .section .note.gnu.property, "a";    \
>>> +  .p2align 3;                          \
>>> +  .word 4;                             \
>>> +  .word 16;                            \
>>> +  .word 5;                             \
>>> +  .asciz "GNU";                                \
>>> +  .word type;                          \
>>> +  .word 4;                             \
>>> +  .word value;                         \
>>> +  .word 0;                             \
>>> +  .text
>>> +#endif
>>>
>>>  /* If set then the GNU Property Note section will be added to
>>>     mark objects to support BTI and PAC-RET.  */
>>> @@ -88,4 +102,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/20250725/738ccc25/attachment-0001.htm>


More information about the Newlib mailing list