]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Make amd64 function wrapping work again following recent changes.
authorJulian Seward <jseward@acm.org>
Fri, 20 Jan 2006 15:17:20 +0000 (15:17 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 20 Jan 2006 15:17:20 +0000 (15:17 +0000)
Includes expected outputs for wrap8 for the non ppc64-linux case.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5570

include/valgrind.h
memcheck/tests/Makefile.am
memcheck/tests/wrap8.stderr.exp2 [new file with mode: 0644]
memcheck/tests/wrap8.stdout.exp2 [new file with mode: 0644]

index 2ec274d58854059e8bc7cbdefaf766ef233ebb03..6200669ae48775d92eff3bd5ac83c05d6f1bacd7 100644 (file)
 /* ---------------------------- x86 ---------------------------- */
 
 #if defined(ARCH_x86)
+
+typedef
+   struct { 
+      unsigned int nraddr; /* where's the code? */
+   }
+   OrigFn;
+
 #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
                      "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
                      "roll $29, %%edi ; roll $19, %%edi\n\t"
     _zzq_rlval = _zzq_result;                                     \
   }
 
-#define VALGRIND_GET_NRADDR(_zzq_rlval)                           \
-  { volatile unsigned int __addr;                                 \
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
+  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
+    volatile unsigned int __addr;                                 \
     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
                      /* %EAX = guest_NRADDR */                    \
                      "xchgl %%ecx,%%ecx"                          \
                      :                                            \
                      : "cc", "memory"                             \
                     );                                            \
-    _zzq_rlval = (void*)__addr;                                   \
+    _zzq_orig->nraddr = __addr;                                   \
   }
 
 #define VALGRIND_CALL_NOREDIR_EAX                                 \
 /* --------------------------- amd64 --------------------------- */
 
 #if defined(ARCH_amd64)
+
+typedef
+   struct { 
+      unsigned long long int nraddr; /* where's the code? */
+   }
+   OrigFn;
+
 #define __SPECIAL_INSTRUCTION_PREAMBLE                            \
                      "rolq $3,  %%rdi ; rolq $13, %%rdi\n\t"      \
                      "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
     _zzq_rlval = _zzq_result;                                     \
   }
 
-#define VALGRIND_GET_NRADDR(_zzq_rlval)                           \
-  { volatile unsigned long long int __addr;                       \
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
+  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
+    volatile unsigned long long int __addr;                       \
     __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
                      /* %RAX = guest_NRADDR */                    \
                      "xchgq %%rcx,%%rcx"                          \
                      :                                            \
                      : "cc", "memory"                             \
                     );                                            \
-    _zzq_rlval = (void*)__addr;                                   \
+    _zzq_orig->nraddr = __addr;                                   \
   }
 
 #define VALGRIND_CALL_NOREDIR_RAX                                 \
 
 typedef
    struct { 
-      unsigned long int nraddr; /* where's the code? */
+      unsigned int nraddr; /* where's the code? */
    }
    OrigFn;
 
@@ -703,12 +719,12 @@ typedef
 /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned
    long) == 8. */
 
-#define CALL_FN_W_v(lval, fnptr)                                  \
+#define CALL_FN_W_v(lval, orig)                                   \
    do {                                                           \
-      volatile void*         _fnptr = (fnptr);                    \
+      volatile OrigFn        _orig = (orig);                      \
       volatile unsigned long _argvec[1];                          \
       volatile unsigned long _res;                                \
-      _argvec[0] = (unsigned long)_fnptr;                         \
+      _argvec[0] = (unsigned long)_orig.nraddr;                   \
       __asm__ volatile(                                           \
          "movq (%%rax), %%rax\n\t"  /* target->%rax */            \
          VALGRIND_CALL_NOREDIR_RAX                                \
@@ -719,12 +735,12 @@ typedef
       lval = (__typeof__(lval)) _res;                             \
    } while (0)
 
-#define CALL_FN_W_W(lval, fnptr, arg1)                            \
+#define CALL_FN_W_W(lval, orig, arg1)                             \
    do {                                                           \
-      volatile void*         _fnptr = (fnptr);                    \
+      volatile OrigFn        _orig = (orig);                      \
       volatile unsigned long _argvec[2];                          \
       volatile unsigned long _res;                                \
-      _argvec[0] = (unsigned long)_fnptr;                         \
+      _argvec[0] = (unsigned long)_orig.nraddr;                   \
       _argvec[1] = (unsigned long)(arg1);                         \
       __asm__ volatile(                                           \
          "movq 8(%%rax), %%rdi\n\t"                               \
@@ -737,12 +753,12 @@ typedef
       lval = (__typeof__(lval)) _res;                             \
    } while (0)
 
-#define CALL_FN_W_WW(lval, fnptr, arg1,arg2)                      \
+#define CALL_FN_W_WW(lval, orig, arg1,arg2)                       \
    do {                                                           \
-      volatile void*         _fnptr = (fnptr);                    \
+      volatile OrigFn        _orig = (orig);                      \
       volatile unsigned long _argvec[3];                          \
       volatile unsigned long _res;                                \
-      _argvec[0] = (unsigned long)_fnptr;                         \
+      _argvec[0] = (unsigned long)_orig.nraddr;                   \
       _argvec[1] = (unsigned long)(arg1);                         \
       _argvec[2] = (unsigned long)(arg2);                         \
       __asm__ volatile(                                           \
index ee9f7de92e0e0af768f194feaf8e992900bb45f1..77e998a53abf7fca97adda4c42ae255bd4ef4803 100644 (file)
@@ -116,6 +116,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
        wrap6.vgtest wrap6.stdout.exp wrap6.stderr.exp \
        wrap7.vgtest wrap7.stdout.exp wrap7.stderr.exp \
        wrap8.vgtest wrap8.stdout.exp wrap8.stderr.exp \
+       wrap8.stdout.exp2 wrap8.stderr.exp2 \
        writev.stderr.exp writev.stderr.exp2 writev.stderr.exp3 writev.vgtest \
        xml1.stderr.exp xml1.stderr.exp2 xml1.stderr.exp3 \
        xml1.stderr.exp64 xml1.stderr.exp64_2 xml1.stdout.exp \
diff --git a/memcheck/tests/wrap8.stderr.exp2 b/memcheck/tests/wrap8.stderr.exp2
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/wrap8.stdout.exp2 b/memcheck/tests/wrap8.stdout.exp2
new file mode 100644 (file)
index 0000000..e0afd09
--- /dev/null
@@ -0,0 +1,77 @@
+computing fact1(15)
+in wrapper1-pre:  fact(15)
+in wrapper2-pre:  fact(14)
+in wrapper1-pre:  fact(13)
+in wrapper2-pre:  fact(12)
+in wrapper1-pre:  fact(11)
+in wrapper2-pre:  fact(10)
+in wrapper1-pre:  fact(9)
+in wrapper2-pre:  fact(8)
+in wrapper1-pre:  fact(7)
+in wrapper2-pre:  fact(6)
+in wrapper1-pre:  fact(5)
+in wrapper2-pre:  fact(4)
+in wrapper1-pre:  fact(3)
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper1-post: fact(3) = 6
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(4) = 32
+in wrapper1-post: fact(5) = 160
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(6) = 972
+in wrapper1-post: fact(7) = 6804
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(8) = 54448
+in wrapper1-post: fact(9) = 490032
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(10) = 4900340
+in wrapper1-post: fact(11) = 53903740
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(12) = 646844904
+in wrapper1-post: fact(13) = -180950840
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+in wrapper2-post: fact(14) = 1761655564
+in wrapper1-post: fact(15) = 655029684
+in wrapper2-pre:  fact(2)
+in wrapper1-pre:  fact(1)
+in wrapper2-pre:  fact(0)
+in wrapper2-post: fact(0) = 1
+in wrapper1-post: fact(1) = 1
+in wrapper2-post: fact(2) = 2
+fact1(15) = 655029686
+allocated 111 Lards