summaryrefslogtreecommitdiffstats
path: root/Include/internal/pycore_flowgraph.h
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-08-10 12:03:47 (GMT)
committerGitHub <noreply@github.com>2023-08-10 12:03:47 (GMT)
commitbafedfbebd0f21291a7824d54e39ec79f142428b (patch)
tree82ea7fc832b4a1e0e1db11345f0d91ebfb30ec16 /Include/internal/pycore_flowgraph.h
parent494e3d4436774a5ac1a569a635b8c5c881ef1c0c (diff)
downloadcpython-bafedfbebd0f21291a7824d54e39ec79f142428b.zip
cpython-bafedfbebd0f21291a7824d54e39ec79f142428b.tar.gz
cpython-bafedfbebd0f21291a7824d54e39ec79f142428b.tar.bz2
gh-106149: move CFG and basicblock definitions into flowgraph.c, use them as opaque types in compile.c (#107639)
Diffstat (limited to 'Include/internal/pycore_flowgraph.h')
-rw-r--r--Include/internal/pycore_flowgraph.h86
1 files changed, 12 insertions, 74 deletions
diff --git a/Include/internal/pycore_flowgraph.h b/Include/internal/pycore_flowgraph.h
index cb55f87..58fed46 100644
--- a/Include/internal/pycore_flowgraph.h
+++ b/Include/internal/pycore_flowgraph.h
@@ -11,88 +11,26 @@ extern "C" {
#include "pycore_opcode_utils.h"
#include "pycore_compile.h"
-
-typedef struct {
- int i_opcode;
- int i_oparg;
- _PyCompilerSrcLocation i_loc;
- struct _PyCfgBasicblock_ *i_target; /* target block (if jump instruction) */
- struct _PyCfgBasicblock_ *i_except; /* target block when exception is raised */
-} _PyCfgInstruction;
-
typedef struct {
int id;
} _PyCfgJumpTargetLabel;
+struct _PyCfgBuilder;
-typedef struct {
- struct _PyCfgBasicblock_ *handlers[CO_MAXBLOCKS+1];
- int depth;
-} _PyCfgExceptStack;
-
-typedef struct _PyCfgBasicblock_ {
- /* Each basicblock in a compilation unit is linked via b_list in the
- reverse order that the block are allocated. b_list points to the next
- block in this list, not to be confused with b_next, which is next by
- control flow. */
- struct _PyCfgBasicblock_ *b_list;
- /* The label of this block if it is a jump target, -1 otherwise */
- _PyCfgJumpTargetLabel b_label;
- /* Exception stack at start of block, used by assembler to create the exception handling table */
- _PyCfgExceptStack *b_exceptstack;
- /* pointer to an array of instructions, initially NULL */
- _PyCfgInstruction *b_instr;
- /* If b_next is non-NULL, it is a pointer to the next
- block reached by normal control flow. */
- struct _PyCfgBasicblock_ *b_next;
- /* number of instructions used */
- int b_iused;
- /* length of instruction array (b_instr) */
- int b_ialloc;
- /* Used by add_checks_for_loads_of_unknown_variables */
- uint64_t b_unsafe_locals_mask;
- /* Number of predecessors that a block has. */
- int b_predecessors;
- /* depth of stack upon entry of block, computed by stackdepth() */
- int b_startdepth;
- /* Basic block is an exception handler that preserves lasti */
- unsigned b_preserve_lasti : 1;
- /* Used by compiler passes to mark whether they have visited a basic block. */
- unsigned b_visited : 1;
- /* b_except_handler is used by the cold-detection algorithm to mark exception targets */
- unsigned b_except_handler : 1;
- /* b_cold is true if this block is not perf critical (like an exception handler) */
- unsigned b_cold : 1;
- /* b_warm is used by the cold-detection algorithm to mark blocks which are definitely not cold */
- unsigned b_warm : 1;
-} _PyCfgBasicblock;
+int _PyCfgBuilder_UseLabel(struct _PyCfgBuilder *g, _PyCfgJumpTargetLabel lbl);
+int _PyCfgBuilder_Addop(struct _PyCfgBuilder *g, int opcode, int oparg, _PyCompilerSrcLocation loc);
-int _PyBasicblock_InsertInstruction(_PyCfgBasicblock *block, int pos, _PyCfgInstruction *instr);
+struct _PyCfgBuilder* _PyCfgBuilder_New(void);
+void _PyCfgBuilder_Free(struct _PyCfgBuilder *g);
+int _PyCfgBuilder_CheckSize(struct _PyCfgBuilder* g);
-typedef struct cfg_builder_ {
- /* The entryblock, at which control flow begins. All blocks of the
- CFG are reachable through the b_next links */
- _PyCfgBasicblock *g_entryblock;
- /* Pointer to the most recently allocated block. By following
- b_list links, you can reach all allocated blocks. */
- _PyCfgBasicblock *g_block_list;
- /* pointer to the block currently being constructed */
- _PyCfgBasicblock *g_curblock;
- /* label for the next instruction to be placed */
- _PyCfgJumpTargetLabel g_current_label;
-} _PyCfgBuilder;
-
-int _PyCfgBuilder_UseLabel(_PyCfgBuilder *g, _PyCfgJumpTargetLabel lbl);
-int _PyCfgBuilder_Addop(_PyCfgBuilder *g, int opcode, int oparg, _PyCompilerSrcLocation loc);
-
-int _PyCfgBuilder_Init(_PyCfgBuilder *g);
-void _PyCfgBuilder_Fini(_PyCfgBuilder *g);
-
-int _PyCfg_OptimizeCodeUnit(_PyCfgBuilder *g, PyObject *consts, PyObject *const_cache,
+int _PyCfg_OptimizeCodeUnit(struct _PyCfgBuilder *g, PyObject *consts, PyObject *const_cache,
int nlocals, int nparams, int firstlineno);
-int _PyCfg_Stackdepth(_PyCfgBuilder *g);
-void _PyCfg_ConvertPseudoOps(_PyCfgBasicblock *entryblock);
-int _PyCfg_ResolveJumps(_PyCfgBuilder *g);
+
+int _PyCfg_ToInstructionSequence(struct _PyCfgBuilder *g, _PyCompile_InstructionSequence *seq);
+int _PyCfg_OptimizedCfgToInstructionSequence(struct _PyCfgBuilder *g, _PyCompile_CodeUnitMetadata *umd,
+ int code_flags, int *stackdepth, int *nlocalsplus,
+ _PyCompile_InstructionSequence *seq);
PyCodeObject *
_PyAssemble_MakeCodeObject(_PyCompile_CodeUnitMetadata *u, PyObject *const_cache,