| 
									
										
										
										
											2023-08-16 02:04:17 +08:00
										 |  |  | #ifndef Py_INTERNAL_OPTIMIZER_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_OPTIMIZER_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:24:48 +08:00
										 |  |  | #include "pycore_uop_ids.h"
 | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | #include <stdbool.h>
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:24:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct _PyExecutorLinkListNode { | 
					
						
							|  |  |  |     struct _PyExecutorObject *next; | 
					
						
							|  |  |  |     struct _PyExecutorObject *previous; | 
					
						
							|  |  |  | } _PyExecutorLinkListNode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Bloom filter with m = 256
 | 
					
						
							|  |  |  |  * https://en.wikipedia.org/wiki/Bloom_filter */
 | 
					
						
							|  |  |  | #define _Py_BLOOM_FILTER_WORDS 8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     uint32_t bits[_Py_BLOOM_FILTER_WORDS]; | 
					
						
							|  |  |  | } _PyBloomFilter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     uint8_t opcode; | 
					
						
							|  |  |  |     uint8_t oparg; | 
					
						
							| 
									
										
										
										
											2024-09-26 17:35:42 -07:00
										 |  |  |     uint8_t valid:1; | 
					
						
							|  |  |  |     uint8_t linked:1; | 
					
						
							|  |  |  |     uint8_t chain_depth:6;  // Must be big enough for MAX_CHAIN_DEPTH - 1.
 | 
					
						
							|  |  |  |     bool warm; | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  |     int index;           // Index of ENTER_EXECUTOR (if code isn't NULL, below).
 | 
					
						
							|  |  |  |     _PyBloomFilter bloom; | 
					
						
							|  |  |  |     _PyExecutorLinkListNode links; | 
					
						
							|  |  |  |     PyCodeObject *code;  // Weak (NULL if no corresponding ENTER_EXECUTOR).
 | 
					
						
							|  |  |  | } _PyVMData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Depending on the format,
 | 
					
						
							|  |  |  |  * the 32 bits between the oparg and operand are: | 
					
						
							|  |  |  |  * UOP_FORMAT_TARGET: | 
					
						
							|  |  |  |  *    uint32_t target; | 
					
						
							|  |  |  |  * UOP_FORMAT_JUMP | 
					
						
							|  |  |  |  *    uint16_t jump_target; | 
					
						
							|  |  |  |  *    uint16_t error_target; | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2024-07-01 13:17:40 -07:00
										 |  |  |     uint16_t opcode:15; | 
					
						
							|  |  |  |     uint16_t format:1; | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  |     uint16_t oparg; | 
					
						
							|  |  |  |     union { | 
					
						
							|  |  |  |         uint32_t target; | 
					
						
							|  |  |  |         struct { | 
					
						
							| 
									
										
										
										
											2024-07-01 13:17:40 -07:00
										 |  |  |             uint16_t jump_target; | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  |             uint16_t error_target; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2024-11-09 11:35:33 +08:00
										 |  |  |     uint64_t operand0;  // A cache entry
 | 
					
						
							|  |  |  |     uint64_t operand1; | 
					
						
							| 
									
										
										
										
											2024-12-13 11:00:00 +00:00
										 |  |  | #ifdef Py_STATS
 | 
					
						
							|  |  |  |     uint64_t execution_count; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | } _PyUOpInstruction; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     uint32_t target; | 
					
						
							|  |  |  |     _Py_BackoffCounter temperature; | 
					
						
							|  |  |  |     const struct _PyExecutorObject *executor; | 
					
						
							|  |  |  | } _PyExitData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _PyExecutorObject { | 
					
						
							|  |  |  |     PyObject_VAR_HEAD | 
					
						
							|  |  |  |     const _PyUOpInstruction *trace; | 
					
						
							|  |  |  |     _PyVMData vm_data; /* Used by the VM, but opaque to the optimizer */ | 
					
						
							|  |  |  |     uint32_t exit_count; | 
					
						
							|  |  |  |     uint32_t code_size; | 
					
						
							|  |  |  |     size_t jit_size; | 
					
						
							|  |  |  |     void *jit_code; | 
					
						
							|  |  |  |     void *jit_side_entry; | 
					
						
							|  |  |  |     _PyExitData exits[1]; | 
					
						
							|  |  |  | } _PyExecutorObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Export for '_opcode' shared extension (JIT compiler).
 | 
					
						
							|  |  |  | PyAPI_FUNC(_PyExecutorObject*) _Py_GetExecutor(PyCodeObject *code, int offset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void _Py_ExecutorInit(_PyExecutorObject *, const _PyBloomFilter *); | 
					
						
							|  |  |  | void _Py_ExecutorDetach(_PyExecutorObject *); | 
					
						
							|  |  |  | void _Py_BloomFilter_Init(_PyBloomFilter *); | 
					
						
							|  |  |  | void _Py_BloomFilter_Add(_PyBloomFilter *bloom, void *obj); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _Py_Executor_DependsOn(_PyExecutorObject *executor, void *obj); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _Py_MAX_ALLOWED_BUILTINS_MODIFICATIONS 3
 | 
					
						
							|  |  |  | #define _Py_MAX_ALLOWED_GLOBALS_MODIFICATIONS 6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _Py_TIER2
 | 
					
						
							|  |  |  | PyAPI_FUNC(void) _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is_invalidation); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _Py_Executors_InvalidateAll(PyInterpreterState *interp, int is_invalidation); | 
					
						
							| 
									
										
										
										
											2024-09-26 17:35:42 -07:00
										 |  |  | PyAPI_FUNC(void) _Py_Executors_InvalidateCold(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #  define _Py_Executors_InvalidateDependency(A, B, C) ((void)0)
 | 
					
						
							|  |  |  | #  define _Py_Executors_InvalidateAll(A, B) ((void)0)
 | 
					
						
							| 
									
										
										
										
											2024-09-26 17:35:42 -07:00
										 |  |  | #  define _Py_Executors_InvalidateCold(A) ((void)0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 17:35:42 -07:00
										 |  |  | // Used as the threshold to trigger executor invalidation when
 | 
					
						
							|  |  |  | // trace_run_counter is greater than this value.
 | 
					
						
							|  |  |  | #define JIT_CLEANUP_THRESHOLD 100000
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:24:48 +08:00
										 |  |  | // This is the length of the trace we project initially.
 | 
					
						
							| 
									
										
										
										
											2024-03-26 09:35:11 +00:00
										 |  |  | #define UOP_MAX_TRACE_LENGTH 800
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:24:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define TRACE_STACK_SIZE 5
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-26 13:54:03 +02:00
										 |  |  | int _Py_uop_analyze_and_optimize(struct _PyInterpreterFrame *frame, | 
					
						
							| 
									
										
										
										
											2024-02-02 12:14:34 +00:00
										 |  |  |     _PyUOpInstruction *trace, int trace_len, int curr_stackentries, | 
					
						
							|  |  |  |     _PyBloomFilter *dependencies); | 
					
						
							| 
									
										
										
										
											2023-08-16 02:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 13:53:25 -07:00
										 |  |  | extern PyTypeObject _PyUOpExecutor_Type; | 
					
						
							| 
									
										
										
										
											2023-08-16 02:04:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-10 18:20:12 +02:00
										 |  |  | #define UOP_FORMAT_TARGET 0
 | 
					
						
							| 
									
										
										
										
											2024-07-01 13:17:40 -07:00
										 |  |  | #define UOP_FORMAT_JUMP 1
 | 
					
						
							| 
									
										
										
										
											2024-05-10 18:20:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline uint32_t uop_get_target(const _PyUOpInstruction *inst) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     assert(inst->format == UOP_FORMAT_TARGET); | 
					
						
							|  |  |  |     return inst->target; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline uint16_t uop_get_jump_target(const _PyUOpInstruction *inst) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     assert(inst->format == UOP_FORMAT_JUMP); | 
					
						
							|  |  |  |     return inst->jump_target; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     assert(inst->format != UOP_FORMAT_TARGET); | 
					
						
							|  |  |  |     return inst->error_target; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | // Holds locals, stack, locals, stack ... co_consts (in that order)
 | 
					
						
							|  |  |  | #define MAX_ABSTRACT_INTERP_SIZE 4096
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 13:25:02 +00:00
										 |  |  | #define TY_ARENA_SIZE (UOP_MAX_TRACE_LENGTH * 5)
 | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Need extras for root frame and for overflow frame (see TRACE_STACK_PUSH())
 | 
					
						
							|  |  |  | #define MAX_ABSTRACT_FRAME_DEPTH (TRACE_STACK_SIZE + 2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-12 12:39:31 -07:00
										 |  |  | // The maximum number of side exits that we can take before requiring forward
 | 
					
						
							|  |  |  | // progress (and inserting a new ENTER_EXECUTOR instruction). In practice, this
 | 
					
						
							|  |  |  | // is the "maximum amount of polymorphism" that an isolated trace tree can
 | 
					
						
							|  |  |  | // handle before rejoining the rest of the program.
 | 
					
						
							|  |  |  | #define MAX_CHAIN_DEPTH 4
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  | /* Symbols */ | 
					
						
							|  |  |  | /* See explanation in optimizer_symbols.c */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef enum _JitSymType { | 
					
						
							|  |  |  |     JIT_SYM_UNKNOWN_TAG = 1, | 
					
						
							|  |  |  |     JIT_SYM_NULL_TAG = 2, | 
					
						
							|  |  |  |     JIT_SYM_NON_NULL_TAG = 3, | 
					
						
							|  |  |  |     JIT_SYM_BOTTOM_TAG = 4, | 
					
						
							|  |  |  |     JIT_SYM_TYPE_VERSION_TAG = 5, | 
					
						
							|  |  |  |     JIT_SYM_KNOWN_CLASS_TAG = 6, | 
					
						
							|  |  |  |     JIT_SYM_KNOWN_VALUE_TAG = 7, | 
					
						
							|  |  |  |     JIT_SYM_TUPLE_TAG = 8, | 
					
						
							|  |  |  | } JitSymType; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _jit_opt_known_class { | 
					
						
							|  |  |  |     uint8_t tag; | 
					
						
							|  |  |  |     uint32_t version; | 
					
						
							|  |  |  |     PyTypeObject *type; | 
					
						
							|  |  |  | } JitOptKnownClass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _jit_opt_known_version { | 
					
						
							|  |  |  |     uint8_t tag; | 
					
						
							|  |  |  |     uint32_t version; | 
					
						
							|  |  |  | } JitOptKnownVersion; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _jit_opt_known_value { | 
					
						
							|  |  |  |     uint8_t tag; | 
					
						
							|  |  |  |     PyObject *value; | 
					
						
							|  |  |  | } JitOptKnownValue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAX_SYMBOLIC_TUPLE_SIZE 7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _jit_opt_tuple { | 
					
						
							|  |  |  |     uint8_t tag; | 
					
						
							|  |  |  |     uint8_t length; | 
					
						
							|  |  |  |     uint16_t items[MAX_SYMBOLIC_TUPLE_SIZE]; | 
					
						
							|  |  |  | } JitOptTuple; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef union _jit_opt_symbol { | 
					
						
							|  |  |  |     uint8_t tag; | 
					
						
							|  |  |  |     JitOptKnownClass cls; | 
					
						
							|  |  |  |     JitOptKnownValue value; | 
					
						
							|  |  |  |     JitOptKnownVersion version; | 
					
						
							|  |  |  |     JitOptTuple tuple; | 
					
						
							|  |  |  | } JitOptSymbol; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct _Py_UOpsAbstractFrame { | 
					
						
							|  |  |  |     // Max stacklen
 | 
					
						
							|  |  |  |     int stack_len; | 
					
						
							|  |  |  |     int locals_len; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  |     JitOptSymbol **stack_pointer; | 
					
						
							|  |  |  |     JitOptSymbol **stack; | 
					
						
							|  |  |  |     JitOptSymbol **locals; | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct ty_arena { | 
					
						
							|  |  |  |     int ty_curr_number; | 
					
						
							|  |  |  |     int ty_max_number; | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  |     JitOptSymbol arena[TY_ARENA_SIZE]; | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | } ty_arena; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  | typedef struct _JitOptContext { | 
					
						
							| 
									
										
										
										
											2024-05-10 17:43:23 +01:00
										 |  |  |     char done; | 
					
						
							|  |  |  |     char out_of_space; | 
					
						
							|  |  |  |     bool contradiction; | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  |     // The current "executing" frame.
 | 
					
						
							|  |  |  |     _Py_UOpsAbstractFrame *frame; | 
					
						
							|  |  |  |     _Py_UOpsAbstractFrame frames[MAX_ABSTRACT_FRAME_DEPTH]; | 
					
						
							|  |  |  |     int curr_frame_depth; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Arena for the symbolic types.
 | 
					
						
							|  |  |  |     ty_arena t_arena; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  |     JitOptSymbol **n_consumed; | 
					
						
							|  |  |  |     JitOptSymbol **limit; | 
					
						
							|  |  |  |     JitOptSymbol *locals_and_stack[MAX_ABSTRACT_INTERP_SIZE]; | 
					
						
							|  |  |  | } JitOptContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern bool _Py_uop_sym_is_null(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_is_not_null(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_is_const(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern PyObject *_Py_uop_sym_get_const(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_unknown(JitOptContext *ctx); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_not_null(JitOptContext *ctx); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_type( | 
					
						
							|  |  |  |     JitOptContext *ctx, PyTypeObject *typ); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_const(JitOptContext *ctx, PyObject *const_val); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_null(JitOptContext *ctx); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_has_type(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_matches_type(JitOptSymbol *sym, PyTypeObject *typ); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_matches_type_version(JitOptSymbol *sym, unsigned int version); | 
					
						
							|  |  |  | extern void _Py_uop_sym_set_null(JitOptContext *ctx, JitOptSymbol *sym); | 
					
						
							|  |  |  | extern void _Py_uop_sym_set_non_null(JitOptContext *ctx, JitOptSymbol *sym); | 
					
						
							|  |  |  | extern void _Py_uop_sym_set_type(JitOptContext *ctx, JitOptSymbol *sym, PyTypeObject *typ); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_set_type_version(JitOptContext *ctx, JitOptSymbol *sym, unsigned int version); | 
					
						
							|  |  |  | extern void _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObject *const_val); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_is_bottom(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern int _Py_uop_sym_truthiness(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern PyTypeObject *_Py_uop_sym_get_type(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern bool _Py_uop_sym_is_immortal(JitOptSymbol *sym); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_new_tuple(JitOptContext *ctx, int size, JitOptSymbol **args); | 
					
						
							|  |  |  | extern JitOptSymbol *_Py_uop_sym_tuple_getitem(JitOptContext *ctx, JitOptSymbol *sym, int item); | 
					
						
							|  |  |  | extern int _Py_uop_sym_tuple_length(JitOptSymbol *sym); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern void _Py_uop_abstractcontext_init(JitOptContext *ctx); | 
					
						
							|  |  |  | extern void _Py_uop_abstractcontext_fini(JitOptContext *ctx); | 
					
						
							| 
									
										
										
										
											2024-02-27 13:25:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern _Py_UOpsAbstractFrame *_Py_uop_frame_new( | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  |     JitOptContext *ctx, | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  |     PyCodeObject *co, | 
					
						
							| 
									
										
										
										
											2024-06-08 05:41:45 -04:00
										 |  |  |     int curr_stackentries, | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  |     JitOptSymbol **args, | 
					
						
							| 
									
										
										
										
											2024-06-08 05:41:45 -04:00
										 |  |  |     int arg_len); | 
					
						
							| 
									
										
										
										
											2025-01-20 15:49:15 +00:00
										 |  |  | extern int _Py_uop_frame_pop(JitOptContext *ctx); | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 13:25:02 +00:00
										 |  |  | PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored); | 
					
						
							| 
									
										
										
										
											2024-02-27 10:51:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-12 12:39:31 -07:00
										 |  |  | PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyStackRef *stack_pointer, _PyExecutorObject **exec_ptr, int chain_depth); | 
					
						
							| 
									
										
										
										
											2024-02-29 08:11:28 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-02 00:19:05 +01:00
										 |  |  | static inline int is_terminator(const _PyUOpInstruction *uop) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int opcode = uop->opcode; | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |         opcode == _EXIT_TRACE || | 
					
						
							|  |  |  |         opcode == _JUMP_TO_TOP || | 
					
						
							|  |  |  |         opcode == _DYNAMIC_EXIT | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 11:00:00 +00:00
										 |  |  | PyAPI_FUNC(int) _PyDumpExecutors(FILE *out); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-16 02:04:17 +08:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_OPTIMIZER_H */
 |