Re: [PATCH v2] newlib: libc: return back support for AArch64 ILP32
Joel Sherrill <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <CAF9ehCWbp0kdq=c=HRKm5Grqsg1Vxrd7mBf8y7DPN28KrFnPqw@mail.gmail.com> |
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 <[email protected]> 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 <[email protected]> > 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?= <[email protected]> >> 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ň <[email protected]> >> --- >> 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 >> >>