Re: [EXTERNAL] Re: [PATCH] newlib: libc: make AArch64 assembly implementations portable
Radek Barton <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <DB9PR83MB0923A0251F9A94A09FCC00799270A@DB9PR83MB0923.EURPRD83.prod.outlook.com> |
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 <[email protected]> Sent: Thursday, June 12, 2025 10:39 PM To: [email protected] <[email protected]> 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?= <[email protected]> > 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