1 /* Helper header for test-audit-threads.
2 
3    Copyright (C) 2018-2022 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5 
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10 
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15 
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, see
18    <https://www.gnu.org/licenses/>.  */
19 
20 /* We use this helper to create a large number of functions, all of
21    which will be resolved lazily and thus have their PLT updated.
22    This is done to provide enough functions that we can statistically
23    observe a thread vs. PLT resolution failure if one exists.  */
24 
25 #define CONCAT(a, b) a ## b
26 #define NUM(x, y) CONCAT (x, y)
27 
28 #define FUNC10(x)	\
29   FUNC (NUM (x, 0));	\
30   FUNC (NUM (x, 1));	\
31   FUNC (NUM (x, 2));	\
32   FUNC (NUM (x, 3));	\
33   FUNC (NUM (x, 4));	\
34   FUNC (NUM (x, 5));	\
35   FUNC (NUM (x, 6));	\
36   FUNC (NUM (x, 7));	\
37   FUNC (NUM (x, 8));	\
38   FUNC (NUM (x, 9))
39 
40 #define FUNC100(x)	\
41   FUNC10 (NUM (x, 0));	\
42   FUNC10 (NUM (x, 1));	\
43   FUNC10 (NUM (x, 2));	\
44   FUNC10 (NUM (x, 3));	\
45   FUNC10 (NUM (x, 4));	\
46   FUNC10 (NUM (x, 5));	\
47   FUNC10 (NUM (x, 6));	\
48   FUNC10 (NUM (x, 7));	\
49   FUNC10 (NUM (x, 8));	\
50   FUNC10 (NUM (x, 9))
51 
52 #define FUNC1000(x)		\
53   FUNC100 (NUM (x, 0));		\
54   FUNC100 (NUM (x, 1));		\
55   FUNC100 (NUM (x, 2));		\
56   FUNC100 (NUM (x, 3));		\
57   FUNC100 (NUM (x, 4));		\
58   FUNC100 (NUM (x, 5));		\
59   FUNC100 (NUM (x, 6));		\
60   FUNC100 (NUM (x, 7));		\
61   FUNC100 (NUM (x, 8));		\
62   FUNC100 (NUM (x, 9))
63 
64 #define FUNC7000()	\
65   FUNC1000 (1);		\
66   FUNC1000 (2);		\
67   FUNC1000 (3);		\
68   FUNC1000 (4);		\
69   FUNC1000 (5);		\
70   FUNC1000 (6);		\
71   FUNC1000 (7);
72 
73 #ifdef FUNC
74 # undef FUNC
75 #endif
76 
77 #ifdef externnum
78 # define FUNC(x) extern int CONCAT (retNum, x) (void)
79 #endif
80 
81 #ifdef definenum
82 # define FUNC(x) int CONCAT (retNum, x) (void) { return x; }
83 #endif
84 
85 #ifdef callnum
86 # define FUNC(x) CONCAT (retNum, x) (); sync_all (x)
87 #endif
88 
89 /* A value of 7000 functions is chosen as an arbitrarily large
90    number of functions that will allow us enough attempts to
91    verify lazy resolution operation.  */
92 FUNC7000 ();
93