php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
zend_inference.c File Reference
#include "zend_compile.h"
#include "zend_generators.h"
#include "zend_inference.h"
#include "zend_func_info.h"
#include "zend_call_graph.h"
#include "zend_closures.h"
#include "zend_worklist.h"
#include "zend_optimizer_internal.h"

Go to the source code of this file.

Data Structures

struct  _zend_scc_iterator
 

Macros

#define SYM_RANGE
 
#define RANGE_WARMUP_PASSES   16
 
#define LOG_SSA_RANGE(...)
 
#define LOG_NEG_RANGE(...)
 
#define WHILE_WORKLIST(worklist, len, i)
 
#define WHILE_WORKLIST_END()
 
#define CHECK_SCC_VAR(var2)
 
#define CHECK_SCC_ENTRY(var2)
 
#define ADD_SCC_VAR(_var)
 
#define ADD_SCC_VAR_1(_var)
 
#define FOR_EACH_DEFINED_VAR(line, MACRO)
 
#define FOR_EACH_VAR_USAGE(_var, MACRO)
 
#define UPDATE_SSA_TYPE(_type, _var)
 
#define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var)
 
#define COPY_SSA_OBJ_TYPE(from_var, to_var)
 

Typedefs

typedef struct _zend_scc_iterator zend_scc_iterator
 

Functions

ZEND_API void zend_ssa_find_sccs (const zend_op_array *op_array, zend_ssa *ssa)
 
ZEND_API void zend_ssa_find_false_dependencies (const zend_op_array *op_array, zend_ssa *ssa)
 
ZEND_API bool zend_inference_propagate_range (const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op, int var, zend_ssa_range *tmp)
 
ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info (const zval *zv)
 
ZEND_API uint32_t zend_array_element_type (uint32_t t1, uint8_t op_type, int write, int insert)
 
ZEND_API uint32_t zend_fetch_arg_info_type (const zend_script *script, const zend_arg_info *arg_info, zend_class_entry **pce)
 
ZEND_API zend_result zend_update_type_info (const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, zend_op *opline, zend_ssa_op *ssa_op, const zend_op **ssa_opcodes, zend_long optimization_level)
 
uint32_t zend_get_return_info_from_signature_only (const zend_function *func, const zend_script *script, zend_class_entry **ce, bool *ce_is_instanceof, bool use_tentative_return_info)
 
ZEND_API void zend_init_func_return_info (const zend_op_array *op_array, const zend_script *script, zend_ssa_var_info *ret)
 
ZEND_API zend_result zend_ssa_inference (zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level)
 
ZEND_API bool zend_may_throw_ex (const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa, uint32_t t1, uint32_t t2)
 
ZEND_API bool zend_may_throw (const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa)
 

Macro Definition Documentation

◆ ADD_SCC_VAR

#define ADD_SCC_VAR ( _var)
Value:
do { \
if (ssa->vars[_var].scc == scc && \
!(ssa->var_info[_var].type & MAY_BE_REF)) { \
zend_bitset_incl(worklist, _var); \
} \
} while (0)
#define MAY_BE_REF

Definition at line 97 of file zend_inference.c.

◆ ADD_SCC_VAR_1

#define ADD_SCC_VAR_1 ( _var)
Value:
do { \
if (ssa->vars[_var].scc == scc && \
!(ssa->var_info[_var].type & MAY_BE_REF) && \
!zend_bitset_in(visited, _var)) { \
zend_bitset_incl(worklist, _var); \
} \
} while (0)

Definition at line 105 of file zend_inference.c.

◆ CHECK_SCC_ENTRY

#define CHECK_SCC_ENTRY ( var2)
Value:
do { \
if (ssa->vars[var2].scc != ssa->vars[var].scc) { \
ssa->vars[var2].scc_entry = 1; \
} \
} while (0)

Definition at line 90 of file zend_inference.c.

◆ CHECK_SCC_VAR

#define CHECK_SCC_VAR ( var2)
Value:
do { \
if (!ssa->vars[var2].no_val) { \
if (ssa->vars[var2].scc < 0) { \
zend_ssa_check_scc_var(op_array, ssa, var2, index, stack); \
} \
if (ssa->vars[var2].scc < ssa->vars[var].scc) { \
ssa->vars[var].scc = ssa->vars[var2].scc; \
is_root = 0; \
} \
} \
} while (0)

Definition at line 77 of file zend_inference.c.

◆ COPY_SSA_OBJ_TYPE

#define COPY_SSA_OBJ_TYPE ( from_var,
to_var )
Value:
do { \
if ((from_var) >= 0 && (ssa_var_info[(from_var)].type & MAY_BE_OBJECT) \
&& ssa_var_info[(from_var)].ce && !(ssa_var_info[(to_var)].type & MAY_BE_REF)) { \
UPDATE_SSA_OBJ_TYPE(ssa_var_info[(from_var)].ce, \
ssa_var_info[(from_var)].is_instanceof, (to_var)); \
} else { \
UPDATE_SSA_OBJ_TYPE(NULL, 0, (to_var)); \
} \
} while (0)
zend_ffi_type * type
Definition ffi.c:3812
#define NULL
Definition gdcache.h:45
#define MAY_BE_OBJECT

Definition at line 2017 of file zend_inference.c.

◆ FOR_EACH_DEFINED_VAR

#define FOR_EACH_DEFINED_VAR ( line,
MACRO )

Definition at line 114 of file zend_inference.c.

◆ FOR_EACH_VAR_USAGE

#define FOR_EACH_VAR_USAGE ( _var,
MACRO )
Value:
do { \
zend_ssa_phi *p = ssa->vars[_var].phi_use_chain; \
int use = ssa->vars[_var].use_chain; \
while (use >= 0) { \
FOR_EACH_DEFINED_VAR(use, MACRO); \
use = zend_ssa_next_use(ssa->ops, _var, use); \
} \
p = ssa->vars[_var].phi_use_chain; \
while (p) { \
MACRO(p->ssa_var); \
p = zend_ssa_next_use_phi(ssa, _var, p); \
} \
} while (0)
p
Definition session.c:1105
struct _zend_ssa_phi zend_ssa_phi
Definition zend_ssa.h:62

Definition at line 150 of file zend_inference.c.

◆ LOG_NEG_RANGE

#define LOG_NEG_RANGE ( ...)

Definition at line 60 of file zend_inference.c.

◆ LOG_SSA_RANGE

#define LOG_SSA_RANGE ( ...)

Definition at line 53 of file zend_inference.c.

◆ RANGE_WARMUP_PASSES

#define RANGE_WARMUP_PASSES   16

Definition at line 47 of file zend_inference.c.

◆ SYM_RANGE

#define SYM_RANGE

Definition at line 40 of file zend_inference.c.

◆ UPDATE_SSA_OBJ_TYPE

#define UPDATE_SSA_OBJ_TYPE ( _ce,
_is_instanceof,
var )
Value:
do { \
if (var >= 0) { \
zend_class_entry *__ce = (_ce); \
bool __is_instanceof = (_is_instanceof); \
if (__ce && (__ce->ce_flags & ZEND_ACC_FINAL)) { \
__is_instanceof = false; \
} \
if (ssa_var_info[var].ce != __ce || \
ssa_var_info[var].is_instanceof != __is_instanceof) { \
ssa_var_info[var].ce = __ce; \
ssa_var_info[var].is_instanceof = __is_instanceof; \
if (update_worklist) { \
add_usages(op_array, ssa, worklist, var); \
} \
} \
/*zend_bitset_excl(worklist, var);*/ \
} \
} while (0)
uint32_t ce_flags
Definition zend.h:156
#define ZEND_ACC_FINAL
struct _zend_class_entry zend_class_entry

Definition at line 1997 of file zend_inference.c.

◆ UPDATE_SSA_TYPE

#define UPDATE_SSA_TYPE ( _type,
_var )

Definition at line 1948 of file zend_inference.c.

◆ WHILE_WORKLIST

#define WHILE_WORKLIST ( worklist,
len,
i )
Value:
do { \
bool _done = 0; \
while (!_done) { \
_done = 1; \
ZEND_BITSET_FOREACH(worklist, len, i) { \
zend_bitset_excl(worklist, i); \
_done = 0;
size_t len
Definition apprentice.c:174

Definition at line 64 of file zend_inference.c.

◆ WHILE_WORKLIST_END

#define WHILE_WORKLIST_END ( )
Value:
} \
} while (0)
#define ZEND_BITSET_FOREACH_END()

Definition at line 72 of file zend_inference.c.

Typedef Documentation

◆ zend_scc_iterator

Function Documentation

◆ zend_array_element_type()

ZEND_API uint32_t zend_array_element_type ( uint32_t t1,
uint8_t op_type,
int write,
int insert )

Definition at line 2128 of file zend_inference.c.

◆ zend_array_type_info()

ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info ( const zval * zv)

Definition at line 2094 of file zend_inference.c.

◆ zend_fetch_arg_info_type()

ZEND_API uint32_t zend_fetch_arg_info_type ( const zend_script * script,
const zend_arg_info * arg_info,
zend_class_entry ** pce )

Definition at line 2401 of file zend_inference.c.

◆ zend_get_return_info_from_signature_only()

uint32_t zend_get_return_info_from_signature_only ( const zend_function * func,
const zend_script * script,
zend_class_entry ** ce,
bool * ce_is_instanceof,
bool use_tentative_return_info )

Definition at line 4511 of file zend_inference.c.

◆ zend_inference_propagate_range()

ZEND_API bool zend_inference_propagate_range ( const zend_op_array * op_array,
const zend_ssa * ssa,
const zend_op * opline,
const zend_ssa_op * ssa_op,
int var,
zend_ssa_range * tmp )

Definition at line 1252 of file zend_inference.c.

◆ zend_init_func_return_info()

ZEND_API void zend_init_func_return_info ( const zend_op_array * op_array,
const zend_script * script,
zend_ssa_var_info * ret )

Definition at line 4538 of file zend_inference.c.

◆ zend_may_throw()

ZEND_API bool zend_may_throw ( const zend_op * opline,
const zend_ssa_op * ssa_op,
const zend_op_array * op_array,
const zend_ssa * ssa )

Definition at line 5336 of file zend_inference.c.

◆ zend_may_throw_ex()

ZEND_API bool zend_may_throw_ex ( const zend_op * opline,
const zend_ssa_op * ssa_op,
const zend_op_array * op_array,
const zend_ssa * ssa,
uint32_t t1,
uint32_t t2 )

Definition at line 4921 of file zend_inference.c.

◆ zend_ssa_find_false_dependencies()

ZEND_API void zend_ssa_find_false_dependencies ( const zend_op_array * op_array,
zend_ssa * ssa )

Definition at line 490 of file zend_inference.c.

◆ zend_ssa_find_sccs()

ZEND_API void zend_ssa_find_sccs ( const zend_op_array * op_array,
zend_ssa * ssa )

Definition at line 443 of file zend_inference.c.

◆ zend_ssa_inference()

ZEND_API zend_result zend_ssa_inference ( zend_arena ** arena,
const zend_op_array * op_array,
const zend_script * script,
zend_ssa * ssa,
zend_long optimization_level )

Definition at line 4880 of file zend_inference.c.

◆ zend_update_type_info()

ZEND_API zend_result zend_update_type_info ( const zend_op_array * op_array,
zend_ssa * ssa,
const zend_script * script,
zend_op * opline,
zend_ssa_op * ssa_op,
const zend_op ** ssa_opcodes,
zend_long optimization_level )

Definition at line 4114 of file zend_inference.c.