|
From: <sv...@va...> - 2005-12-29 17:44:44
|
Author: sewardj
Date: 2005-12-29 17:44:36 +0000 (Thu, 29 Dec 2005)
New Revision: 5457
Log:
Function wrapping support for x86: add more cases and fix up types a bit.
Modified:
branches/FNWRAP/include/valgrind.h
Modified: branches/FNWRAP/include/valgrind.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/FNWRAP/include/valgrind.h 2005-12-28 15:19:39 UTC (rev 5456)
+++ branches/FNWRAP/include/valgrind.h 2005-12-29 17:44:36 UTC (rev 5457)
@@ -335,32 +335,35 @@
as gcc can already see that, plus causes gcc to bomb. */
#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx"
=20
+/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned
+ long) =3D=3D 4. */
+
#define CALL_FN_W_v(lval, fnptr) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[1]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[1]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
__asm__ volatile( \
"movl (%%eax), %%eax\n\t" /* target->%eax */ \
VALGRIND_CALL_NOREDIR_EAX \
: /*out*/ "=3Da" (_res) \
: /*in*/ "a" (&_argvec[0]) \
- : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
); \
lval =3D (__typeof__(lval)) _res; \
} while (0)
=20
#define CALL_FN_v_v(fnptr) \
- do { long _junk; CALL_FN_W_v(_junk,fnptr); } while (0)
+ do { unsigned long _junk; CALL_FN_W_v(_junk,fnptr); } while (0)
=20
#define CALL_FN_W_W(lval, fnptr, arg1) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[2]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
- _argvec[1] =3D (long)(arg1); \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[2]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
__asm__ volatile( \
"pushl 4(%%eax)\n\t" \
"movl (%%eax), %%eax\n\t" /* target->%eax */ \
@@ -375,12 +378,12 @@
=20
#define CALL_FN_W_WW(lval, fnptr, arg1,arg2) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[3]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
- _argvec[1] =3D (long)(arg1); \
- _argvec[2] =3D (long)(arg2); \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[3]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
__asm__ volatile( \
"pushl 8(%%eax)\n\t" \
"pushl 4(%%eax)\n\t" \
@@ -396,14 +399,14 @@
=20
#define CALL_FN_W_WWWW(lval, fnptr, arg1,arg2,arg3,arg4) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[5]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
- _argvec[1] =3D (long)(arg1); \
- _argvec[2] =3D (long)(arg2); \
- _argvec[3] =3D (long)(arg3); \
- _argvec[4] =3D (long)(arg4); \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[5]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
__asm__ volatile( \
"pushl 16(%%eax)\n\t" \
"pushl 12(%%eax)\n\t" \
@@ -419,17 +422,17 @@
lval =3D (__typeof__(lval)) _res; \
} while (0)
=20
-#define CALL_FN_W_WWWWW(lval, fnptr, arg1,arg2,arg3,arg4,arg5) \
+#define CALL_FN_W_5W(lval, fnptr, arg1,arg2,arg3,arg4,arg5) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[6]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
- _argvec[1] =3D (long)(arg1); \
- _argvec[2] =3D (long)(arg2); \
- _argvec[3] =3D (long)(arg3); \
- _argvec[4] =3D (long)(arg4); \
- _argvec[5] =3D (long)(arg5); \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[6]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
__asm__ volatile( \
"pushl 20(%%eax)\n\t" \
"pushl 16(%%eax)\n\t" \
@@ -446,20 +449,50 @@
lval =3D (__typeof__(lval)) _res; \
} while (0)
=20
-#define CALL_FN_W_WWWWWWW(lval, fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg=
7) \
+#define CALL_FN_W_6W(lval, fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
do { \
- void* _fnptr =3D (fnptr); \
- long _argvec[8]; \
- long _res; \
- _argvec[0] =3D (long)_fnptr; \
- _argvec[1] =3D (long)(arg1); \
- _argvec[2] =3D (long)(arg2); \
- _argvec[3] =3D (long)(arg3); \
- _argvec[4] =3D (long)(arg4); \
- _argvec[5] =3D (long)(arg5); \
- _argvec[6] =3D (long)(arg6); \
- _argvec[7] =3D (long)(arg7); \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[7]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
__asm__ volatile( \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ "addl $24, %%esp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, fnptr, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[8]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ __asm__ volatile( \
"pushl 28(%%eax)\n\t" \
"pushl 24(%%eax)\n\t" \
"pushl 20(%%eax)\n\t" \
@@ -477,6 +510,83 @@
lval =3D (__typeof__(lval)) _res; \
} while (0)
=20
+#define CALL_FN_W_8W(lval, fnptr, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[9]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ __asm__ volatile( \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ "addl $32, %%esp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, fnptr, arg1,arg2,arg3,arg4,arg5, \
+ arg6,arg7,arg8,arg9,arg10, \
+ arg11,arg12) \
+ do { \
+ void* _fnptr =3D (fnptr); \
+ unsigned long _argvec[13]; \
+ unsigned long _res; \
+ _argvec[0] =3D (unsigned long)_fnptr; \
+ _argvec[1] =3D (unsigned long)(arg1); \
+ _argvec[2] =3D (unsigned long)(arg2); \
+ _argvec[3] =3D (unsigned long)(arg3); \
+ _argvec[4] =3D (unsigned long)(arg4); \
+ _argvec[5] =3D (unsigned long)(arg5); \
+ _argvec[6] =3D (unsigned long)(arg6); \
+ _argvec[7] =3D (unsigned long)(arg7); \
+ _argvec[8] =3D (unsigned long)(arg8); \
+ _argvec[9] =3D (unsigned long)(arg9); \
+ _argvec[10] =3D (unsigned long)(arg10); \
+ _argvec[11] =3D (unsigned long)(arg11); \
+ _argvec[12] =3D (unsigned long)(arg12); \
+ __asm__ volatile( \
+ "pushl 48(%%eax)\n\t" \
+ "pushl 44(%%eax)\n\t" \
+ "pushl 40(%%eax)\n\t" \
+ "pushl 36(%%eax)\n\t" \
+ "pushl 32(%%eax)\n\t" \
+ "pushl 28(%%eax)\n\t" \
+ "pushl 24(%%eax)\n\t" \
+ "pushl 20(%%eax)\n\t" \
+ "pushl 16(%%eax)\n\t" \
+ "pushl 12(%%eax)\n\t" \
+ "pushl 8(%%eax)\n\t" \
+ "pushl 4(%%eax)\n\t" \
+ "movl (%%eax), %%eax\n\t" /* target->%eax */ \
+ VALGRIND_CALL_NOREDIR_EAX \
+ "addl $48, %%esp\n" \
+ : /*out*/ "=3Da" (_res) \
+ : /*in*/ "a" (&_argvec[0]) \
+ : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \
+ ); \
+ lval =3D (__typeof__(lval)) _res; \
+ } while (0)
+
#endif /* ARCH_x86 */
=20
/* --------------------------- amd64 --------------------------- */
|