[PATCH] newlib: libc: make AArch64 assembly implementations portable
Radek Barton <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <DB9PR83MB0923CB042F211761B2F748929274A@DB9PR83MB0923.EURPRD83.prod.outlook.com> |
Hello. 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) -- 2.49.0.vfs.0.3
0001-newlib-libc-make-AArch64-assembly-implementations-po.patch
(application/octet-stream, 3.4 KB)
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) -- 2.49.0.vfs.0.3