[PATCH] newlib: libc: make AArch64 assembly implementations portable
Corinna Vinschen
vinschen@redhat.com
Tue Jun 17 15:06:37 GMT 2025
On Jun 12 07:01, Radek Barton wrote:
> Hello.
>
> To allow AArch64 build of Cygwin, the following usages of `.hidden`, `.size`, and `.type` assembly directives needs to be wrapped in macros.
Looks good to me. Richard?
Thanks,
Corinna
>
> 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)
> --
> 2.49.0.vfs.0.3
More information about the Newlib
mailing list