[PATCH v3] librt: fix mq_timed{send,receive} return instructions
Baruch Siach
baruch at tkos.co.il
Thu Nov 7 09:52:18 UTC 2013
Not all architectures use 'ret' as function return instruction. For example,
xtensa usually uses 'retw'. Use the ret_ERRVAL arch dependant macro instead.
Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
v3: Add a common ret_ERRVAL, and redefine for special archs (Bernhard
Reutner-Fischer)
v2: Add ret_ERRVAL to architectures missing it as noted by Bernhard
Reutner-Fischer.
---
libc/sysdeps/linux/arm/sysdep.h | 1 +
libc/sysdeps/linux/common/sysdep.h | 4 ++++
libc/sysdeps/linux/i386/sysdep.h | 2 --
libc/sysdeps/linux/ia64/sysdep.h | 1 -
libc/sysdeps/linux/mips/sysdep.h | 2 --
libc/sysdeps/linux/powerpc/powerpc32/sysdep.h | 1 +
libc/sysdeps/linux/powerpc/powerpc64/sysdep.h | 1 +
libc/sysdeps/linux/sh/sysdep.h | 2 --
libc/sysdeps/linux/x86_64/sysdep.h | 2 --
librt/mq_timedreceive.S | 2 +-
librt/mq_timedsend.S | 2 +-
11 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/libc/sysdeps/linux/arm/sysdep.h b/libc/sysdeps/linux/arm/sysdep.h
index d4a86d3..5c751f5 100644
--- a/libc/sysdeps/linux/arm/sysdep.h
+++ b/libc/sysdeps/linux/arm/sysdep.h
@@ -156,6 +156,7 @@
#define PSEUDO_END_ERRVAL(name) \
END (name)
+#undef ret_ERRVAL
#define ret_ERRVAL PSEUDO_RET_NOERRNO
#if defined NOT_IN_libc
diff --git a/libc/sysdeps/linux/common/sysdep.h b/libc/sysdeps/linux/common/sysdep.h
index 8e39b5b..9c9b69a 100644
--- a/libc/sysdeps/linux/common/sysdep.h
+++ b/libc/sysdeps/linux/common/sysdep.h
@@ -48,6 +48,10 @@
#define JUMPTARGET(sym) sym
#endif
+#ifndef ret_ERRVAL
+#define ret_ERRVAL ret
+#endif
+
/* Macros to generate eh_frame unwind information. */
# ifdef HAVE_ASM_CFI_DIRECTIVES
# define cfi_sections(sect...) .cfi_sections sect
diff --git a/libc/sysdeps/linux/i386/sysdep.h b/libc/sysdeps/linux/i386/sysdep.h
index 7a8d2e2..40088ad 100644
--- a/libc/sysdeps/linux/i386/sysdep.h
+++ b/libc/sysdeps/linux/i386/sysdep.h
@@ -195,8 +195,6 @@ __x86.get_pc_thunk.reg: \
#define PSEUDO_END_ERRVAL(name) \
END (name)
-#define ret_ERRVAL ret
-
#ifndef __PIC__
# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
#else
diff --git a/libc/sysdeps/linux/ia64/sysdep.h b/libc/sysdeps/linux/ia64/sysdep.h
index eacc22b..7cbd77e 100644
--- a/libc/sysdeps/linux/ia64/sysdep.h
+++ b/libc/sysdeps/linux/ia64/sysdep.h
@@ -169,7 +169,6 @@
#define ret br.ret.sptk.few b0
#define ret_NOERRNO ret
-#define ret_ERRVAL ret
#endif /* not __ASSEMBLER__ */
diff --git a/libc/sysdeps/linux/mips/sysdep.h b/libc/sysdeps/linux/mips/sysdep.h
index 04e0da5..6dba1fb 100644
--- a/libc/sysdeps/linux/mips/sysdep.h
+++ b/libc/sysdeps/linux/mips/sysdep.h
@@ -77,8 +77,6 @@
#undef PSEUDO_END_ERRVAL
#define PSEUDO_END_ERRVAL(sym) .end sym; .size sym,.-sym
-#define ret_ERRVAL ret
-
#define r0 v0
#define r1 v1
/* The mips move insn is d,s. */
diff --git a/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h b/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h
index 6d641dc..d9a4704 100644
--- a/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h
+++ b/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h
@@ -132,6 +132,7 @@
#define PSEUDO_RET_ERRVAL \
blr
+#undef ret_ERRVAL
#define ret_ERRVAL PSEUDO_RET_ERRVAL
#undef PSEUDO_END_ERRVAL
diff --git a/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h b/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h
index 701fad8..902b63b 100644
--- a/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h
+++ b/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h
@@ -227,6 +227,7 @@ LT_LABELSUFFIX(name,_name_end): ; \
#define PSEUDO_RET_ERRVAL \
blr
+#undef ret_ERRVAL
#define ret_ERRVAL PSEUDO_RET_ERRVAL
#undef PSEUDO_END_ERRVAL
diff --git a/libc/sysdeps/linux/sh/sysdep.h b/libc/sysdeps/linux/sh/sysdep.h
index c692617..69bcbe1 100644
--- a/libc/sysdeps/linux/sh/sysdep.h
+++ b/libc/sysdeps/linux/sh/sysdep.h
@@ -141,8 +141,6 @@
#define PSEUDO_END_ERRVAL(name) \
END (name)
-#define ret_ERRVAL ret
-
#ifndef __PIC__
# define SYSCALL_ERROR_HANDLER \
mov.l 0f,r1; \
diff --git a/libc/sysdeps/linux/x86_64/sysdep.h b/libc/sysdeps/linux/x86_64/sysdep.h
index fdf7de1..ed7e26e 100644
--- a/libc/sysdeps/linux/x86_64/sysdep.h
+++ b/libc/sysdeps/linux/x86_64/sysdep.h
@@ -182,8 +182,6 @@ lose: \
# define PSEUDO_END_ERRVAL(name) \
END (name)
-# define ret_ERRVAL ret
-
# ifndef __PIC__
# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
# elif defined(RTLD_PRIVATE_ERRNO)
diff --git a/librt/mq_timedreceive.S b/librt/mq_timedreceive.S
index 43a5fda..00fecac 100644
--- a/librt/mq_timedreceive.S
+++ b/librt/mq_timedreceive.S
@@ -3,6 +3,6 @@
#error Missing definition of NR_timedreceive needed for cancellation.
#endif
PSEUDO(mq_timedreceive, mq_timedreceive, 5)
-ret
+ret_ERRVAL
PSEUDO_END(mq_timedreceive)
librt_hidden_def(mq_timedreceive)
diff --git a/librt/mq_timedsend.S b/librt/mq_timedsend.S
index 13d91da..ee8d483 100644
--- a/librt/mq_timedsend.S
+++ b/librt/mq_timedsend.S
@@ -3,6 +3,6 @@
#error Missing definition of NR_timedsend needed for cancellation.
#endif
PSEUDO(mq_timedsend, mq_timedsend, 5)
-ret
+ret_ERRVAL
PSEUDO_END(mq_timedsend)
librt_hidden_def(mq_timedsend)
--
1.8.4.rc3
More information about the uClibc
mailing list