This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
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>