/* Helper header for test-audit-threads.

   Copyright (C) 2018-2020 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */

/* We use this helper to create a large number of functions, all of
   which will be resolved lazily and thus have their PLT updated.
   This is done to provide enough functions that we can statistically
   observe a thread vs. PLT resolution failure if one exists.  */

#define CONCAT(a, b) a ## b
#define NUM(x, y) CONCAT (x, y)

#define FUNC10(x)	\
  FUNC (NUM (x, 0));	\
  FUNC (NUM (x, 1));	\
  FUNC (NUM (x, 2));	\
  FUNC (NUM (x, 3));	\
  FUNC (NUM (x, 4));	\
  FUNC (NUM (x, 5));	\
  FUNC (NUM (x, 6));	\
  FUNC (NUM (x, 7));	\
  FUNC (NUM (x, 8));	\
  FUNC (NUM (x, 9))

#define FUNC100(x)	\
  FUNC10 (NUM (x, 0));	\
  FUNC10 (NUM (x, 1));	\
  FUNC10 (NUM (x, 2));	\
  FUNC10 (NUM (x, 3));	\
  FUNC10 (NUM (x, 4));	\
  FUNC10 (NUM (x, 5));	\
  FUNC10 (NUM (x, 6));	\
  FUNC10 (NUM (x, 7));	\
  FUNC10 (NUM (x, 8));	\
  FUNC10 (NUM (x, 9))

#define FUNC1000(x)		\
  FUNC100 (NUM (x, 0));		\
  FUNC100 (NUM (x, 1));		\
  FUNC100 (NUM (x, 2));		\
  FUNC100 (NUM (x, 3));		\
  FUNC100 (NUM (x, 4));		\
  FUNC100 (NUM (x, 5));		\
  FUNC100 (NUM (x, 6));		\
  FUNC100 (NUM (x, 7));		\
  FUNC100 (NUM (x, 8));		\
  FUNC100 (NUM (x, 9))

#define FUNC7000()	\
  FUNC1000 (1);		\
  FUNC1000 (2);		\
  FUNC1000 (3);		\
  FUNC1000 (4);		\
  FUNC1000 (5);		\
  FUNC1000 (6);		\
  FUNC1000 (7);

#ifdef FUNC
# undef FUNC
#endif

#ifdef externnum
# define FUNC(x) extern int CONCAT (retNum, x) (void)
#endif

#ifdef definenum
# define FUNC(x) int CONCAT (retNum, x) (void) { return x; }
#endif

#ifdef callnum
# define FUNC(x) CONCAT (retNum, x) (); sync_all (x)
#endif

/* A value of 7000 functions is chosen as an arbitrarily large
   number of functions that will allow us enough attempts to
   verify lazy resolution operation.  */
FUNC7000 ();