@@ -156,15 +156,6 @@ extern PyTypeObject _PyDefaultOptimizer_Type;
156156extern PyTypeObject _PyUOpExecutor_Type ;
157157extern PyTypeObject _PyUOpOptimizer_Type ;
158158
159- /* Symbols */
160- /* See explanation in optimizer_symbols.c */
161-
162- struct _Py_UopsSymbol {
163- int flags ; // 0 bits: Top; 2 or more bits: Bottom
164- PyTypeObject * typ ; // Borrowed reference
165- PyObject * const_val ; // Owned reference (!)
166- unsigned int type_version ; // currently stores type version
167- };
168159
169160#define UOP_FORMAT_TARGET 0
170161#define UOP_FORMAT_JUMP 1
@@ -201,27 +192,72 @@ static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst)
201192// handle before rejoining the rest of the program.
202193#define MAX_CHAIN_DEPTH 4
203194
204- typedef struct _Py_UopsSymbol _Py_UopsSymbol ;
195+ /* Symbols */
196+ /* See explanation in optimizer_symbols.c */
197+
198+
199+ typedef enum _JitSymType {
200+ JIT_SYM_UNKNOWN_TAG = 0 ,
201+
202+ JIT_SYM_NULL_TAG = 2 ,
203+ JIT_SYM_NON_NULL_TAG = 3 ,
204+ JIT_SYM_BOTTOM_TAG = 4 ,
205+ JIT_SYM_TYPE_VERSION_TAG = 5 ,
206+ JIT_SYM_KNOWN_CLASS_TAG = 6 ,
207+ JIT_SYM_KNOWN_VALUE_TAG = 7 ,
208+ JIT_SYM_TUPLE_TAG = 8 ,
209+ } JitSymType ;
210+
211+ typedef struct _jit_opt_known_class {
212+ uint8_t tag ;
213+ uint32_t version ;
214+ PyTypeObject * type ;
215+ } JitOptKnownClass ;
216+
217+ typedef struct _jit_opt_known_version {
218+ uint8_t tag ;
219+ uint32_t version ;
220+ } JitOptKnownVersion ;
221+
222+ typedef struct _jit_opt_known_value {
223+ uint8_t tag ;
224+ PyObject * value ;
225+ } JitOptKnownValue ;
226+
227+ typedef struct _jit_opt_tuple {
228+ uint8_t tag ;
229+ uint8_t length ;
230+ uint16_t items [6 ];
231+ } JitOptTuple ;
232+
233+ typedef union _jit_opt_symbol {
234+ uint8_t tag ;
235+ JitOptKnownClass cls ;
236+ JitOptKnownValue value ;
237+ JitOptKnownVersion version ;
238+ JitOptTuple tuple ;
239+ } JitOptSymbol ;
240+
205241
206242struct _Py_UOpsAbstractFrame {
207243 // Max stacklen
208244 int stack_len ;
209245 int locals_len ;
210246
211- _Py_UopsSymbol * * stack_pointer ;
212- _Py_UopsSymbol * * stack ;
213- _Py_UopsSymbol * * locals ;
247+ JitOptSymbol * * stack_pointer ;
248+ JitOptSymbol * * stack ;
249+ JitOptSymbol * * locals ;
214250};
215251
216252typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame ;
217253
218254typedef struct ty_arena {
219255 int ty_curr_number ;
220256 int ty_max_number ;
221- _Py_UopsSymbol arena [TY_ARENA_SIZE ];
257+ JitOptSymbol arena [TY_ARENA_SIZE ];
222258} ty_arena ;
223259
224- struct _Py_UOpsContext {
260+ typedef struct _JitOptContext {
225261 char done ;
226262 char out_of_space ;
227263 bool contradiction ;
@@ -233,46 +269,44 @@ struct _Py_UOpsContext {
233269 // Arena for the symbolic types.
234270 ty_arena t_arena ;
235271
236- _Py_UopsSymbol * * n_consumed ;
237- _Py_UopsSymbol * * limit ;
238- _Py_UopsSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
239- };
240-
241- typedef struct _Py_UOpsContext _Py_UOpsContext ;
242-
243- extern bool _Py_uop_sym_is_null (_Py_UopsSymbol * sym );
244- extern bool _Py_uop_sym_is_not_null (_Py_UopsSymbol * sym );
245- extern bool _Py_uop_sym_is_const (_Py_UopsSymbol * sym );
246- extern PyObject * _Py_uop_sym_get_const (_Py_UopsSymbol * sym );
247- extern _Py_UopsSymbol * _Py_uop_sym_new_unknown (_Py_UOpsContext * ctx );
248- extern _Py_UopsSymbol * _Py_uop_sym_new_not_null (_Py_UOpsContext * ctx );
249- extern _Py_UopsSymbol * _Py_uop_sym_new_type (
250- _Py_UOpsContext * ctx , PyTypeObject * typ );
251- extern _Py_UopsSymbol * _Py_uop_sym_new_const (_Py_UOpsContext * ctx , PyObject * const_val );
252- extern _Py_UopsSymbol * _Py_uop_sym_new_null (_Py_UOpsContext * ctx );
253- extern bool _Py_uop_sym_has_type (_Py_UopsSymbol * sym );
254- extern bool _Py_uop_sym_matches_type (_Py_UopsSymbol * sym , PyTypeObject * typ );
255- extern bool _Py_uop_sym_matches_type_version (_Py_UopsSymbol * sym , unsigned int version );
256- extern void _Py_uop_sym_set_null (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym );
257- extern void _Py_uop_sym_set_non_null (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym );
258- extern void _Py_uop_sym_set_type (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , PyTypeObject * typ );
259- extern bool _Py_uop_sym_set_type_version (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , unsigned int version );
260- extern void _Py_uop_sym_set_const (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , PyObject * const_val );
261- extern bool _Py_uop_sym_is_bottom (_Py_UopsSymbol * sym );
262- extern int _Py_uop_sym_truthiness (_Py_UopsSymbol * sym );
263- extern PyTypeObject * _Py_uop_sym_get_type (_Py_UopsSymbol * sym );
264-
265-
266- extern void _Py_uop_abstractcontext_init (_Py_UOpsContext * ctx );
267- extern void _Py_uop_abstractcontext_fini (_Py_UOpsContext * ctx );
272+ JitOptSymbol * * n_consumed ;
273+ JitOptSymbol * * limit ;
274+ JitOptSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
275+ } JitOptContext ;
276+
277+ extern bool _Py_uop_sym_is_null (JitOptSymbol * sym );
278+ extern bool _Py_uop_sym_is_not_null (JitOptSymbol * sym );
279+ extern bool _Py_uop_sym_is_const (JitOptSymbol * sym );
280+ extern PyObject * _Py_uop_sym_get_const (JitOptSymbol * sym );
281+ extern JitOptSymbol * _Py_uop_sym_new_unknown (JitOptContext * ctx );
282+ extern JitOptSymbol * _Py_uop_sym_new_not_null (JitOptContext * ctx );
283+ extern JitOptSymbol * _Py_uop_sym_new_type (
284+ JitOptContext * ctx , PyTypeObject * typ );
285+ extern JitOptSymbol * _Py_uop_sym_new_const (JitOptContext * ctx , PyObject * const_val );
286+ extern JitOptSymbol * _Py_uop_sym_new_null (JitOptContext * ctx );
287+ extern bool _Py_uop_sym_has_type (JitOptSymbol * sym );
288+ extern bool _Py_uop_sym_matches_type (JitOptSymbol * sym , PyTypeObject * typ );
289+ extern bool _Py_uop_sym_matches_type_version (JitOptSymbol * sym , unsigned int version );
290+ extern void _Py_uop_sym_set_null (JitOptContext * ctx , JitOptSymbol * sym );
291+ extern void _Py_uop_sym_set_non_null (JitOptContext * ctx , JitOptSymbol * sym );
292+ extern void _Py_uop_sym_set_type (JitOptContext * ctx , JitOptSymbol * sym , PyTypeObject * typ );
293+ extern bool _Py_uop_sym_set_type_version (JitOptContext * ctx , JitOptSymbol * sym , unsigned int version );
294+ extern void _Py_uop_sym_set_const (JitOptContext * ctx , JitOptSymbol * sym , PyObject * const_val );
295+ extern bool _Py_uop_sym_is_bottom (JitOptSymbol * sym );
296+ extern int _Py_uop_sym_truthiness (JitOptSymbol * sym );
297+ extern PyTypeObject * _Py_uop_sym_get_type (JitOptSymbol * sym );
298+
299+
300+ extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
301+ extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
268302
269303extern _Py_UOpsAbstractFrame * _Py_uop_frame_new (
270- _Py_UOpsContext * ctx ,
304+ JitOptContext * ctx ,
271305 PyCodeObject * co ,
272306 int curr_stackentries ,
273- _Py_UopsSymbol * * args ,
307+ JitOptSymbol * * args ,
274308 int arg_len );
275- extern int _Py_uop_frame_pop (_Py_UOpsContext * ctx );
309+ extern int _Py_uop_frame_pop (JitOptContext * ctx );
276310
277311PyAPI_FUNC (PyObject * ) _Py_uop_symbols_test (PyObject * self , PyObject * ignored );
278312
0 commit comments