Home | History | Annotate | Download | only in wrap_indirect_calls
      1 // Indirectly call a bunch of functions.
      2 
      3 #include <assert.h>
      4 
      5 extern int cnt;
      6 
      7 typedef int (*F)(int, int);
      8 
      9 // A function in the same object.
     10 int f_local(int x, int y) {
     11   return x + y;
     12 }
     13 
     14 // A function in another object.
     15 int f_other_object(int x, int y);
     16 
     17 // A function in another DSO.
     18 int f_dso(int x, int y);
     19 
     20 // A function in another DSO that is replaced by the wrapper.
     21 int f_replaced(int x, int y);
     22 
     23 void run_test(void) {
     24   int x;
     25   int expected_cnt = 0;
     26   volatile F f;
     27 
     28   if (SLOW) ++expected_cnt;
     29   f = &f_local;
     30   x = f(1, 2);
     31   assert(x == 3);
     32   assert(cnt == expected_cnt);
     33 
     34   if (SLOW) ++expected_cnt;
     35   f = &f_other_object;
     36   x = f(2, 3);
     37   assert(x == 6);
     38   assert(cnt == expected_cnt);
     39 
     40   ++expected_cnt;
     41   f = &f_dso;
     42   x = f(2, 3);
     43   assert(x == 7);
     44   assert(cnt == expected_cnt);
     45 
     46   ++expected_cnt;
     47   f = &f_replaced;
     48   x = f(2, 3);
     49   assert(x == 11);
     50   assert(cnt == expected_cnt);
     51 }
     52