[PATCH v2] newlib: libc: make AArch64 asmdefs.h compatible with GCC/binutils COFF
Corinna Vinschen
vinschen@redhat.com
Fri Jul 4 10:42:07 GMT 2025
Richard, ping?
Thanks,
Corinna
On Jun 27 20:12, Radek Barton wrote:
> Hello.
>
> I've synchronized `aarch64/asmdefs.h` with https://github.com/ARM-software/optimized-routines/blob/5c64ebba90013c0b9b75effad1dce458b2019b68/string/aarch64/asmdefs.h which required removal of usages of `PTR_ARG` and `SIZE_ARG` across the codebase as ILP32 was deprecated/removed upstream.
>
> Then, I added `HIDDEN`, `SYMBOL_SIZE` and `SYMBOL_TYPE` macros to `aarch64/asmdefs.h` and refactored `setjmp.S` and `rawmemchr.S` to use `ENTRY`/`ENTRY_ALIGN` and `END`.
>
> If I can get your confirmation that these are the changes you desired, please, I'll submit the changes on top of the upstream `aarch64/asmdefs.h` as a PR to https://github.com/ARM-software/optimized-routines.
>
> Thank you for your feedback.
>
> Radek
> ---
> >From a3ae7b11f4599a84cf9b7d68462cb611ad791b30 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Radek=20Barto=C5=88?= <radek.barton@microsoft.com>
> Date: Thu, 5 Jun 2025 11:32:08 +0200
> Subject: [PATCH v2] newlib: libc: make AArch64 asmdefs.h compatible
> with GCC/binutils COFF
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> .hidden, .size, and .type name directives are relevant only for ELF, they are not supported for COFF
>
> Changes in newlib/libc/machine/aarch64/asmdefs.h required its synchronization with
> https://github.com/ARM-software/optimized-routines/blob/5c64ebba90013c0b9b75effad1dce458b2019b68/string/aarch64/asmdefs.h
>
> This version of the asmdefs.h removed PTR_ARG and SIZE_ARG macros as ILP32 was deprecated which introduced changes in many .S files.
>
> On top of that, setjmp.S and rawmemchr.S were refactored to use ENTRY/ENTRY_ALIGN and END macros.
>
> Signed-off-by: Radek Bartoň <radek.barton@microsoft.com>
> ---
> newlib/libc/machine/aarch64/asmdefs.h | 114 +++++++++++-------------
> 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/rawmemchr.S | 17 +---
> newlib/libc/machine/aarch64/setjmp.S | 14 ++-
> 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 -
> 16 files changed, 63 insertions(+), 108 deletions(-)
>
> diff --git a/newlib/libc/machine/aarch64/asmdefs.h b/newlib/libc/machine/aarch64/asmdefs.h
> index 131b95e1f..365c2d526 100644
> --- a/newlib/libc/machine/aarch64/asmdefs.h
> +++ b/newlib/libc/machine/aarch64/asmdefs.h
> @@ -1,19 +1,28 @@
> /*
> * Macros for asm code. AArch64 version.
> *
> - * Copyright (c) 2019-2023, Arm Limited.
> + * Copyright (c) 2019-2025, Arm Limited.
> * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
> */
>
> #ifndef _ASMDEFS_H
> #define _ASMDEFS_H
>
> +/* Set the line separator for the assembler. */
> +#if defined (__APPLE__)
> +# define SEP %%
> +# define PREF _
> +#else
> +# define SEP ;
> +# define PREF
> +#endif
> +
> /* Branch Target Identitication support. */
> #define BTI_C hint 34
> #define BTI_J hint 36
> /* Return address signing support (pac-ret). */
> -#define PACIASP hint 25; .cfi_window_save
> -#define AUTIASP hint 29; .cfi_window_save
> +#define PACIASP hint 25 SEP .cfi_window_save
> +#define AUTIASP hint 29 SEP .cfi_window_save
>
> /* GNU_PROPERTY_AARCH64_* macros from elf.h. */
> #define FEATURE_1_AND 0xc0000000
> @@ -21,32 +30,18 @@
> #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"; \
> - .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; \
> + .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 \
> .text
> -#endif
>
> /* If set then the GNU Property Note section will be added to
> mark objects to support BTI and PAC-RET. */
> @@ -59,48 +54,47 @@
> GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC)
> #endif
>
> +#ifdef __ELF__
> +#define HIDDEN(name) .hidden name
> +#define SYMBOL_SIZE(name) .size name, .-name
> +#define SYMBOL_TYPE(name, _type) .type name, _type
> +#else
> +#define HIDDEN(name)
> +#define SYMBOL_SIZE(name)
> +#define SYMBOL_TYPE(name, _type)
> +#endif
> +
> #define ENTRY_ALIGN(name, alignment) \
> - .global name; \
> - .type name,%function; \
> - .align alignment; \
> - name: \
> - .cfi_startproc; \
> - BTI_C;
> + .align alignment SEP \
> + ENTRY_ALIAS(name) SEP \
> + .cfi_startproc SEP \
> + BTI_C
>
> #define ENTRY(name) ENTRY_ALIGN(name, 6)
>
> -#define ENTRY_ALIAS(name) \
> - .global name; \
> - .type name,%function; \
> - name:
> +#if defined (__APPLE__)
> +/* Darwin is an underscore platform, symbols need an extra _ prefix. */
> +# define ENTRY_ALIAS(name) \
> + .global _ ## name SEP \
> + _ ## name:
>
> -#define END(name) \
> - .cfi_endproc; \
> - .size name, .-name;
> -
> -#define L(l) .L ## l
> +# define END(name) .cfi_endproc
> +#elif defined (_WIN32)
> +# define ENTRY_ALIAS(name) \
> + name:
>
> -#ifdef __ILP32__
> - /* Sanitize padding bits of pointer arguments as per aapcs64 */
> -#define PTR_ARG(n) mov w##n, w##n
> +# define END(name) .cfi_endproc
> #else
> -#define PTR_ARG(n)
> -#endif
> +# define ENTRY_ALIAS(name) \
> + .global name; \
> + SYMBOL_TYPE(name, %function;) \
> + name:
>
> -#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)
> +# define END(name) \
> + .cfi_endproc; \
> + SYMBOL_SIZE(name)
> #endif
>
> -/* Compiler supports SVE instructions */
> -#ifndef HAVE_SVE
> -# if __aarch64__ && (__GNUC__ >= 8 || __clang_major__ >= 5)
> -# define HAVE_SVE 1
> -# else
> -# define HAVE_SVE 0
> -# endif
> -#endif
> +#define L(l) .L ## l
>
> #endif
> diff --git a/newlib/libc/machine/aarch64/memchr.S b/newlib/libc/machine/aarch64/memchr.S
> index a0f305e0f..074a004cf 100644
> --- a/newlib/libc/machine/aarch64/memchr.S
> +++ b/newlib/libc/machine/aarch64/memchr.S
> @@ -50,8 +50,6 @@
> */
>
> 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 18874d321..2a9c446bb 100644
> --- a/newlib/libc/machine/aarch64/memcmp.S
> +++ b/newlib/libc/machine/aarch64/memcmp.S
> @@ -34,10 +34,6 @@
>
>
> 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 248e7843a..252d2452a 100644
> --- a/newlib/libc/machine/aarch64/memcpy.S
> +++ b/newlib/libc/machine/aarch64/memcpy.S
> @@ -58,9 +58,6 @@
>
> 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 ba9915cc3..2525cf190 100644
> --- a/newlib/libc/machine/aarch64/memrchr.S
> +++ b/newlib/libc/machine/aarch64/memrchr.S
> @@ -45,7 +45,6 @@
> 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 ca76439a9..5bf4851f3 100644
> --- a/newlib/libc/machine/aarch64/memset.S
> +++ b/newlib/libc/machine/aarch64/memset.S
> @@ -25,9 +25,6 @@
> #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/rawmemchr.S b/newlib/libc/machine/aarch64/rawmemchr.S
> index 26da81005..85dda749a 100644
> --- a/newlib/libc/machine/aarch64/rawmemchr.S
> +++ b/newlib/libc/machine/aarch64/rawmemchr.S
> @@ -34,22 +34,13 @@
> /* See rawmemchr-stub.c. */
> #else
>
> -#define L(l) .L ## l
> -
> - .macro def_fn f p2align=0
> - .text
> - .p2align \p2align
> - .global \f
> - .type \f, %function
> -\f:
> - .endm
> +#include "asmdefs.h"
>
> /* Special case rawmemchr (s, 0) as strlen, otherwise tailcall memchr.
> Call strlen without setting up a full frame - it preserves x14/x15.
> */
>
> -def_fn rawmemchr p2align=5
> - .cfi_startproc
> +ENTRY_ALIGN (rawmemchr, 5)
> cbz w1, L(do_strlen)
> mov x2, -1
> b memchr
> @@ -61,8 +52,6 @@ L(do_strlen):
> bl strlen
> add x0, x14, x0
> ret x15
> - .cfi_endproc
> +END (rawmemchr)
>
> - .size rawmemchr, . - rawmemchr
> #endif
> -
> diff --git a/newlib/libc/machine/aarch64/setjmp.S b/newlib/libc/machine/aarch64/setjmp.S
> index 0856145bf..1a1f2a387 100644
> --- a/newlib/libc/machine/aarch64/setjmp.S
> +++ b/newlib/libc/machine/aarch64/setjmp.S
> @@ -26,6 +26,8 @@
> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> */
>
> +#include "asmdefs.h"
> +
> #define GPR_LAYOUT \
> REG_PAIR (x19, x20, 0); \
> REG_PAIR (x21, x22, 16); \
> @@ -42,9 +44,7 @@
> REG_PAIR (d14, d15, 160);
>
> // int setjmp (jmp_buf)
> - .global setjmp
> - .type setjmp, %function
> -setjmp:
> +ENTRY (setjmp)
> mov x16, sp
> #define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS]
> #define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS]
> @@ -54,12 +54,10 @@ setjmp:
> #undef REG_ONE
> mov w0, #0
> ret
> - .size setjmp, .-setjmp
> +END (setjmp)
>
> // void longjmp (jmp_buf, int) __attribute__ ((noreturn))
> - .global longjmp
> - .type longjmp, %function
> -longjmp:
> +ENTRY (longjmp)
> #define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS]
> #define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS]
> GPR_LAYOUT
> @@ -71,4 +69,4 @@ longjmp:
> cinc w0, w1, eq
> // use br not ret, as ret is guaranteed to mispredict
> br x30
> - .size longjmp, .-longjmp
> +END (longjmp)
> diff --git a/newlib/libc/machine/aarch64/strchr.S b/newlib/libc/machine/aarch64/strchr.S
> index 500d9aff2..a4e089b99 100644
> --- a/newlib/libc/machine/aarch64/strchr.S
> +++ b/newlib/libc/machine/aarch64/strchr.S
> @@ -54,7 +54,6 @@
> /* 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 ceaf4dca1..4d6093be7 100644
> --- a/newlib/libc/machine/aarch64/strchrnul.S
> +++ b/newlib/libc/machine/aarch64/strchrnul.S
> @@ -50,7 +50,6 @@
> /* 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 691a1760e..1d85da432 100644
> --- a/newlib/libc/machine/aarch64/strcmp.S
> +++ b/newlib/libc/machine/aarch64/strcmp.S
> @@ -54,8 +54,6 @@
>
>
> 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 57c46f390..1f5f70792 100644
> --- a/newlib/libc/machine/aarch64/strcpy.S
> +++ b/newlib/libc/machine/aarch64/strcpy.S
> @@ -55,8 +55,6 @@
> 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 68a6f357c..a3345a3ab 100644
> --- a/newlib/libc/machine/aarch64/strlen.S
> +++ b/newlib/libc/machine/aarch64/strlen.S
> @@ -78,7 +78,6 @@
> 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 373695503..6b1994ef5 100644
> --- a/newlib/libc/machine/aarch64/strncmp.S
> +++ b/newlib/libc/machine/aarch64/strncmp.S
> @@ -58,9 +58,6 @@
> #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 091002e0b..dc9fcb2fd 100644
> --- a/newlib/libc/machine/aarch64/strnlen.S
> +++ b/newlib/libc/machine/aarch64/strnlen.S
> @@ -39,8 +39,6 @@
> 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 b0574228b..67013e39d 100644
> --- a/newlib/libc/machine/aarch64/strrchr.S
> +++ b/newlib/libc/machine/aarch64/strrchr.S
> @@ -58,7 +58,6 @@
> 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.49.0.vfs.0.4
>
More information about the Newlib
mailing list