/* 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;