/* This testcase is part of GDB, the GNU debugger.

   Copyright 2010-2021 Free Software Foundation, Inc.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   Contributed by Ken Werner <ken.werner@de.ibm.com>  */

/* Utility macros and functions for OpenCL applications.  */

#ifndef CL_UTIL_H
#define CL_UTIL_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
#include <stdio.h>

/* Executes the given OpenCL function and checks its return value.
   In case of failure (rc != CL_SUCCESS) an error string will be
   printed to stderr and the program will be terminated.  This Macro
   is only intended for OpenCL routines which return cl_int.  */

#define CHK(func)\
{\
  int rc = (func);\
  CHK_ERR (#func, rc);\
}

/* Macro that checks an OpenCL error code.  In case of failure
   (err != CL_SUCCESS) an error string will be printed to stderr
   including the prefix and the program will be terminated.  This
   Macro is only intended to use in conjunction with OpenCL routines
   which take a pointer to a cl_int as an argument to place their
   error code.  */

#define CHK_ERR(prefix, err)\
if (err != CL_SUCCESS)\
  {\
    fprintf (stderr, "CHK_ERR (%s, %d)\n", prefix, err);\
    fprintf (stderr, "%s:%d error: %s\n", __FILE__, __LINE__,\
	     get_clerror_string (err));\
    exit (EXIT_FAILURE);\
  };

/* Return a pointer to a string that describes the error code specified
   by the errcode argument.  */

extern const char *get_clerror_string (int errcode);

/* Prints OpenCL information to stdout.  */

extern void print_clinfo ();

/* Reads a given file into the memory and returns a pointer to the data or NULL
   if the file does not exist.  FILENAME specifies the location of the file to
   be read.  SIZE is an output parameter that returns the size of the  file in
   bytes.  */

extern const char *read_file (const char * const filename, size_t *size);

/* Saves all program binaries of the given OpenCL PROGRAM.  The file
   names are extracted from the devices.  */

extern void save_program_binaries (cl_program program);

#ifdef __cplusplus
}
#endif

#endif /* CL_UTIL_H */
