[EXTERNAL] Re: [PATCH] newlib: libc: make AArch64 assembly implementations portable

Radek Barton radek.barton@microsoft.com
Mon Jun 16 08:02:46 GMT 2025


Hello Brian.

Equivalent change is not needed for x86_64 Cygwin as x86_64-specific parts of newlib codebase do not use such directives. Some of the implementations in newlib/libc/machine/aarch64 could be theoretically shared between ELF and COFF and this change is a first step to make it possible.

Similar change in GCC codebase (https://github.com/Windows-on-ARM-Experiments/gcc-woarm64/commit/c608ada288ced0268bbbbc1fd4136f56c34b24d4) was accepted to upstream. For COFF, those directives have no effect at binutils level.

Does this address your concerns?

Radek

________________________________________
From: Brian Inglis <Brian.Inglis@SystematicSW.ab.ca>
Sent: Thursday, June 12, 2025 10:39 PM
To: newlib@sourceware.org <newlib@sourceware.org>
Subject: [EXTERNAL] Re: [PATCH] newlib: libc: make AArch64 assembly implementations portable
 
Is the same approach used for Cygwin x86/_64 COFF, does Cygwin use a different
newlib tree for COFF, or do binutils or gas ignore these on COFF or Cygwin?

On 2025-06-12 01:01, Radek Barton wrote:
> To allow AArch64 build of Cygwin, the following usages of `.hidden`, `.size`, and `.type` assembly directives needs to be wrapped in macros.
>
> Thank you for your feedback.
>
> Radek
>
> ---
>  From 16ff5ba2548f23501f82644b3c0d819d6b70b096 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] newlib: libc: make AArch64 assembly implementations portable
>
> .hidden, .size, and .type name directives are relevant only for ELF, they are not supported for COFF.
> ---
>   newlib/libc/machine/aarch64/asmdefs.h   | 18 ++++++++++++++----
>   newlib/libc/machine/aarch64/rawmemchr.S |  6 ++++--
>   newlib/libc/machine/aarch64/setjmp.S    | 10 ++++++----
>   3 files changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/newlib/libc/machine/aarch64/asmdefs.h b/newlib/libc/machine/aarch64/asmdefs.h
> index 131b95e1f..da1df3da6 100644
> --- a/newlib/libc/machine/aarch64/asmdefs.h
> +++ b/newlib/libc/machine/aarch64/asmdefs.h
> @@ -59,9 +59,19 @@
>   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;      \
> +  SYMBOL_TYPE(name, %function);      \
>     .align alignment;         \
>     name:                     \
>     .cfi_startproc;   \
> @@ -70,13 +80,13 @@ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC)
>   #define ENTRY(name) ENTRY_ALIGN(name, 6)
>  
>   #define ENTRY_ALIAS(name)   \
> -  .global name;              \
> -  .type name,%function;      \
> +  .global name;                      \
> +  SYMBOL_TYPE(name, %function);      \
>     name:
>  
>   #define END(name)   \
>     .cfi_endproc;             \
> -  .size name, .-name;
> +  SYMBOL_SIZE(name);
>  
>   #define L(l) .L ## l
>  
> diff --git a/newlib/libc/machine/aarch64/rawmemchr.S b/newlib/libc/machine/aarch64/rawmemchr.S
> index 26da81005..97374282e 100644
> --- a/newlib/libc/machine/aarch64/rawmemchr.S
> +++ b/newlib/libc/machine/aarch64/rawmemchr.S
> @@ -34,13 +34,15 @@
>   /* See rawmemchr-stub.c.  */
>   #else
>  
> +#include "asmdefs.h"
> +
>   #define L(l) .L ## l
>  
>        .macro def_fn f p2align=0
>        .text
>        .p2align \p2align
>        .global \f
> -     .type \f, %function
> +     SYMBOL_TYPE(\f, %function)
>   \f:
>        .endm
>  
> @@ -63,6 +65,6 @@ L(do_strlen):
>        ret     x15
>        .cfi_endproc
>  
> -     .size   rawmemchr, . - rawmemchr
> +     SYMBOL_SIZE(rawmemchr)
>   #endif
>  
> diff --git a/newlib/libc/machine/aarch64/setjmp.S b/newlib/libc/machine/aarch64/setjmp.S
> index 0856145bf..bba8d668a 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);        \
> @@ -43,7 +45,7 @@
>  
>   // int setjmp (jmp_buf)
>        .global setjmp
> -     .type   setjmp, %function
> +     SYMBOL_TYPE(setjmp, %function)
>   setjmp:
>        mov     x16, sp
>   #define REG_PAIR(REG1, REG2, OFFS)  stp REG1, REG2, [x0, OFFS]
> @@ -54,11 +56,11 @@ setjmp:
>   #undef REG_ONE
>        mov     w0, #0
>        ret
> -     .size   setjmp, .-setjmp
> +     SYMBOL_SIZE(setjmp)
>  
>   // void longjmp (jmp_buf, int) __attribute__ ((noreturn))
>        .global longjmp
> -     .type   longjmp, %function
> +     SYMBOL_TYPE(longjmp, %function)
>   longjmp:
>   #define REG_PAIR(REG1, REG2, OFFS)  ldp REG1, REG2, [x0, OFFS]
>   #define REG_ONE(REG1, OFFS)         ldr REG1, [x0, OFFS]
> @@ -71,4 +73,4 @@ longjmp:
>        cinc    w0, w1, eq
>        // use br not ret, as ret is guaranteed to mispredict
>        br      x30
> -     .size   longjmp, .-longjmp
> +     SYMBOL_SIZE(longjmp)


--
Take care. Thanks, Brian Inglis              Calgary, Alberta, Canada

La perfection est atteinte                   Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter  not when there is no more to add
mais lorsqu'il n'y a plus rien à retrancher  but when there is no more to cut
                                 -- Antoine de Saint-Exupéry


More information about the Newlib mailing list