Home | History | Annotate | Download | only in tests
      1 
      2 #include <stdio.h>
      3 #include "valgrind.h"
      4 
      5 /* Check that it's safe to call a wrapped function from some other
      6    function's wrapper.  Note that because the wrapper for fact1
      7    actually interferes with the computation of the result, this
      8    program produces a different answer when run on V (162) from
      9    natively (120).
     10 */
     11 
     12 static int fact1 ( int n );
     13 static int fact2 ( int n );
     14 
     15 /* This is needed to stop gcc4 turning 'fact' into a loop */
     16 __attribute__((noinline))
     17 int mul ( int x, int y ) { return x * y; }
     18 
     19 int fact1 ( int n )
     20 {
     21    if (n == 0) return 1; else return mul(n, fact2(n-1));
     22 }
     23 int fact2 ( int n )
     24 {
     25    if (n == 0) return 1; else return mul(n, fact1(n-1));
     26 }
     27 
     28 
     29 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact1) ( int n )
     30 {
     31    int    r;
     32    OrigFn fn;
     33    VALGRIND_GET_ORIG_FN(fn);
     34    printf("in wrapper1-pre:  fact(%d)\n", n);
     35    CALL_FN_W_W(r, fn, n);
     36    printf("in wrapper1-post: fact(%d) = %d\n", n, r);
     37    if (n >= 3) r += fact2(2);
     38    return r;
     39 }
     40 
     41 int I_WRAP_SONAME_FNNAME_ZU(NONE,fact2) ( int n )
     42 {
     43    int    r;
     44    OrigFn fn;
     45    VALGRIND_GET_ORIG_FN(fn);
     46    printf("in wrapper2-pre:  fact(%d)\n", n);
     47    CALL_FN_W_W(r, fn, n);
     48    printf("in wrapper2-post: fact(%d) = %d\n", n, r);
     49    return r;
     50 }
     51 
     52 /* --------------- */
     53 
     54 int main ( void )
     55 {
     56    int r;
     57    printf("computing fact1(5)\n");
     58    r = fact1(5);
     59    printf("fact1(5) = %d\n", r);
     60    return 0;
     61 }
     62