/* Copyright (C) 2005-2021 Free Software Foundation, Inc.
   Contributed by Jakub Jelinek <jakub@redhat.com>.

   This file is part of the GNU Offloading and Multi Processing Library
   (libgomp).

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

   Libgomp 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 General Public License for
   more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* This file contains prototypes of functions in the external ABI.
   This file is included by files in the testsuite.  */

#ifndef LIBGOMP_F_H
#define LIBGOMP_F_H 1

#include "libgomp.h"

#if (@OMP_LOCK_SIZE@ == @OMP_LOCK_KIND@) \
    && (@OMP_LOCK_ALIGN@ <= @OMP_LOCK_SIZE@)
# define OMP_LOCK_DIRECT
typedef omp_lock_t *omp_lock_arg_t;
# define omp_lock_arg(arg) (arg)
#else
typedef union { omp_lock_t *lock; uint64_t u; } *omp_lock_arg_t;
# define omp_lock_arg(arg) ((arg)->lock)
# endif

#if (@OMP_NEST_LOCK_SIZE@ == @OMP_NEST_LOCK_KIND@) \
    && (@OMP_NEST_LOCK_ALIGN@ <= @OMP_NEST_LOCK_SIZE@)
# define OMP_NEST_LOCK_DIRECT
typedef omp_nest_lock_t *omp_nest_lock_arg_t;
# define omp_nest_lock_arg(arg) (arg)
#else
typedef union { omp_nest_lock_t *lock; uint64_t u; } *omp_nest_lock_arg_t;
# define omp_nest_lock_arg(arg) ((arg)->lock)
# endif

#if (@OMP_LOCK_25_SIZE@ == @OMP_LOCK_25_KIND@) \
    && (@OMP_LOCK_25_ALIGN@ <= @OMP_LOCK_25_SIZE@)
# define OMP_LOCK_25_DIRECT
typedef omp_lock_25_t *omp_lock_25_arg_t;
# define omp_lock_25_arg(arg) (arg)
#else
typedef union { omp_lock_25_t *lock; uint64_t u; } *omp_lock_25_arg_t;
# define omp_lock_25_arg(arg) ((arg)->lock)
# endif

#if (@OMP_NEST_LOCK_25_SIZE@ == @OMP_NEST_LOCK_25_KIND@) \
    && (@OMP_NEST_LOCK_25_ALIGN@ <= @OMP_NEST_LOCK_25_SIZE@)
# define OMP_NEST_LOCK_25_DIRECT
typedef omp_nest_lock_25_t *omp_nest_lock_25_arg_t;
# define omp_nest_lock_25_arg(arg) (arg)
#else
typedef union { omp_nest_lock_25_t *lock; uint64_t u; } *omp_nest_lock_25_arg_t;
# define omp_nest_lock_25_arg(arg) ((arg)->lock)
# endif

static inline void
omp_check_defines (void)
{
  char test[(@OMP_LOCK_SIZE@ != sizeof (omp_lock_t)
	     || @OMP_LOCK_ALIGN@ != __alignof (omp_lock_t)
	     || @OMP_NEST_LOCK_SIZE@ != sizeof (omp_nest_lock_t)
	     || @OMP_NEST_LOCK_ALIGN@ != __alignof (omp_nest_lock_t)
	     || @OMP_LOCK_KIND@ != sizeof (*(omp_lock_arg_t) 0)
	     || @OMP_NEST_LOCK_KIND@ != sizeof (*(omp_nest_lock_arg_t) 0)
	     || @INTPTR_T_KIND@ != sizeof (omp_allocator_handle_t)
	     || 4 != sizeof (omp_alloctrait_key_t)
	     || @INTPTR_T_KIND@ != sizeof (omp_alloctrait_value_t)
	     || @INTPTR_T_KIND@ != sizeof (omp_memspace_handle_t)
	     || @OMP_DEPEND_KIND@ != sizeof (omp_depend_t))
	    ? -1 : 1] __attribute__ ((__unused__));
  char test2[(@OMP_LOCK_25_SIZE@ != sizeof (omp_lock_25_t)
	     || @OMP_LOCK_25_ALIGN@ != __alignof (omp_lock_25_t)
	     || @OMP_NEST_LOCK_25_SIZE@ != sizeof (omp_nest_lock_25_t)
	     || @OMP_NEST_LOCK_25_ALIGN@ != __alignof (omp_nest_lock_25_t)
	     || @OMP_LOCK_25_KIND@ != sizeof (*(omp_lock_25_arg_t) 0)
	     || @OMP_NEST_LOCK_25_KIND@
		!= sizeof (*(omp_nest_lock_25_arg_t) 0))
	    ? -1 : 1] __attribute__ ((__unused__));
}

#endif /* LIBGOMP_F_H */
