@@ -148,15 +148,6 @@ extern PyTypeObject _PyDefaultOptimizer_Type;
148148extern PyTypeObject _PyUOpExecutor_Type ;
149149extern PyTypeObject _PyUOpOptimizer_Type ;
150150
151- /* Symbols */
152- /* See explanation in optimizer_symbols.c */
153-
154- struct _Py_UopsSymbol {
155- int flags ; // 0 bits: Top; 2 or more bits: Bottom
156- PyTypeObject * typ ; // Borrowed reference
157- PyObject * const_val ; // Owned reference (!)
158- unsigned int type_version ; // currently stores type version
159- };
160151
161152#define UOP_FORMAT_TARGET 0
162153#define UOP_FORMAT_JUMP 1
@@ -193,27 +184,74 @@ static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst)
193184// handle before rejoining the rest of the program.
194185#define MAX_CHAIN_DEPTH 4
195186
196- typedef struct _Py_UopsSymbol _Py_UopsSymbol ;
187+ /* Symbols */
188+ /* See explanation in optimizer_symbols.c */
189+
190+
191+ typedef enum _JitSymType {
192+ JIT_SYM_UNKNOWN_TAG = 1 ,
193+ JIT_SYM_NULL_TAG = 2 ,
194+ JIT_SYM_NON_NULL_TAG = 3 ,
195+ JIT_SYM_BOTTOM_TAG = 4 ,
196+ JIT_SYM_TYPE_VERSION_TAG = 5 ,
197+ JIT_SYM_KNOWN_CLASS_TAG = 6 ,
198+ JIT_SYM_KNOWN_VALUE_TAG = 7 ,
199+ JIT_SYM_TUPLE_TAG = 8 ,
200+ } JitSymType ;
201+
202+ typedef struct _jit_opt_known_class {
203+ uint8_t tag ;
204+ uint32_t version ;
205+ PyTypeObject * type ;
206+ } JitOptKnownClass ;
207+
208+ typedef struct _jit_opt_known_version {
209+ uint8_t tag ;
210+ uint32_t version ;
211+ } JitOptKnownVersion ;
212+
213+ typedef struct _jit_opt_known_value {
214+ uint8_t tag ;
215+ PyObject * value ;
216+ } JitOptKnownValue ;
217+
218+ #define MAX_SYMBOLIC_TUPLE_SIZE 7
219+
220+ typedef struct _jit_opt_tuple {
221+ uint8_t tag ;
222+ uint8_t length ;
223+ uint16_t items [MAX_SYMBOLIC_TUPLE_SIZE ];
224+ } JitOptTuple ;
225+
226+ typedef union _jit_opt_symbol {
227+ uint8_t tag ;
228+ JitOptKnownClass cls ;
229+ JitOptKnownValue value ;
230+ JitOptKnownVersion version ;
231+ JitOptTuple tuple ;
232+ } JitOptSymbol ;
233+
234+
197235
198236struct _Py_UOpsAbstractFrame {
199237 // Max stacklen
200238 int stack_len ;
201239 int locals_len ;
202240
203- _Py_UopsSymbol * * stack_pointer ;
204- _Py_UopsSymbol * * stack ;
205- _Py_UopsSymbol * * locals ;
241+ JitOptSymbol * * stack_pointer ;
242+ JitOptSymbol * * stack ;
243+ JitOptSymbol * * locals ;
206244};
207245
208246typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame ;
209247
210248typedef struct ty_arena {
211249 int ty_curr_number ;
212250 int ty_max_number ;
213- _Py_UopsSymbol arena [TY_ARENA_SIZE ];
251+ JitOptSymbol arena [TY_ARENA_SIZE ];
214252} ty_arena ;
215253
216- struct _Py_UOpsContext {
254+ typedef struct _JitOptContext {
217255 char done ;
218256 char out_of_space ;
219257 bool contradiction ;
@@ -225,46 +263,47 @@ struct _Py_UOpsContext {
225263 // Arena for the symbolic types.
226264 ty_arena t_arena ;
227265
228- _Py_UopsSymbol * * n_consumed ;
229- _Py_UopsSymbol * * limit ;
230- _Py_UopsSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
231- };
232-
233- typedef struct _Py_UOpsContext _Py_UOpsContext ;
234-
235- extern bool _Py_uop_sym_is_null (_Py_UopsSymbol * sym );
236- extern bool _Py_uop_sym_is_not_null (_Py_UopsSymbol * sym );
237- extern bool _Py_uop_sym_is_const (_Py_UopsSymbol * sym );
238- extern PyObject * _Py_uop_sym_get_const (_Py_UopsSymbol * sym );
239- extern _Py_UopsSymbol * _Py_uop_sym_new_unknown (_Py_UOpsContext * ctx );
240- extern _Py_UopsSymbol * _Py_uop_sym_new_not_null (_Py_UOpsContext * ctx );
241- extern _Py_UopsSymbol * _Py_uop_sym_new_type (
242- _Py_UOpsContext * ctx , PyTypeObject * typ );
243- extern _Py_UopsSymbol * _Py_uop_sym_new_const (_Py_UOpsContext * ctx , PyObject * const_val );
244- extern _Py_UopsSymbol * _Py_uop_sym_new_null (_Py_UOpsContext * ctx );
245- extern bool _Py_uop_sym_has_type (_Py_UopsSymbol * sym );
246- extern bool _Py_uop_sym_matches_type (_Py_UopsSymbol * sym , PyTypeObject * typ );
247- extern bool _Py_uop_sym_matches_type_version (_Py_UopsSymbol * sym , unsigned int version );
248- extern void _Py_uop_sym_set_null (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym );
249- extern void _Py_uop_sym_set_non_null (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym );
250- extern void _Py_uop_sym_set_type (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , PyTypeObject * typ );
251- extern bool _Py_uop_sym_set_type_version (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , unsigned int version );
252- extern void _Py_uop_sym_set_const (_Py_UOpsContext * ctx , _Py_UopsSymbol * sym , PyObject * const_val );
253- extern bool _Py_uop_sym_is_bottom (_Py_UopsSymbol * sym );
254- extern int _Py_uop_sym_truthiness (_Py_UopsSymbol * sym );
255- extern PyTypeObject * _Py_uop_sym_get_type (_Py_UopsSymbol * sym );
256-
257-
258- extern void _Py_uop_abstractcontext_init (_Py_UOpsContext * ctx );
259- extern void _Py_uop_abstractcontext_fini (_Py_UOpsContext * ctx );
266+ JitOptSymbol * * n_consumed ;
267+ JitOptSymbol * * limit ;
268+ JitOptSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
269+ } JitOptContext ;
270+
271+ extern bool _Py_uop_sym_is_null (JitOptSymbol * sym );
272+ extern bool _Py_uop_sym_is_not_null (JitOptSymbol * sym );
273+ extern bool _Py_uop_sym_is_const (JitOptSymbol * sym );
274+ extern PyObject * _Py_uop_sym_get_const (JitOptSymbol * sym );
275+ extern JitOptSymbol * _Py_uop_sym_new_unknown (JitOptContext * ctx );
276+ extern JitOptSymbol * _Py_uop_sym_new_not_null (JitOptContext * ctx );
277+ extern JitOptSymbol * _Py_uop_sym_new_type (
278+ JitOptContext * ctx , PyTypeObject * typ );
279+ extern JitOptSymbol * _Py_uop_sym_new_const (JitOptContext * ctx , PyObject * const_val );
280+ extern JitOptSymbol * _Py_uop_sym_new_null (JitOptContext * ctx );
281+ extern bool _Py_uop_sym_has_type (JitOptSymbol * sym );
282+ extern bool _Py_uop_sym_matches_type (JitOptSymbol * sym , PyTypeObject * typ );
283+ extern bool _Py_uop_sym_matches_type_version (JitOptSymbol * sym , unsigned int version );
284+ extern void _Py_uop_sym_set_null (JitOptContext * ctx , JitOptSymbol * sym );
285+ extern void _Py_uop_sym_set_non_null (JitOptContext * ctx , JitOptSymbol * sym );
286+ extern void _Py_uop_sym_set_type (JitOptContext * ctx , JitOptSymbol * sym , PyTypeObject * typ );
287+ extern bool _Py_uop_sym_set_type_version (JitOptContext * ctx , JitOptSymbol * sym , unsigned int version );
288+ extern void _Py_uop_sym_set_const (JitOptContext * ctx , JitOptSymbol * sym , PyObject * const_val );
289+ extern bool _Py_uop_sym_is_bottom (JitOptSymbol * sym );
290+ extern int _Py_uop_sym_truthiness (JitOptSymbol * sym );
291+ extern PyTypeObject * _Py_uop_sym_get_type (JitOptSymbol * sym );
292+ extern bool _Py_uop_sym_is_immortal (JitOptSymbol * sym );
293+ extern JitOptSymbol * _Py_uop_sym_new_tuple (JitOptContext * ctx , int size , JitOptSymbol * * args );
294+ extern JitOptSymbol * _Py_uop_sym_tuple_getitem (JitOptContext * ctx , JitOptSymbol * sym , int item );
295+ extern int _Py_uop_sym_tuple_length (JitOptSymbol * sym );
296+
297+ extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
298+ extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
260299
261300extern _Py_UOpsAbstractFrame * _Py_uop_frame_new (
262- _Py_UOpsContext * ctx ,
301+ JitOptContext * ctx ,
263302 PyCodeObject * co ,
264303 int curr_stackentries ,
265- _Py_UopsSymbol * * args ,
304+ JitOptSymbol * * args ,
266305 int arg_len );
267- extern int _Py_uop_frame_pop (_Py_UOpsContext * ctx );
306+ extern int _Py_uop_frame_pop (JitOptContext * ctx );
268307
269308PyAPI_FUNC (PyObject * ) _Py_uop_symbols_test (PyObject * self , PyObject * ignored );
270309
0 commit comments