]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/msan/wrap_indirect_calls/caller.cc
Imported Upstream version 1.5.0+dfsg1
[rustc.git] / src / compiler-rt / test / msan / wrap_indirect_calls / caller.cc
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 }