This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: Add LOAD_ARG[1-6]_TYPE and x32 posix_fallocate.c


On Mon, May 21, 2012 at 3:37 PM, Roland McGrath <roland@hack.frob.com> wrote:
>> That means we will generate "movq" instead of "movl" on user
>> uint32_t/kernel uint64_t arguments with a REX byte which x32
>> doesn't need.
>
> I see. ?Well, if you want to avoid this then you can do the work.
> But what you proposed is just too ugly. ?Instead you can e.g. give
> the syscall macros a variant that takes a macro argument for the
> type of each parameter, and make the existing syscall macros just
> invoke that with 'long int'. ?Or come up with something else, but
> not something so dismally ugly.
>
>

Does this one look OK?

Thanks.


-- 
H.J.
---
	* sysdeps/unix/sysv/linux/x86_64/sysdep.h (LOAD_ARGS_TYPE_1):
	New macro.
	(LOAD_REGS_TYPE_1): Likewise.
	(LOAD_ARGS_TYPE_2): Likewise.
	(LOAD_REGS_TYPE_2): Likewise.
	(LOAD_ARGS_TYPE_3): Likewise.
	(LOAD_REGS_TYPE_3): Likewise.
	(LOAD_ARGS_TYPE_4): Likewise.
	(LOAD_REGS_TYPE_4): Likewise.
	(LOAD_ARGS_TYPE_5): Likewise.
	(LOAD_REGS_TYPE_5): Likewise.
	(LOAD_ARGS_TYPE_6): Likewise.
	(LOAD_REGS_TYPE_6): Likewise.
	(LOAD_ARGS_1): Use LOAD_ARGS_TYPE_1.
	(LOAD_REGS_1): Use LOAD_REGS_TYPE_1.
	(LOAD_ARGS_2): Use LOAD_ARGS_TYPE_2.
	(LOAD_REGS_2): Use LOAD_REGS_TYPE_2.
	(LOAD_ARGS_3): Use LOAD_ARGS_TYPE_3.
	(LOAD_REGS_3): Use LOAD_REGS_TYPE_3.
	(LOAD_ARGS_4): Use LOAD_ARGS_TYPE_4.
	(LOAD_REGS_4): Use LOAD_REGS_TYPE_4.
	(LOAD_ARGS_5): Use LOAD_ARGS_TYPE_5.
	(LOAD_REGS_5): Use LOAD_REGS_TYPE_5.
	(LOAD_ARGS_6): Use LOAD_ARGS_TYPE_6.
	(LOAD_REGS_6): Use LOAD_REGS_TYPE_6.
	* sysdeps/unix/sysv/linux/x86_64/x32/posix_fallocate.c: New file.

diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index 396345e..5e503f2 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -286,53 +286,81 @@
 # define LOAD_REGS_0
 # define ASM_ARGS_0

-# define LOAD_ARGS_1(a1)				\
-  long int __arg1 = (long int) (a1);			\
+# define LOAD_ARGS_TYPE_1(t1, a1)					  \
+  t1 __arg1 = (t1) (a1);						  \
   LOAD_ARGS_0 ()
-# define LOAD_REGS_1					\
-  register long int _a1 asm ("rdi") = __arg1;		\
+# define LOAD_REGS_TYPE_1(t1)						  \
+  register t1 _a1 asm ("rdi") = __arg1;					  \
   LOAD_REGS_0
 # define ASM_ARGS_1	ASM_ARGS_0, "r" (_a1)
-
-# define LOAD_ARGS_2(a1, a2)				\
-  long int __arg2 = (long int) (a2);			\
-  LOAD_ARGS_1 (a1)
-# define LOAD_REGS_2					\
-  register long int _a2 asm ("rsi") = __arg2;		\
-  LOAD_REGS_1
+# define LOAD_ARGS_1(a1)						  \
+  LOAD_ARGS_TYPE_1 (long int, a1)
+# define LOAD_REGS_1							  \
+  LOAD_REGS_TYPE_1 (long int)
+
+# define LOAD_ARGS_TYPE_2(t1, a1, t2, a2)				  \
+  t2 __arg2 = (t2) (a2);						  \
+  LOAD_ARGS_TYPE_1 (t1, a1)
+# define LOAD_REGS_TYPE_2(t1, t2)					  \
+  register t2 _a2 asm ("rsi") = __arg2;					  \
+  LOAD_REGS_TYPE_1(t1)
 # define ASM_ARGS_2	ASM_ARGS_1, "r" (_a2)
-
-# define LOAD_ARGS_3(a1, a2, a3)			\
-  long int __arg3 = (long int) (a3);			\
-  LOAD_ARGS_2 (a1, a2)
-# define LOAD_REGS_3					\
-  register long int _a3 asm ("rdx") = __arg3;		\
-  LOAD_REGS_2
+# define LOAD_ARGS_2(a1, a2)						  \
+  LOAD_ARGS_TYPE_2 (long int, a1, long int, a2)
+# define LOAD_REGS_2							  \
+  LOAD_REGS_TYPE_2 (long int, long int)
+
+# define LOAD_ARGS_TYPE_3(t1, a1, t2, a2, t3, a3)			  \
+  t3 __arg3 = (t3) (a3);						  \
+  LOAD_ARGS_TYPE_2 (t1, a1, t2, a2)
+# define LOAD_REGS_TYPE_3(t1, t2, t3)					  \
+  register t3 _a3 asm ("rdx") = __arg3;					  \
+  LOAD_REGS_TYPE_2(t1, t2)
 # define ASM_ARGS_3	ASM_ARGS_2, "r" (_a3)
-
-# define LOAD_ARGS_4(a1, a2, a3, a4)			\
-  long int __arg4 = (long int) (a4);			\
-  LOAD_ARGS_3 (a1, a2, a3)
-# define LOAD_REGS_4					\
-  register long int _a4 asm ("r10") = __arg4;		\
-  LOAD_REGS_3
+# define LOAD_ARGS_3(a1, a2, a3)					  \
+  LOAD_ARGS_TYPE_3 (long int, a1, long int, a2,	long int, a3)
+# define LOAD_REGS_3							  \
+  LOAD_REGS_TYPE_3 (long int, long int, long int)
+
+# define LOAD_ARGS_TYPE_4(t1, a1, t2, a2, t3, a3, t4, a4)		  \
+  t4 __arg4 = (t4) (a4);						  \
+  LOAD_ARGS_TYPE_3 (t1, a1, t2, a2, t3, a3)
+# define LOAD_REGS_TYPE_4(t1, t2, t3, t4)				  \
+  register t4 _a4 asm ("r10") = __arg4;					  \
+  LOAD_REGS_TYPE_3(t1, t2, t3)
 # define ASM_ARGS_4	ASM_ARGS_3, "r" (_a4)
-
-# define LOAD_ARGS_5(a1, a2, a3, a4, a5)		\
-  long int __arg5 = (long int) (a5);			\
-  LOAD_ARGS_4 (a1, a2, a3, a4)
-# define LOAD_REGS_5					\
-  register long int _a5 asm ("r8") = __arg5;		\
-  LOAD_REGS_4
+# define LOAD_ARGS_4(a1, a2, a3, a4)					  \
+  LOAD_ARGS_TYPE_4 (long int, a1, long int, a2,	long int, a3,		  \
+		    long int, a4)
+# define LOAD_REGS_4							  \
+  LOAD_REGS_TYPE_4 (long int, long int, long int, long int)
+
+# define LOAD_ARGS_TYPE_5(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)	  \
+  t5 __arg5 = (t5) (a5);						  \
+  LOAD_ARGS_TYPE_4 (t1, a1, t2, a2, t3, a3, t4, a4)
+# define LOAD_REGS_TYPE_5(t1, t2, t3, t4, t5)				  \
+  register t5 _a5 asm ("r8") = __arg5;					  \
+  LOAD_REGS_TYPE_4(t1, t2, t3, t4)
 # define ASM_ARGS_5	ASM_ARGS_4, "r" (_a5)
-
-# define LOAD_ARGS_6(a1, a2, a3, a4, a5, a6)		\
-  long int __arg6 = (long int) (a6);			\
-  LOAD_ARGS_5 (a1, a2, a3, a4, a5)
-# define LOAD_REGS_6					\
-  register long int _a6 asm ("r9") = __arg6;		\
-  LOAD_REGS_5
+# define LOAD_ARGS_5(a1, a2, a3, a4, a5)				  \
+  LOAD_ARGS_TYPE_5 (long int, a1, long int, a2,	long int, a3,		  \
+		    long int, a4, long int, a5)
+# define LOAD_REGS_5							  \
+  LOAD_REGS_TYPE_5 (long int, long int, long int, long int, long int)
+
+# define LOAD_ARGS_TYPE_6(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6) \
+  t6 __arg6 = (t6) (a6);						  \
+  LOAD_ARGS_TYPE_5 (t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)
+# define LOAD_REGS_TYPE_6(t1, t2, t3, t4, t5, t6)			  \
+  register t6 _a6 asm ("r9") = __arg6;					  \
+  LOAD_REGS_TYPE_5(t1, t2, t3, t4, t5)
 # define ASM_ARGS_6	ASM_ARGS_5, "r" (_a6)
+# define LOAD_ARGS_6(a1, a2, a3, a4, a5, a6)				  \
+  LOAD_ARGS_TYPE_6 (long int, a1, long int, a2,	long int, a3,		  \
+		    long int, a4, long int, a5, long int, a6)
+# define LOAD_REGS_6							  \
+  LOAD_REGS_TYPE_6 (long int, long int, long int, long int, long int,	  \
+		    long int)

 #endif	/* __ASSEMBLER__ */

diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/posix_fallocate.c
b/sysdeps/unix/sysv/linux/x86_64/x32/posix_fallocate.c
new file mode 100644
index 0000000..104ef89
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/posix_fallocate.c
@@ -0,0 +1,19 @@
+#include <sysdep.h>
+
+/* Since posix_fallocate is implemented by calling the fallocate
+   system call with: fallocate (fd, 0, offset, len), we redefine
+   arguments 3 (offset) and 4 (len) to be long long int to match:
+
+   int fallocate(int fd, int mode, off_t offset, off_t len);
+ */
+
+#undef LOAD_ARGS_4
+#define LOAD_ARGS_4(a1, a2, a3, a4)			\
+  LOAD_ARGS_TYPE_4 (long int, a1, long int, a2,		\
+		    long long int, a3, long long int, a4)
+#undef LOAD_REGS_4
+#define LOAD_REGS_4					\
+  LOAD_REGS_TYPE_4 (long int, long int, long long int,	\
+		    long long int)
+
+#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]