1 1.1 mrg /* jit-builtins.h -- Handling of builtin functions during JIT-compilation. 2 1.7 mrg Copyright (C) 2014-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 7 1.1 mrg the terms of the GNU General Public License as published by the Free 8 1.1 mrg Software Foundation; either version 3, or (at your option) any later 9 1.1 mrg version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 1.1 mrg for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg #ifndef JIT_BUILTINS_H 21 1.1 mrg #define JIT_BUILTINS_H 22 1.1 mrg 23 1.1 mrg #include "jit-common.h" 24 1.1 mrg 25 1.1 mrg namespace gcc { 26 1.1 mrg 27 1.1 mrg namespace jit { 28 1.1 mrg 29 1.1 mrg /* Create an enum of the builtin types. */ 30 1.1 mrg 31 1.1 mrg enum jit_builtin_type 32 1.1 mrg { 33 1.1 mrg #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, 34 1.1 mrg #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, 35 1.1 mrg #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, 36 1.1 mrg #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, 37 1.1 mrg #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 38 1.1 mrg #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, 39 1.1 mrg #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, 40 1.1 mrg #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 41 1.1 mrg ARG6) NAME, 42 1.1 mrg #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 43 1.1 mrg ARG6, ARG7) NAME, 44 1.1 mrg #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 45 1.1 mrg ARG6, ARG7, ARG8) NAME, 46 1.3 mrg #define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 47 1.3 mrg ARG6, ARG7, ARG8, ARG9) NAME, 48 1.3 mrg #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 49 1.3 mrg ARG6, ARG7, ARG8, ARG9, ARG10) NAME, 50 1.3 mrg #define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 51 1.3 mrg ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, 52 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, 53 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, 54 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, 55 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 56 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, 57 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 58 1.1 mrg NAME, 59 1.3 mrg #define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 60 1.3 mrg ARG6) NAME, 61 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 62 1.1 mrg ARG6, ARG7) NAME, 63 1.1 mrg #define DEF_POINTER_TYPE(NAME, TYPE) NAME, 64 1.1 mrg #include "builtin-types.def" 65 1.1 mrg #undef DEF_PRIMITIVE_TYPE 66 1.1 mrg #undef DEF_FUNCTION_TYPE_0 67 1.1 mrg #undef DEF_FUNCTION_TYPE_1 68 1.1 mrg #undef DEF_FUNCTION_TYPE_2 69 1.1 mrg #undef DEF_FUNCTION_TYPE_3 70 1.1 mrg #undef DEF_FUNCTION_TYPE_4 71 1.1 mrg #undef DEF_FUNCTION_TYPE_5 72 1.1 mrg #undef DEF_FUNCTION_TYPE_6 73 1.1 mrg #undef DEF_FUNCTION_TYPE_7 74 1.1 mrg #undef DEF_FUNCTION_TYPE_8 75 1.3 mrg #undef DEF_FUNCTION_TYPE_9 76 1.3 mrg #undef DEF_FUNCTION_TYPE_10 77 1.3 mrg #undef DEF_FUNCTION_TYPE_11 78 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_0 79 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_1 80 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_2 81 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_3 82 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_4 83 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_5 84 1.3 mrg #undef DEF_FUNCTION_TYPE_VAR_6 85 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_7 86 1.1 mrg #undef DEF_POINTER_TYPE 87 1.1 mrg BT_LAST 88 1.1 mrg }; /* enum jit_builtin_type */ 89 1.1 mrg 90 1.1 mrg /* Create an enum of the attributes that can be present on builtins. */ 91 1.1 mrg 92 1.1 mrg enum built_in_attribute 93 1.1 mrg { 94 1.1 mrg #define DEF_ATTR_NULL_TREE(ENUM) ENUM, 95 1.1 mrg #define DEF_ATTR_INT(ENUM, VALUE) ENUM, 96 1.1 mrg #define DEF_ATTR_STRING(ENUM, VALUE) ENUM, 97 1.1 mrg #define DEF_ATTR_IDENT(ENUM, STRING) ENUM, 98 1.1 mrg #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM, 99 1.1 mrg #include "builtin-attrs.def" 100 1.1 mrg #undef DEF_ATTR_NULL_TREE 101 1.1 mrg #undef DEF_ATTR_INT 102 1.1 mrg #undef DEF_ATTR_STRING 103 1.1 mrg #undef DEF_ATTR_IDENT 104 1.1 mrg #undef DEF_ATTR_TREE_LIST 105 1.1 mrg ATTR_LAST 106 1.1 mrg }; 107 1.1 mrg 108 1.1 mrg /***********************************************************************/ 109 1.1 mrg 110 1.1 mrg class builtins_manager 111 1.1 mrg { 112 1.1 mrg public: 113 1.1 mrg builtins_manager (recording::context *ctxt); 114 1.1 mrg 115 1.1 mrg recording::function * 116 1.1 mrg get_builtin_function (const char *name); 117 1.1 mrg 118 1.1 mrg static enum built_in_class 119 1.1 mrg get_class (enum built_in_function builtin_id); 120 1.1 mrg 121 1.1 mrg static bool 122 1.1 mrg implicit_p (enum built_in_function builtin_id); 123 1.1 mrg 124 1.1 mrg tree 125 1.1 mrg get_attrs_tree (enum built_in_function builtin_id); 126 1.1 mrg 127 1.1 mrg tree 128 1.1 mrg get_attrs_tree (enum built_in_attribute attr); 129 1.1 mrg 130 1.1 mrg void 131 1.7 mrg ensure_optimization_builtins_exist (); 132 1.7 mrg 133 1.7 mrg void 134 1.1 mrg finish_playback (void); 135 1.1 mrg 136 1.1 mrg private: 137 1.1 mrg recording::function * 138 1.1 mrg get_builtin_function_by_id (enum built_in_function builtin_id); 139 1.1 mrg 140 1.1 mrg recording::function * 141 1.1 mrg make_builtin_function (enum built_in_function builtin_id); 142 1.1 mrg 143 1.1 mrg recording::type * 144 1.1 mrg get_type (enum jit_builtin_type type_id); 145 1.1 mrg 146 1.1 mrg recording::type * 147 1.1 mrg make_type (enum jit_builtin_type type_id); 148 1.1 mrg 149 1.1 mrg recording::type* 150 1.1 mrg make_primitive_type (enum jit_builtin_type type_id); 151 1.1 mrg 152 1.1 mrg recording::function_type* 153 1.1 mrg make_fn_type (enum jit_builtin_type type_id, 154 1.1 mrg enum jit_builtin_type return_type_id, 155 1.1 mrg bool is_variadic, 156 1.1 mrg int num_args, ...); 157 1.1 mrg 158 1.1 mrg recording::type* 159 1.1 mrg make_ptr_type (enum jit_builtin_type type_id, 160 1.1 mrg enum jit_builtin_type other_type_id); 161 1.1 mrg 162 1.1 mrg tree 163 1.1 mrg make_attrs_tree (enum built_in_attribute attr); 164 1.1 mrg 165 1.1 mrg private: 166 1.1 mrg /* Recording fields. */ 167 1.1 mrg recording::context *m_ctxt; 168 1.1 mrg recording::type *m_types[BT_LAST]; 169 1.1 mrg recording::function *m_builtin_functions[END_BUILTINS]; 170 1.1 mrg 171 1.1 mrg /* Playback fields. */ 172 1.1 mrg /* m_attributes is not GTY-marked, but is only ever used from within 173 1.1 mrg the region of playback::context::replay () in which a GC can't 174 1.1 mrg happen. */ 175 1.1 mrg tree m_attributes[ATTR_LAST]; 176 1.1 mrg }; 177 1.1 mrg 178 1.1 mrg } // namespace jit 179 1.1 mrg } // namespace gcc 180 1.1 mrg 181 1.1 mrg #endif /* JIT_BUILTINS_H */ 182