svn commit: trunk/uClibc/libc/sysdeps/linux/i386/bits

vapier at uclibc.org vapier at uclibc.org
Sat Jan 5 05:55:23 UTC 2008


Author: vapier
Date: 2008-01-04 21:55:23 -0800 (Fri, 04 Jan 2008)
New Revision: 20712

Log:
michael_d writes in #1874: 
On an i386 platform with no rt_sigsuspend syscall (ie: Linux 2.0), compilation will halt on libc/sysdeps/linux/common/sigsuspend.os with a cryptic error message:
"Error: non-constant expression in ".if" statement"

I've investigated and found that the cause is that a literal '0' is being passed into a block of complex assembler macrology that is only prepared to deal with register names - '%eax', etc.

In turn, that seems to be because of a typo in the GCC register constraints. The constraints for 2 and 3-argument syscalls includes a "C" constraint. To gcc, "C" means an SSE floating point constant -- an unlikely element in a syscall. I suspect the author meant to type "S" (%esi).


Modified:
   trunk/uClibc/libc/sysdeps/linux/i386/bits/syscalls.h


Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/i386/bits/syscalls.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/i386/bits/syscalls.h	2008-01-05 05:32:09 UTC (rev 20711)
+++ trunk/uClibc/libc/sysdeps/linux/i386/bits/syscalls.h	2008-01-05 05:55:23 UTC (rev 20712)
@@ -197,9 +197,9 @@
 #define ASMFMT_1(arg1) \
 	, "acdSD" (arg1)
 #define ASMFMT_2(arg1, arg2) \
-	, "adCD" (arg1), "c" (arg2)
+	, "adSD" (arg1), "c" (arg2)
 #define ASMFMT_3(arg1, arg2, arg3) \
-	, "aCD" (arg1), "c" (arg2), "d" (arg3)
+	, "aSD" (arg1), "c" (arg2), "d" (arg3)
 #define ASMFMT_4(arg1, arg2, arg3, arg4) \
 	, "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
 #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \




More information about the uClibc-cvs mailing list