1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h"
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The simplest possible wrapping test: just call a wrapped function
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and check we run the wrapper instead. */
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The "original" function */
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline))
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid actual ( void )
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("in actual\n");
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The wrapper.  Since this executable won't have a soname, we have to
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   use "NONE", since V treats any executable/.so which lacks a soname
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   as if its soname was "NONE". */
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid I_WRAP_SONAME_FNNAME_ZU(NONE,actual) ( void )
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OrigFn fn;
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VALGRIND_GET_ORIG_FN(fn);
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("wrapper-pre\n");
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CALL_FN_v_v(fn);
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("wrapper-post\n");
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* --------------- */
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("starting\n");
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   actual();
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
35