| /* jit-builtins.h -- Handling of builtin functions during JIT-compilation. |
| Copyright (C) 2014-2021 Free Software Foundation, Inc. |
| |
| This file is part of GCC. |
| |
| GCC 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. |
| |
| GCC 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; see the file COPYING3. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef JIT_BUILTINS_H |
| #define JIT_BUILTINS_H |
| |
| #include "jit-common.h" |
| |
| namespace gcc { |
| |
| namespace jit { |
| |
| /* Create an enum of the builtin types. */ |
| |
| enum jit_builtin_type |
| { |
| #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, |
| #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, |
| #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, |
| #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, |
| #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, |
| #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, |
| #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, |
| #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6) NAME, |
| #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7) NAME, |
| #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7, ARG8) NAME, |
| #define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7, ARG8, ARG9) NAME, |
| #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7, ARG8, ARG9, ARG10) NAME, |
| #define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ |
| NAME, |
| #define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6) NAME, |
| #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ |
| ARG6, ARG7) NAME, |
| #define DEF_POINTER_TYPE(NAME, TYPE) NAME, |
| #include "builtin-types.def" |
| #undef DEF_PRIMITIVE_TYPE |
| #undef DEF_FUNCTION_TYPE_0 |
| #undef DEF_FUNCTION_TYPE_1 |
| #undef DEF_FUNCTION_TYPE_2 |
| #undef DEF_FUNCTION_TYPE_3 |
| #undef DEF_FUNCTION_TYPE_4 |
| #undef DEF_FUNCTION_TYPE_5 |
| #undef DEF_FUNCTION_TYPE_6 |
| #undef DEF_FUNCTION_TYPE_7 |
| #undef DEF_FUNCTION_TYPE_8 |
| #undef DEF_FUNCTION_TYPE_9 |
| #undef DEF_FUNCTION_TYPE_10 |
| #undef DEF_FUNCTION_TYPE_11 |
| #undef DEF_FUNCTION_TYPE_VAR_0 |
| #undef DEF_FUNCTION_TYPE_VAR_1 |
| #undef DEF_FUNCTION_TYPE_VAR_2 |
| #undef DEF_FUNCTION_TYPE_VAR_3 |
| #undef DEF_FUNCTION_TYPE_VAR_4 |
| #undef DEF_FUNCTION_TYPE_VAR_5 |
| #undef DEF_FUNCTION_TYPE_VAR_6 |
| #undef DEF_FUNCTION_TYPE_VAR_7 |
| #undef DEF_POINTER_TYPE |
| BT_LAST |
| }; /* enum jit_builtin_type */ |
| |
| /* Create an enum of the attributes that can be present on builtins. */ |
| |
| enum built_in_attribute |
| { |
| #define DEF_ATTR_NULL_TREE(ENUM) ENUM, |
| #define DEF_ATTR_INT(ENUM, VALUE) ENUM, |
| #define DEF_ATTR_STRING(ENUM, VALUE) ENUM, |
| #define DEF_ATTR_IDENT(ENUM, STRING) ENUM, |
| #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM, |
| #include "builtin-attrs.def" |
| #undef DEF_ATTR_NULL_TREE |
| #undef DEF_ATTR_INT |
| #undef DEF_ATTR_STRING |
| #undef DEF_ATTR_IDENT |
| #undef DEF_ATTR_TREE_LIST |
| ATTR_LAST |
| }; |
| |
| /***********************************************************************/ |
| |
| class builtins_manager |
| { |
| public: |
| builtins_manager (recording::context *ctxt); |
| |
| recording::function * |
| get_builtin_function (const char *name); |
| |
| static enum built_in_class |
| get_class (enum built_in_function builtin_id); |
| |
| static bool |
| implicit_p (enum built_in_function builtin_id); |
| |
| tree |
| get_attrs_tree (enum built_in_function builtin_id); |
| |
| tree |
| get_attrs_tree (enum built_in_attribute attr); |
| |
| void |
| ensure_optimization_builtins_exist (); |
| |
| void |
| finish_playback (void); |
| |
| private: |
| recording::function * |
| get_builtin_function_by_id (enum built_in_function builtin_id); |
| |
| recording::function * |
| make_builtin_function (enum built_in_function builtin_id); |
| |
| recording::type * |
| get_type (enum jit_builtin_type type_id); |
| |
| recording::type * |
| make_type (enum jit_builtin_type type_id); |
| |
| recording::type* |
| make_primitive_type (enum jit_builtin_type type_id); |
| |
| recording::function_type* |
| make_fn_type (enum jit_builtin_type type_id, |
| enum jit_builtin_type return_type_id, |
| bool is_variadic, |
| int num_args, ...); |
| |
| recording::type* |
| make_ptr_type (enum jit_builtin_type type_id, |
| enum jit_builtin_type other_type_id); |
| |
| tree |
| make_attrs_tree (enum built_in_attribute attr); |
| |
| private: |
| /* Recording fields. */ |
| recording::context *m_ctxt; |
| recording::type *m_types[BT_LAST]; |
| recording::function *m_builtin_functions[END_BUILTINS]; |
| |
| /* Playback fields. */ |
| /* m_attributes is not GTY-marked, but is only ever used from within |
| the region of playback::context::replay () in which a GC can't |
| happen. */ |
| tree m_attributes[ATTR_LAST]; |
| }; |
| |
| } // namespace jit |
| } // namespace gcc |
| |
| #endif /* JIT_BUILTINS_H */ |