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

Radek Barton radek.barton@microsoft.com
Thu Jun 12 07:01:29 GMT 2025


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?= <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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-newlib-libc-make-AArch64-assembly-implementations-po.patch
Type: application/octet-stream
Size: 3453 bytes
Desc: 0001-newlib-libc-make-AArch64-assembly-implementations-po.patch
URL: <https://sourceware.org/pipermail/newlib/attachments/20250612/f98796c1/attachment-0001.obj>


More information about the Newlib mailing list