/* GCC-StarPU
   Copyright (C) 2012 Inria
   GCC-StarPU 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.
   GCC-StarPU 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 GCC-StarPU.  If not, see .  */
/* Various utilities.  */
#pragma once
#include 
#include 
/* GCC 4.7 requires compilation with `g++', and C++ lacks a number of GNU C
   features, so work around that.  */
#ifdef __cplusplus
/* G++ doesn't implement nested functions, so use C++11 lambdas instead.  */
# include 
# define local_define(ret, name, parms)     auto name = [=]parms
# define function_parm(ret, name, parms)    std::function name
/* G++ lacks designated initializers.  */
# define designated_field_init(name, value) value /* XXX: cross fingers */
#else  /* !__cplusplus */
/* GNU C nested functions.  */
# define local_define(ret, name, parms)	    ret name parms
# define function_parm(ret, name, parms)    ret (*name) parms
/* Designated field initializer.  */
# define designated_field_init(name, value) .name = value
#endif /* !__cplusplus */
/* List and vector utilities, à la SRFI-1.  */
extern tree chain_trees (tree t, ...)
  __attribute__ ((sentinel));
extern tree filter (function_parm (bool, pred, (const_tree)), tree t);
extern tree list_remove (function_parm (bool, pred, (const_tree)), tree t);
extern tree map (function_parm (tree, func, (const_tree)), tree t);
extern void for_each (function_parm (void, func, (tree)), tree t);
extern size_t count (function_parm (bool, pred, (const_tree)), const_tree t);
/* Compatibility tricks & workarounds.  */
#include 
#include 
/* This declaration is from `c-tree.h', but that header doesn't get
   installed.  */
extern tree xref_tag (enum tree_code, tree);
#if !HAVE_DECL_BUILTIN_DECL_EXPLICIT
/* This function was introduced in GCC 4.7 as a replacement for the
   `built_in_decls' array.  */
static inline tree
builtin_decl_explicit (enum built_in_function fncode)
{
  return built_in_decls[fncode];
}
#endif
#if !HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY
extern tree build_call_expr_loc_array (location_t loc, tree fndecl, int n,
				       tree *argarray);
#endif
#if !HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC
extern tree build_call_expr_loc_vec (location_t loc, tree fndecl,
				     VEC(tree,gc) *vec);
#endif
#if !HAVE_DECL_BUILD_ZERO_CST
extern tree build_zero_cst (tree type);
#endif
#ifndef VEC_qsort
/* This macro is missing in GCC 4.5.  */
# define VEC_qsort(T,V,CMP) qsort(VEC_address (T,V), VEC_length(T,V),	\
				  sizeof (T), CMP)
#endif
/* Helpers.  */
extern bool verbose_output_p;
extern tree build_pointer_lookup (tree pointer);
extern tree build_starpu_error_string (tree error_var);
extern tree build_constructor_from_unsorted_list (tree type, tree vals);
extern tree read_pragma_expressions (const char *pragma, location_t loc);
extern tree type_decl_for_struct_tag (const char *tag);
extern tree build_function_arguments (tree fn);
extern tree build_error_statements (location_t, tree,
				    function_parm (tree, f, (tree)),
				    const char *, ...)
  __attribute__ ((format (printf, 4, 5)));
extern bool void_type_p (const_tree lst);
extern bool pointer_type_p (const_tree lst);
/* Lookup the StarPU function NAME in the global scope and store the result
   in VAR (this can't be done from `lower_starpu'.)  */
#define LOOKUP_STARPU_FUNCTION(var, name)				\
  if ((var) == NULL_TREE)						\
    {									\
      (var) = lookup_name (get_identifier (name));			\
      gcc_assert ((var) != NULL_TREE && TREE_CODE (var) == FUNCTION_DECL); \
    }
/* Don't warn about the unused `gcc_version' variable, from
   .  */
static const struct plugin_gcc_version *starpu_gcc_version
  __attribute__ ((__unused__)) = &gcc_version;