pyflow-analysis 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyflow/__init__.py +22 -0
- pyflow/_pyflow.py +50 -0
- pyflow/analysis/__init__.py +14 -0
- pyflow/analysis/alias/__init__.py +3 -0
- pyflow/analysis/alias/flow_sensitive/__init__.py +148 -0
- pyflow/analysis/alias/flow_sensitive/_transfer_calls.py +3493 -0
- pyflow/analysis/alias/flow_sensitive/_transfer_ops.py +1969 -0
- pyflow/analysis/alias/flow_sensitive/abstraction.py +1632 -0
- pyflow/analysis/alias/flow_sensitive/heap_analysis.py +280 -0
- pyflow/analysis/alias/flow_sensitive/heap_effects.py +1209 -0
- pyflow/analysis/alias/flow_sensitive/heap_state.py +381 -0
- pyflow/analysis/alias/flow_sensitive/heap_summary.py +299 -0
- pyflow/analysis/alias/flow_sensitive/intrinsics.py +948 -0
- pyflow/analysis/alias/flow_sensitive/model.py +449 -0
- pyflow/analysis/alias/flow_sensitive/points_to_graph.py +722 -0
- pyflow/analysis/alias/flow_sensitive/transfer.py +1483 -0
- pyflow/analysis/alias/kcfa/__init__.py +33 -0
- pyflow/analysis/alias/kcfa/_pythonstan/__init__.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/__init__.py +1 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/__init__.py +53 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/logging.py +490 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/operation.py +1601 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/pointer_adapter.py +353 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/solver.py +559 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/state.py +701 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/ai/value.py +804 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/analysis.py +86 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/class_hierarchy.py +83 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/closure.py +69 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/__init__.py +4 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/analysis.py +58 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/driver.py +38 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/liveness.py +33 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/reaching_definition.py +52 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/dataflow/solver.py +178 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/defuse.py +46 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/__init__.py +18 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/__init__.py +110 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/analysis.py +382 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/builtin_api_handler.py +1872 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/call_graph_analyzer.py +289 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/class_hierarchy.py +304 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/config.py +139 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/constraints.py +576 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/context.py +496 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/context_selector.py +297 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/debug_monitor.py +34 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/heap_model.py +221 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/ir_translator.py +1181 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/libs/__init__.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/libs/math.py +244 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/module_analysis.py +269 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/module_summary.py +191 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/object.py +685 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/pointer_flow_graph.py +282 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/points_to_set.py +301 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/__init__.py +21 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/attribute_semantics.py +512 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/compose_processor.py +46 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/container.py +128 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/generator.py +353 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/normal_call.py +664 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/processor.py +36 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/processor/super_resolve.py +131 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/pta_query_adapter.py +329 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/solver.py +917 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/solver_interface.py +76 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/state.py +735 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/unknown_tracker.py +126 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/pointer/kcfa/variable.py +144 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/scope/__init__.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/scope/analysis.py +37 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/scope/closure.py +81 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/__init__.py +8 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/block_cfg.py +133 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/cfg.py +95 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/driver.py +26 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/__init__.py +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/base.py +112 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/baseprocess.py +524 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/icfg.py +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/icfg_pre_transform.py +69 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/icfg_transform.py +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/postprocessor.py +308 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/icfg/preprocessor.py +375 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/ir.py +361 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/three_address.py +1161 -0
- pyflow/analysis/alias/kcfa/_pythonstan/analysis/transform/transform.py +27 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/__init__.py +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/call_graph/__init__.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/call_graph/call_edge.py +45 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/call_graph/call_graph.py +77 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/__init__.py +3 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/base_block.py +83 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/cfg.py +200 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/dump.py +20 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/edges.py +162 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/cfg/visualize.py +112 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/dominator_tree.py +126 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/graph.py +81 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/icfg/__init__.py +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/graph/icfg/icfg.py +98 -0
- pyflow/analysis/alias/kcfa/_pythonstan/ir/__init__.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/ir/ir_statements.py +1579 -0
- pyflow/analysis/alias/kcfa/_pythonstan/ir/ir_visitor.py +21 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/LICENSE.pythonstan +28 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/README.md +99 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/abc.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/base64.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/bisect.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/collections.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/contextlib.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/copy.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/csv.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/dataclasses.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/datetime.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/email.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/enum.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/fnmatch.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/functools.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/glob.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/hashlib.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/heapq.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/hmac.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/http.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/importlib.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/inspect.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/io.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/itertools.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/json.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/logging.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/math.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/mimetypes.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/operator.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/os.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/pathlib.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/pickle.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/random.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/re.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/secrets.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/shutil.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/somelib.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/tempfile.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/time.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/traceback.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/types.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/uuid.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/warnings.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/__pycache__/weakref.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/abc.py +80 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/base64.py +62 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/bisect.py +52 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/collections.py +187 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/contextlib.py +113 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/copy.py +15 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/csv.py +163 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/dataclasses.py +150 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/datetime.py +171 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/email.py +270 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/enum.py +144 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/fnmatch.py +14 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/functools.py +84 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/glob.py +10 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/hashlib.py +74 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/heapq.py +91 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/hmac.py +31 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/http.py +317 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/importlib.py +126 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/inspect.py +246 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/io.py +471 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/itertools.py +164 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/json.py +80 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/logging.py +193 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/math.py +244 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/mimetypes.py +119 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/operator.py +310 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/os.py +286 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/pathlib.py +196 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/pickle.py +153 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/random.py +125 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/re.py +125 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/secrets.py +29 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/shutil.py +99 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/somelib.py +2 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/tempfile.py +76 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/time.py +65 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/traceback.py +151 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/types.py +247 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/urllib/__init__.py +1 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/urllib/parse.py +221 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/uuid.py +34 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/warnings.py +82 -0
- pyflow/analysis/alias/kcfa/_pythonstan/stubs/stdlib/weakref.py +272 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/__init__.py +1 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/ast_rename.py +35 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/common.py +70 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/persistent_rb_tree.py +364 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/temp_var_generator.py +68 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/toposort.py +63 -0
- pyflow/analysis/alias/kcfa/_pythonstan/utils/var_collector.py +72 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/__init__.py +1 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/analysis_manager.py +141 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/class_hierarchy.py +56 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/config.py +93 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/import_manager.py +16 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/namespace.py +327 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/pipeline.py +153 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/scope_manager.py +133 -0
- pyflow/analysis/alias/kcfa/_pythonstan/world/world.py +49 -0
- pyflow/analysis/alias/kcfa/bridge.py +136 -0
- pyflow/analysis/astcollector.py +171 -0
- pyflow/analysis/cache/incremental.py +226 -0
- pyflow/analysis/callgraph/__init__.py +58 -0
- pyflow/analysis/callgraph/ast_based.py +184 -0
- pyflow/analysis/callgraph/callgraph.py +86 -0
- pyflow/analysis/callgraph/constraint_based/__init__.py +26 -0
- pyflow/analysis/callgraph/constraint_based/_analyzer.py +1976 -0
- pyflow/analysis/callgraph/constraint_based/_collector.py +704 -0
- pyflow/analysis/callgraph/constraint_based/_evaluator.py +984 -0
- pyflow/analysis/callgraph/constraint_based/_loader.py +115 -0
- pyflow/analysis/callgraph/constraint_based/_resolver.py +2852 -0
- pyflow/analysis/callgraph/constraint_based/api.py +233 -0
- pyflow/analysis/callgraph/constraint_based/engine.py +717 -0
- pyflow/analysis/callgraph/constraint_based/model.py +303 -0
- pyflow/analysis/callgraph/formats.py +99 -0
- pyflow/analysis/callgraph/pycg_based.py +273 -0
- pyflow/analysis/cdg/__init__.py +52 -0
- pyflow/analysis/cdg/construction.py +256 -0
- pyflow/analysis/cdg/dump.py +415 -0
- pyflow/analysis/cdg/graph.py +456 -0
- pyflow/analysis/cfg/__init__.py +38 -0
- pyflow/analysis/cfg/dfs.py +55 -0
- pyflow/analysis/cfg/dom.py +243 -0
- pyflow/analysis/cfg/dump.py +322 -0
- pyflow/analysis/cfg/expandphi.py +113 -0
- pyflow/analysis/cfg/gc.py +93 -0
- pyflow/analysis/cfg/graph.py +878 -0
- pyflow/analysis/cfg/inline.py +337 -0
- pyflow/analysis/cfg/killflow.py +360 -0
- pyflow/analysis/cfg/optimize.py +164 -0
- pyflow/analysis/cfg/simplify.py +19 -0
- pyflow/analysis/cfg/ssa.py +693 -0
- pyflow/analysis/cfg/ssatransform.py +13 -0
- pyflow/analysis/cfg/structuralanalysis.py +422 -0
- pyflow/analysis/cfg/transform.py +527 -0
- pyflow/analysis/cpa/__init__.py +657 -0
- pyflow/analysis/cpa/base.py +430 -0
- pyflow/analysis/cpa/codecloner.py +262 -0
- pyflow/analysis/cpa/constraintextractor.py +797 -0
- pyflow/analysis/cpa/constraints.py +1071 -0
- pyflow/analysis/cpa/simpleimagebuilder.py +299 -0
- pyflow/analysis/cpasignature.py +132 -0
- pyflow/analysis/cpg/__init__.py +93 -0
- pyflow/analysis/cpg/build.py +221 -0
- pyflow/analysis/cpg/dump.py +102 -0
- pyflow/analysis/cpg/graph.py +1877 -0
- pyflow/analysis/cpg/persist.py +346 -0
- pyflow/analysis/cpg/profiles.py +286 -0
- pyflow/analysis/cpg/rules.py +365 -0
- pyflow/analysis/cpg/taint.py +1934 -0
- pyflow/analysis/dataflowIR/__init__.py +6 -0
- pyflow/analysis/dataflowIR/annotations.py +174 -0
- pyflow/analysis/dataflowIR/convert.py +795 -0
- pyflow/analysis/dataflowIR/dump.py +443 -0
- pyflow/analysis/dataflowIR/graph.py +1648 -0
- pyflow/analysis/dataflowIR/ordering.py +134 -0
- pyflow/analysis/dataflowIR/predicate.py +233 -0
- pyflow/analysis/dataflowIR/transform/__init__.py +15 -0
- pyflow/analysis/dataflowIR/transform/dce.py +215 -0
- pyflow/analysis/dataflowIR/transform/loadelimination.py +185 -0
- pyflow/analysis/dataflowIR/traverse.py +91 -0
- pyflow/analysis/ddg/__init__.py +53 -0
- pyflow/analysis/ddg/construction.py +310 -0
- pyflow/analysis/ddg/dump.py +218 -0
- pyflow/analysis/ddg/graph.py +295 -0
- pyflow/analysis/dump/__init__.py +15 -0
- pyflow/analysis/dump/dumpgraphs.py +93 -0
- pyflow/analysis/dump/dumpreport.py +841 -0
- pyflow/analysis/dump/dumputil.py +98 -0
- pyflow/analysis/fsdf/__init__.py +1107 -0
- pyflow/analysis/fsdf/canonicalset.py +176 -0
- pyflow/analysis/fsdf/canonicaltree.py +1071 -0
- pyflow/analysis/ifds/__init__.py +284 -0
- pyflow/analysis/ifds/annotation_fallback.py +21 -0
- pyflow/analysis/ifds/annotation_synthesis.py +803 -0
- pyflow/analysis/ifds/api.py +567 -0
- pyflow/analysis/ifds/backward_solver.py +328 -0
- pyflow/analysis/ifds/cfg_adapter.py +1575 -0
- pyflow/analysis/ifds/clients/_call_model.py +166 -0
- pyflow/analysis/ifds/clients/_client_common.py +1617 -0
- pyflow/analysis/ifds/clients/flow_path_collector.py +159 -0
- pyflow/analysis/ifds/clients/library_presets.py +1134 -0
- pyflow/analysis/ifds/clients/nullness.py +754 -0
- pyflow/analysis/ifds/clients/registry/__init__.py +26 -0
- pyflow/analysis/ifds/clients/registry/loader.py +688 -0
- pyflow/analysis/ifds/clients/registry/validate.py +37 -0
- pyflow/analysis/ifds/clients/taint.py +782 -0
- pyflow/analysis/ifds/clients/typestate.py +1550 -0
- pyflow/analysis/ifds/clients/typestate_engine.py +534 -0
- pyflow/analysis/ifds/diagnostics.py +29 -0
- pyflow/analysis/ifds/preparation.py +97 -0
- pyflow/analysis/ifds/problem.py +363 -0
- pyflow/analysis/ifds/queries.py +142 -0
- pyflow/analysis/ifds/reporting.py +289 -0
- pyflow/analysis/ifds/shadow_scan.py +349 -0
- pyflow/analysis/ifds/solver.py +1495 -0
- pyflow/analysis/ifds/supergraph.py +186 -0
- pyflow/analysis/ifds/transfers.py +187 -0
- pyflow/analysis/ipa/__init__.py +77 -0
- pyflow/analysis/ipa/calling/__init__.py +17 -0
- pyflow/analysis/ipa/calling/callbinder.py +93 -0
- pyflow/analysis/ipa/calling/cpa.py +197 -0
- pyflow/analysis/ipa/calling/transfer.py +208 -0
- pyflow/analysis/ipa/constraintextractor.py +804 -0
- pyflow/analysis/ipa/constraints/__init__.py +18 -0
- pyflow/analysis/ipa/constraints/base.py +66 -0
- pyflow/analysis/ipa/constraints/calls.py +424 -0
- pyflow/analysis/ipa/constraints/flow.py +445 -0
- pyflow/analysis/ipa/constraints/node.py +299 -0
- pyflow/analysis/ipa/constraints/qualifiers.py +17 -0
- pyflow/analysis/ipa/constraints/split.py +178 -0
- pyflow/analysis/ipa/dump.py +246 -0
- pyflow/analysis/ipa/entrypointbuilder.py +52 -0
- pyflow/analysis/ipa/escape/__init__.py +19 -0
- pyflow/analysis/ipa/escape/objectescape.py +77 -0
- pyflow/analysis/ipa/ipanalysis.py +319 -0
- pyflow/analysis/ipa/memory/__init__.py +16 -0
- pyflow/analysis/ipa/memory/extractorpolicy.py +38 -0
- pyflow/analysis/ipa/memory/storegraphpolicy.py +17 -0
- pyflow/analysis/ipa/model/__init__.py +18 -0
- pyflow/analysis/ipa/model/context.py +277 -0
- pyflow/analysis/ipa/model/invocation.py +159 -0
- pyflow/analysis/ipa/model/object.py +102 -0
- pyflow/analysis/ipa/model/objectname.py +77 -0
- pyflow/analysis/ipa/model/region.py +51 -0
- pyflow/analysis/ipa/summary/__init__.py +120 -0
- pyflow/analysis/ir_utils.py +215 -0
- pyflow/analysis/lifetimeanalysis/__init__.py +935 -0
- pyflow/analysis/lifetimeanalysis/database/__init__.py +17 -0
- pyflow/analysis/lifetimeanalysis/database/base.py +72 -0
- pyflow/analysis/lifetimeanalysis/database/lattice.py +189 -0
- pyflow/analysis/lifetimeanalysis/database/mapping.py +174 -0
- pyflow/analysis/lifetimeanalysis/database/structure.py +224 -0
- pyflow/analysis/lifetimeanalysis/database/tupleset.py +141 -0
- pyflow/analysis/numbering/__init__.py +17 -0
- pyflow/analysis/numbering/dataflow.py +214 -0
- pyflow/analysis/numbering/dominance.py +120 -0
- pyflow/analysis/numbering/readmodify.py +251 -0
- pyflow/analysis/numbering/ssa.py +604 -0
- pyflow/analysis/pdg/__init__.py +55 -0
- pyflow/analysis/pdg/construction.py +447 -0
- pyflow/analysis/pdg/cypher.py +1150 -0
- pyflow/analysis/pdg/dump.py +129 -0
- pyflow/analysis/pdg/graph.py +308 -0
- pyflow/analysis/programculler.py +224 -0
- pyflow/analysis/shape/__init__.py +466 -0
- pyflow/analysis/shape/constraintbuilder.py +933 -0
- pyflow/analysis/shape/constraints.py +510 -0
- pyflow/analysis/shape/dataflow.py +202 -0
- pyflow/analysis/shape/model/__init__.py +27 -0
- pyflow/analysis/shape/model/canonical.py +137 -0
- pyflow/analysis/shape/model/configuration.py +78 -0
- pyflow/analysis/shape/model/expressions.py +268 -0
- pyflow/analysis/shape/model/pathinformation.py +645 -0
- pyflow/analysis/shape/model/referencecount.py +212 -0
- pyflow/analysis/shape/model/secondary.py +31 -0
- pyflow/analysis/shape/model/slots.py +69 -0
- pyflow/analysis/shape/regionanalysis.py +152 -0
- pyflow/analysis/shape/transferfunctions.py +353 -0
- pyflow/analysis/storegraph/__init__.py +19 -0
- pyflow/analysis/storegraph/annotations.py +70 -0
- pyflow/analysis/storegraph/canonicalobjects.py +329 -0
- pyflow/analysis/storegraph/extendedtypes.py +311 -0
- pyflow/analysis/storegraph/setmanager.py +123 -0
- pyflow/analysis/storegraph/storegraph.py +577 -0
- pyflow/analysis/tools.py +112 -0
- pyflow/analysis/typeinfo/__init__.py +93 -0
- pyflow/analysis/typeinfo/_config.py +84 -0
- pyflow/analysis/typeinfo/annotation_resolver.py +483 -0
- pyflow/analysis/typeinfo/collector.py +361 -0
- pyflow/analysis/typeinfo/constants.py +378 -0
- pyflow/analysis/typeinfo/docstring_parser.py +289 -0
- pyflow/analysis/typeinfo/generic_binder.py +145 -0
- pyflow/analysis/typeinfo/gradual_typing.py +255 -0
- pyflow/analysis/typeinfo/models.py +43 -0
- pyflow/analysis/typeinfo/service.py +774 -0
- pyflow/analysis/typeinfo/string_subtype_inference.py +113 -0
- pyflow/analysis/typeinfo/string_subtypes.py +150 -0
- pyflow/analysis/typeinfo/stub_loader.py +667 -0
- pyflow/analysis/typeinfo/type_inference.py +747 -0
- pyflow/analysis/typeinfo/type_utils.py +361 -0
- pyflow/analysis/typeinfo/typesystem.py +2346 -0
- pyflow/analysis/typeinfo/typetracing.py +672 -0
- pyflow/api/__init__.py +94 -0
- pyflow/api/entrypoints/__init__.py +36 -0
- pyflow/api/entrypoints/declaration.py +345 -0
- pyflow/api/entrypoints/entry_point.py +59 -0
- pyflow/api/entrypoints/wrappers.py +83 -0
- pyflow/api/queries/__init__.py +65 -0
- pyflow/api/queries/_cfg_utils.py +53 -0
- pyflow/api/queries/_dataflow_ipa.py +29 -0
- pyflow/api/queries/_dataflow_reaching_defs.py +105 -0
- pyflow/api/queries/_dataflow_store_graph.py +152 -0
- pyflow/api/queries/_dataflow_taint.py +76 -0
- pyflow/api/queries/_models.py +177 -0
- pyflow/api/queries/call_graph.py +168 -0
- pyflow/api/queries/capabilities.py +106 -0
- pyflow/api/queries/context.py +152 -0
- pyflow/api/queries/control_flow.py +35 -0
- pyflow/api/queries/data_flow.py +157 -0
- pyflow/api/queries/engine.py +201 -0
- pyflow/api/queries/localization.py +8 -0
- pyflow/api/queries/service.py +339 -0
- pyflow/api/queries/tasks/__init__.py +8 -0
- pyflow/api/queries/tasks/code_localization.py +425 -0
- pyflow/api/queries/tasks/test_generation.py +338 -0
- pyflow/api/queries/test_generation.py +8 -0
- pyflow/application/__init__.py +109 -0
- pyflow/application/context.py +116 -0
- pyflow/application/errors.py +55 -0
- pyflow/application/makefile.py +213 -0
- pyflow/application/passes.py +515 -0
- pyflow/application/passmanager.py +755 -0
- pyflow/application/pipeline.py +459 -0
- pyflow/application/program.py +147 -0
- pyflow/checker/__init__.py +51 -0
- pyflow/checker/formatters/__init__.py +14 -0
- pyflow/checker/formatters/json.py +153 -0
- pyflow/checker/formatters/sarif.py +263 -0
- pyflow/checker/formatters/text.py +168 -0
- pyflow/checker/formatters/utils.py +17 -0
- pyflow/checker/llm/__init__.py +19 -0
- pyflow/checker/llm/exploit.py +129 -0
- pyflow/checker/llm/judge.py +105 -0
- pyflow/checker/llm/llm_utils.py +131 -0
- pyflow/checker/microbench.py +338 -0
- pyflow/checker/pattern/__init__.py +14 -0
- pyflow/checker/pattern/checkers/__init__.py +34 -0
- pyflow/checker/pattern/checkers/aws_security.py +234 -0
- pyflow/checker/pattern/checkers/blacklist_calls.py +54 -0
- pyflow/checker/pattern/checkers/blacklist_imports.py +73 -0
- pyflow/checker/pattern/checkers/class_pollution.py +459 -0
- pyflow/checker/pattern/checkers/command_injection.py +340 -0
- pyflow/checker/pattern/checkers/deserialization.py +373 -0
- pyflow/checker/pattern/checkers/django_security.py +285 -0
- pyflow/checker/pattern/checkers/exception_handling.py +317 -0
- pyflow/checker/pattern/checkers/exec_use.py +16 -0
- pyflow/checker/pattern/checkers/fastapi_security.py +291 -0
- pyflow/checker/pattern/checkers/flask_security.py +264 -0
- pyflow/checker/pattern/checkers/hardcoded_password.py +239 -0
- pyflow/checker/pattern/checkers/hardcoded_secrets.py +279 -0
- pyflow/checker/pattern/checkers/ldap_injection.py +281 -0
- pyflow/checker/pattern/checkers/path_traversal.py +124 -0
- pyflow/checker/pattern/checkers/shell_injection.py +46 -0
- pyflow/checker/pattern/checkers/sql_injection.py +170 -0
- pyflow/checker/pattern/checkers/sql_injection_enhanced.py +574 -0
- pyflow/checker/pattern/checkers/ssrf.py +419 -0
- pyflow/checker/pattern/checkers/template_security.py +310 -0
- pyflow/checker/pattern/checkers/weak_crypto.py +89 -0
- pyflow/checker/pattern/checkers/xxe_vulnerabilities.py +155 -0
- pyflow/checker/pattern/core/__init__.py +17 -0
- pyflow/checker/pattern/core/blacklist.py +569 -0
- pyflow/checker/pattern/core/config.py +15 -0
- pyflow/checker/pattern/core/constants.py +52 -0
- pyflow/checker/pattern/core/context.py +276 -0
- pyflow/checker/pattern/core/issue.py +325 -0
- pyflow/checker/pattern/core/manager.py +253 -0
- pyflow/checker/pattern/core/metrics.py +78 -0
- pyflow/checker/pattern/core/node_visitor.py +430 -0
- pyflow/checker/pattern/core/test_loader.py +41 -0
- pyflow/checker/pattern/core/test_properties.py +54 -0
- pyflow/checker/pattern/core/test_set.py +33 -0
- pyflow/checker/pattern/core/tester.py +244 -0
- pyflow/checker/pattern/core/utils.py +167 -0
- pyflow/checker/quality.py +374 -0
- pyflow/checker/semantic/__init__.py +16 -0
- pyflow/checker/semantic/core/__init__.py +23 -0
- pyflow/checker/semantic/core/base.py +26 -0
- pyflow/checker/semantic/core/context.py +270 -0
- pyflow/checker/semantic/core/issue.py +9 -0
- pyflow/checker/semantic/core/manager.py +150 -0
- pyflow/checker/semantic/core/runner.py +58 -0
- pyflow/checker/semantic/detectors/__init__.py +17 -0
- pyflow/checker/semantic/detectors/ast_helpers.py +114 -0
- pyflow/checker/semantic/detectors/leak.py +500 -0
- pyflow/checker/semantic/detectors/null_dereference.py +132 -0
- pyflow/checker/semantic/detectors/semantic_taint.py +2258 -0
- pyflow/checker/supply_chain.py +568 -0
- pyflow/cli/__init__.py +12 -0
- pyflow/cli/alias.py +397 -0
- pyflow/cli/callgraph.py +185 -0
- pyflow/cli/ir.py +461 -0
- pyflow/cli/main.py +125 -0
- pyflow/cli/optimize.py +603 -0
- pyflow/cli/security.py +1262 -0
- pyflow/cli/supply_chain.py +114 -0
- pyflow/config/nullness/django.json +21 -0
- pyflow/config/nullness/fastapi.json +17 -0
- pyflow/config/nullness/flask.json +37 -0
- pyflow/config/nullness/sql.json +21 -0
- pyflow/config/nullness/sqlalchemy.json +33 -0
- pyflow/config/nullness/stdlib.json +161 -0
- pyflow/config/rule-pack.schema.json +54 -0
- pyflow/config/taint/aiohttp.json +640 -0
- pyflow/config/taint/cloud.json +485 -0
- pyflow/config/taint/concurrency.json +25 -0
- pyflow/config/taint/django.json +710 -0
- pyflow/config/taint/falcon.json +375 -0
- pyflow/config/taint/fastapi.json +192 -0
- pyflow/config/taint/flask.json +504 -0
- pyflow/config/taint/injection.json +2294 -0
- pyflow/config/taint/network.json +367 -0
- pyflow/config/taint/nosql.json +166 -0
- pyflow/config/taint/pandas.json +463 -0
- pyflow/config/taint/requests.json +952 -0
- pyflow/config/taint/serialization.json +109 -0
- pyflow/config/taint/sql.json +730 -0
- pyflow/config/taint/sqlalchemy.json +235 -0
- pyflow/config/taint/stdlib.json +4388 -0
- pyflow/config/taint/tornado.json +151 -0
- pyflow/config/taint/xml.json +89 -0
- pyflow/config/typestate/concurrency.json +145 -0
- pyflow/config/typestate/network.json +130 -0
- pyflow/config/typestate/requests.json +88 -0
- pyflow/config/typestate/sql.json +107 -0
- pyflow/config/typestate/sqlalchemy.json +45 -0
- pyflow/config/typestate/stdlib.json +91 -0
- pyflow/config.py +30 -0
- pyflow/frontend/__init__.py +28 -0
- pyflow/frontend/ast_converter.py +2593 -0
- pyflow/frontend/class_hierarchy.py +665 -0
- pyflow/frontend/dependency_resolver.py +1836 -0
- pyflow/frontend/function_extractor.py +602 -0
- pyflow/frontend/object_manager.py +224 -0
- pyflow/frontend/programextractor.py +1033 -0
- pyflow/frontend/project_resolution.py +511 -0
- pyflow/frontend/source_locator.py +163 -0
- pyflow/frontend/stub_manager.py +425 -0
- pyflow/language/__init__.py +5 -0
- pyflow/language/asttools/__init__.py +34 -0
- pyflow/language/asttools/annotation.py +242 -0
- pyflow/language/asttools/antlrtranslator.py +344 -0
- pyflow/language/asttools/astpprint.py +132 -0
- pyflow/language/asttools/complexity.py +224 -0
- pyflow/language/asttools/decorators.py +71 -0
- pyflow/language/asttools/metaast/__init__.py +370 -0
- pyflow/language/asttools/metaast/codegeneration.py +622 -0
- pyflow/language/asttools/origin.py +83 -0
- pyflow/language/asttools/symbols.py +204 -0
- pyflow/language/asttools/visitors.py +179 -0
- pyflow/language/modules/__init__.py +18 -0
- pyflow/language/modules/_scope_graph.py +484 -0
- pyflow/language/modules/ast_helper.py +211 -0
- pyflow/language/modules/module_definitions.py +240 -0
- pyflow/language/modules/project_handler.py +110 -0
- pyflow/language/modules/transform.py +290 -0
- pyflow/language/modules/util.py +413 -0
- pyflow/language/python/__init__.py +21 -0
- pyflow/language/python/annotations.py +378 -0
- pyflow/language/python/ast.py +749 -0
- pyflow/language/python/collapser.py +604 -0
- pyflow/language/python/default_markers.py +8 -0
- pyflow/language/python/defuse.py +469 -0
- pyflow/language/python/fold.py +220 -0
- pyflow/language/python/program.py +371 -0
- pyflow/language/python/pythonbase.py +353 -0
- pyflow/language/python/pythonoutput.py +82 -0
- pyflow/language/python/simplecodegen.py +975 -0
- pyflow/optimization/__init__.py +29 -0
- pyflow/optimization/argumentnormalization.py +429 -0
- pyflow/optimization/callconverter.py +295 -0
- pyflow/optimization/clone.py +743 -0
- pyflow/optimization/codeinlining.py +587 -0
- pyflow/optimization/convertboolelimination.py +111 -0
- pyflow/optimization/cullprogram.py +155 -0
- pyflow/optimization/dataflow/__init__.py +17 -0
- pyflow/optimization/dataflow/base.py +780 -0
- pyflow/optimization/dataflow/forward.py +681 -0
- pyflow/optimization/dataflow/reverse.py +454 -0
- pyflow/optimization/dce.py +354 -0
- pyflow/optimization/fold.py +780 -0
- pyflow/optimization/loadelimination.py +342 -0
- pyflow/optimization/methodcall.py +554 -0
- pyflow/optimization/rewrite.py +129 -0
- pyflow/optimization/simplify.py +143 -0
- pyflow/optimization/storeelimination.py +129 -0
- pyflow/optimization/termrewrite.py +287 -0
- pyflow/stats/__init__.py +436 -0
- pyflow/stubs/__init__.py +34 -0
- pyflow/stubs/__pycache__/__init__.cpython-313.pyc +0 -0
- pyflow/stubs/__pycache__/lltranslator.cpython-313.pyc +0 -0
- pyflow/stubs/__pycache__/stubcollector.cpython-313.pyc +0 -0
- pyflow/stubs/lltranslator.py +493 -0
- pyflow/stubs/std/__init__.py +83 -0
- pyflow/stubs/std/__pycache__/__init__.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/argparse_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/collections_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/container.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/copy_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/csv_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/datetime_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/functools_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/hashlib_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/interpreter.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/io_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/itertools_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/json_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/llfunc.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/logging_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/mathstubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/operator_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/os_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/pathlib_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/pickle_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/random.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/re_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/sampler.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/shutil_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/subprocess_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/sys_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/tempfile_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/threading_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/__pycache__/time_stubs.cpython-313.pyc +0 -0
- pyflow/stubs/std/argparse_stubs.py +200 -0
- pyflow/stubs/std/collections_stubs.py +77 -0
- pyflow/stubs/std/container.py +374 -0
- pyflow/stubs/std/copy_stubs.py +54 -0
- pyflow/stubs/std/csv_stubs.py +187 -0
- pyflow/stubs/std/datetime_stubs.py +70 -0
- pyflow/stubs/std/functools_stubs.py +61 -0
- pyflow/stubs/std/hashlib_stubs.py +198 -0
- pyflow/stubs/std/interpreter.py +360 -0
- pyflow/stubs/std/io_stubs.py +339 -0
- pyflow/stubs/std/itertools_stubs.py +89 -0
- pyflow/stubs/std/json_stubs.py +40 -0
- pyflow/stubs/std/llfunc.py +240 -0
- pyflow/stubs/std/logging_stubs.py +295 -0
- pyflow/stubs/std/mathstubs.py +393 -0
- pyflow/stubs/std/objects/__init__.py +9 -0
- pyflow/stubs/std/objects/__pycache__/__init__.cpython-313.pyc +0 -0
- pyflow/stubs/std/objects/__pycache__/float.cpython-313.pyc +0 -0
- pyflow/stubs/std/objects/__pycache__/int.cpython-313.pyc +0 -0
- pyflow/stubs/std/objects/__pycache__/str.cpython-313.pyc +0 -0
- pyflow/stubs/std/objects/float.py +248 -0
- pyflow/stubs/std/objects/int.py +221 -0
- pyflow/stubs/std/objects/str.py +175 -0
- pyflow/stubs/std/operator_stubs.py +148 -0
- pyflow/stubs/std/os_stubs.py +727 -0
- pyflow/stubs/std/pathlib_stubs.py +364 -0
- pyflow/stubs/std/pickle_stubs.py +97 -0
- pyflow/stubs/std/random.py +29 -0
- pyflow/stubs/std/re_stubs.py +178 -0
- pyflow/stubs/std/sampler.py +17 -0
- pyflow/stubs/std/shutil_stubs.py +212 -0
- pyflow/stubs/std/subprocess_stubs.py +149 -0
- pyflow/stubs/std/sys_stubs.py +226 -0
- pyflow/stubs/std/tempfile_stubs.py +129 -0
- pyflow/stubs/std/threading_stubs.py +328 -0
- pyflow/stubs/std/time_stubs.py +283 -0
- pyflow/stubs/stubcollector.py +463 -0
- pyflow/util/PADS/Automata.py +640 -0
- pyflow/util/PADS/BFS.py +28 -0
- pyflow/util/PADS/Biconnectivity.py +270 -0
- pyflow/util/PADS/Bipartite.py +89 -0
- pyflow/util/PADS/BipartiteMatching.py +129 -0
- pyflow/util/PADS/CardinalityMatching.py +316 -0
- pyflow/util/PADS/Chordal.py +33 -0
- pyflow/util/PADS/CubicHam.py +351 -0
- pyflow/util/PADS/DFS.py +100 -0
- pyflow/util/PADS/Eratosthenes.py +138 -0
- pyflow/util/PADS/GraphExamples.py +36 -0
- pyflow/util/PADS/Graphs.py +82 -0
- pyflow/util/PADS/GrayGraph.py +36 -0
- pyflow/util/PADS/IntegerPartitions.py +317 -0
- pyflow/util/PADS/LCA.py +349 -0
- pyflow/util/PADS/LCS.py +38 -0
- pyflow/util/PADS/LexBFS.py +32 -0
- pyflow/util/PADS/LongestIncreasingSubsequence.py +65 -0
- pyflow/util/PADS/Medium.py +414 -0
- pyflow/util/PADS/MinimumSpanningTree.py +26 -0
- pyflow/util/PADS/OrderedSequence.py +133 -0
- pyflow/util/PADS/PartialCube.py +227 -0
- pyflow/util/PADS/PartialOrder.py +129 -0
- pyflow/util/PADS/PartitionRefinement.py +85 -0
- pyflow/util/PADS/ReadUndirectedGraph.py +431 -0
- pyflow/util/PADS/Repetitivity.py +160 -0
- pyflow/util/PADS/SMAWK.py +190 -0
- pyflow/util/PADS/Sequence.py +118 -0
- pyflow/util/PADS/StrongConnectivity.py +106 -0
- pyflow/util/PADS/Sudoku.py +2028 -0
- pyflow/util/PADS/UnionFind.py +63 -0
- pyflow/util/PADS/Util.py +28 -0
- pyflow/util/PADS/Wrap.py +79 -0
- pyflow/util/PADS/__init__.py +13 -0
- pyflow/util/PADS/xyzGraph.py +127 -0
- pyflow/util/__init__.py +19 -0
- pyflow/util/antlr3/__init__.py +134 -0
- pyflow/util/antlr3/compat.py +12 -0
- pyflow/util/antlr3/constants.py +24 -0
- pyflow/util/antlr3/dfa.py +179 -0
- pyflow/util/antlr3/dottreegen.py +170 -0
- pyflow/util/antlr3/exceptions.py +346 -0
- pyflow/util/antlr3/extras.py +11 -0
- pyflow/util/antlr3/main.py +198 -0
- pyflow/util/antlr3/recognizers.py +1341 -0
- pyflow/util/antlr3/streams.py +1250 -0
- pyflow/util/antlr3/tokens.py +370 -0
- pyflow/util/antlr3/tree.py +2190 -0
- pyflow/util/antlr3/treewizard.py +566 -0
- pyflow/util/application/__init__.py +13 -0
- pyflow/util/application/async_utils.py +101 -0
- pyflow/util/application/compilerexceptions.py +21 -0
- pyflow/util/application/console.py +235 -0
- pyflow/util/application/errorhandler.py +241 -0
- pyflow/util/canonical.py +204 -0
- pyflow/util/debug/__init__.py +11 -0
- pyflow/util/debug/blame.py +94 -0
- pyflow/util/debug/debugger.py +105 -0
- pyflow/util/debug/trace.py +56 -0
- pyflow/util/graphalgorithim/__init__.py +17 -0
- pyflow/util/graphalgorithim/basic.py +77 -0
- pyflow/util/graphalgorithim/color.py +104 -0
- pyflow/util/graphalgorithim/djtree.py +299 -0
- pyflow/util/graphalgorithim/dominator.py +531 -0
- pyflow/util/graphalgorithim/exclusiongraph.py +624 -0
- pyflow/util/graphalgorithim/merge.py +221 -0
- pyflow/util/io/__init__.py +6 -0
- pyflow/util/io/dot.py +540 -0
- pyflow/util/io/filesystem.py +210 -0
- pyflow/util/io/formatting.py +71 -0
- pyflow/util/io/report.py +224 -0
- pyflow/util/io/xmloutput.py +270 -0
- pyflow/util/json_dict.py +92 -0
- pyflow/util/monkeypatch/__init__.py +21 -0
- pyflow/util/monkeypatch/xcollections.py +206 -0
- pyflow/util/monkeypatch/xmath.py +108 -0
- pyflow/util/monkeypatch/xnamedtuple.py +180 -0
- pyflow/util/monkeypatch/xtypes.py +56 -0
- pyflow/util/orderedset.py +420 -0
- pyflow/util/pydot.py +1998 -0
- pyflow/util/python/__init__.py +136 -0
- pyflow/util/python/apply.py +180 -0
- pyflow/util/python/calling.py +558 -0
- pyflow/util/python/opnames.py +153 -0
- pyflow/util/randomness.py +230 -0
- pyflow/util/singleton.py +112 -0
- pyflow/util/tvl.py +321 -0
- pyflow/util/typedispatch.py +342 -0
- pyflow/util/unionfind.py +169 -0
- pyflow_analysis-0.1.0.dist-info/METADATA +184 -0
- pyflow_analysis-0.1.0.dist-info/RECORD +757 -0
- pyflow_analysis-0.1.0.dist-info/WHEEL +5 -0
- pyflow_analysis-0.1.0.dist-info/entry_points.txt +2 -0
- pyflow_analysis-0.1.0.dist-info/licenses/LICENSE.txt +202 -0
- pyflow_analysis-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Standard pass implementations for PyFlow analysis and optimization.
|
|
3
|
+
|
|
4
|
+
This module provides wrapper passes for the existing PyFlow analysis and
|
|
5
|
+
optimization modules, allowing them to work with the new pass manager system.
|
|
6
|
+
Each pass wraps an existing analysis or optimization function and provides
|
|
7
|
+
a standardized interface for the pass manager.
|
|
8
|
+
|
|
9
|
+
**Analysis Passes:**
|
|
10
|
+
- IPA: Inter-procedural analysis for call graphs and contexts
|
|
11
|
+
- CPA: Constraint-based analysis for type and flow constraints
|
|
12
|
+
- Lifetime: Analyzes lifetimes of variables and objects
|
|
13
|
+
|
|
14
|
+
**Optimization Passes:**
|
|
15
|
+
- Method Call: Optimizes method calls and dispatch
|
|
16
|
+
- Simplify: Constant folding, dead code elimination, simplification
|
|
17
|
+
- Clone: Code cloning to separate different invocations
|
|
18
|
+
- Argument Normalization: Normalizes function arguments, eliminates *args, **kwargs
|
|
19
|
+
- Program Culling: Removes dead functions and contexts
|
|
20
|
+
- Store Elimination: Eliminates redundant store operations
|
|
21
|
+
|
|
22
|
+
**Pass Dependencies:**
|
|
23
|
+
The register_standard_passes() function sets up dependencies:
|
|
24
|
+
- CPA depends on IPA
|
|
25
|
+
- Most optimizations depend on CPA
|
|
26
|
+
- Many optimizations depend on Simplify
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from .passmanager import AnalysisPass, OptimizationPass, PassResult, UtilityPass
|
|
30
|
+
from pyflow.analysis import ipa, cpa, lifetimeanalysis
|
|
31
|
+
from pyflow.optimization import (
|
|
32
|
+
methodcall,
|
|
33
|
+
simplify,
|
|
34
|
+
clone,
|
|
35
|
+
argumentnormalization,
|
|
36
|
+
cullprogram,
|
|
37
|
+
codeinlining,
|
|
38
|
+
loadelimination,
|
|
39
|
+
storeelimination,
|
|
40
|
+
dce,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class IPAAnalysisPass(AnalysisPass):
|
|
45
|
+
"""Inter-procedural Analysis (IPA) pass."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, name: str = "ipa", description: str | None = None):
|
|
48
|
+
super().__init__(
|
|
49
|
+
name,
|
|
50
|
+
description or "Inter-procedural analysis for call graphs and contexts",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def run(self, compiler, program) -> PassResult:
|
|
54
|
+
try:
|
|
55
|
+
result = ipa.evaluate(compiler, program)
|
|
56
|
+
program.set_analysis_result(self.name, result)
|
|
57
|
+
return PassResult(success=True, changed=False, data=result)
|
|
58
|
+
except Exception as e:
|
|
59
|
+
return PassResult.from_exception(e)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class CPAAnalysisPass(AnalysisPass):
|
|
63
|
+
"""Constraint Propagation Analysis (CPA) pass."""
|
|
64
|
+
|
|
65
|
+
def __init__(
|
|
66
|
+
self,
|
|
67
|
+
name: str = "cpa",
|
|
68
|
+
*,
|
|
69
|
+
op_path_length: int = 0,
|
|
70
|
+
first_pass: bool = True,
|
|
71
|
+
description: str | None = None,
|
|
72
|
+
):
|
|
73
|
+
super().__init__(
|
|
74
|
+
name,
|
|
75
|
+
description or "Constraint-based analysis for type and flow constraints",
|
|
76
|
+
)
|
|
77
|
+
self.op_path_length = op_path_length
|
|
78
|
+
self.first_pass = first_pass
|
|
79
|
+
|
|
80
|
+
def run(self, compiler, program) -> PassResult:
|
|
81
|
+
try:
|
|
82
|
+
cpa_result = cpa.evaluate(
|
|
83
|
+
compiler,
|
|
84
|
+
program,
|
|
85
|
+
self.op_path_length,
|
|
86
|
+
firstPass=self.first_pass,
|
|
87
|
+
)
|
|
88
|
+
program.set_analysis_result(self.name, cpa_result)
|
|
89
|
+
return PassResult(success=True, changed=False, data=cpa_result)
|
|
90
|
+
except Exception as e:
|
|
91
|
+
return PassResult.from_exception(e)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class LifetimeAnalysisPass(AnalysisPass):
|
|
95
|
+
"""Lifetime analysis pass for variable and object lifetimes."""
|
|
96
|
+
|
|
97
|
+
def __init__(self, name: str = "lifetime", description: str | None = None):
|
|
98
|
+
super().__init__(
|
|
99
|
+
name,
|
|
100
|
+
description or "Analyzes lifetimes of variables and objects",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def run(self, compiler, program) -> PassResult:
|
|
104
|
+
try:
|
|
105
|
+
result = lifetimeanalysis.evaluate(compiler, program)
|
|
106
|
+
program.set_analysis_result(self.name, result)
|
|
107
|
+
return PassResult(success=True, changed=False, data=result)
|
|
108
|
+
except Exception as e:
|
|
109
|
+
return PassResult.from_exception(e)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class HeapAnalysisPass(AnalysisPass):
|
|
113
|
+
"""Heap alias, escape, and points-to analysis pass.
|
|
114
|
+
|
|
115
|
+
Extracts a :class:`PointsToGraph` from the heap abstraction that
|
|
116
|
+
optimization passes (load/store elimination, method devirtualization)
|
|
117
|
+
can consume for alias and escape queries.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
def __init__(self, name: str = "heap", description: str | None = None):
|
|
121
|
+
super().__init__(
|
|
122
|
+
name,
|
|
123
|
+
description or "Heap alias, escape, and points-to analysis",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def run(self, compiler, program) -> PassResult:
|
|
127
|
+
try:
|
|
128
|
+
from pyflow.analysis.alias.flow_sensitive import HeapAnalysis
|
|
129
|
+
|
|
130
|
+
analysis = HeapAnalysis()
|
|
131
|
+
graph = analysis.analyze(compiler, program)
|
|
132
|
+
program.set_analysis_result(self.name, graph)
|
|
133
|
+
return PassResult(success=True, changed=False, data=graph)
|
|
134
|
+
except Exception as e:
|
|
135
|
+
return PassResult.from_exception(e)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class MethodCallOptimizationPass(OptimizationPass):
|
|
139
|
+
"""Method call optimization pass."""
|
|
140
|
+
|
|
141
|
+
def __init__(self):
|
|
142
|
+
super().__init__("methodcall", "Optimizes method calls and dispatch")
|
|
143
|
+
|
|
144
|
+
def run(self, compiler, program) -> PassResult:
|
|
145
|
+
try:
|
|
146
|
+
changed = bool(methodcall.evaluate(compiler, program))
|
|
147
|
+
return PassResult(success=True, changed=changed)
|
|
148
|
+
except Exception as e:
|
|
149
|
+
return PassResult.from_exception(e)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class SimplifyOptimizationPass(OptimizationPass):
|
|
153
|
+
"""Simplification pass for constant folding and DCE."""
|
|
154
|
+
|
|
155
|
+
def __init__(self, name: str = "simplify", description: str | None = None):
|
|
156
|
+
super().__init__(
|
|
157
|
+
name,
|
|
158
|
+
description
|
|
159
|
+
or "Constant folding, dead code elimination, and simplification",
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def run(self, compiler, program) -> PassResult:
|
|
163
|
+
try:
|
|
164
|
+
changed = bool(simplify.evaluate(compiler, program))
|
|
165
|
+
return PassResult(success=True, changed=changed)
|
|
166
|
+
except Exception as e:
|
|
167
|
+
return PassResult.from_exception(e)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class CloneOptimizationPass(OptimizationPass):
|
|
171
|
+
"""Code cloning pass for separating different invocations."""
|
|
172
|
+
|
|
173
|
+
def __init__(self):
|
|
174
|
+
super().__init__("clone", "Separates different invocations of the same code")
|
|
175
|
+
|
|
176
|
+
def run(self, compiler, program) -> PassResult:
|
|
177
|
+
try:
|
|
178
|
+
changed = bool(clone.evaluate(compiler, program))
|
|
179
|
+
return PassResult(success=True, changed=changed)
|
|
180
|
+
except Exception as e:
|
|
181
|
+
return PassResult.from_exception(e)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class ArgumentNormalizationPass(OptimizationPass):
|
|
185
|
+
"""Argument normalization pass."""
|
|
186
|
+
|
|
187
|
+
def __init__(self):
|
|
188
|
+
super().__init__(
|
|
189
|
+
"argument_normalization",
|
|
190
|
+
"Specializes eligible *args when callers are already positionally compatible",
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def run(self, compiler, program) -> PassResult:
|
|
194
|
+
try:
|
|
195
|
+
changed = bool(argumentnormalization.evaluate(compiler, program))
|
|
196
|
+
return PassResult(success=True, changed=changed)
|
|
197
|
+
except Exception as e:
|
|
198
|
+
return PassResult.from_exception(e)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class ProgramCullingPass(OptimizationPass):
|
|
202
|
+
"""Program culling pass to remove dead functions/contexts."""
|
|
203
|
+
|
|
204
|
+
def __init__(self):
|
|
205
|
+
super().__init__("cull_program", "Removes dead functions and contexts")
|
|
206
|
+
|
|
207
|
+
def run(self, compiler, program) -> PassResult:
|
|
208
|
+
try:
|
|
209
|
+
changed = bool(cullprogram.evaluate(compiler, program))
|
|
210
|
+
return PassResult(success=True, changed=changed)
|
|
211
|
+
except Exception as e:
|
|
212
|
+
return PassResult.from_exception(e)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class InliningPass(OptimizationPass):
|
|
216
|
+
"""Experimental code inlining pass."""
|
|
217
|
+
|
|
218
|
+
def __init__(self):
|
|
219
|
+
super().__init__("inlining", "Experimentally inline eligible function calls")
|
|
220
|
+
|
|
221
|
+
def run(self, compiler, program) -> PassResult:
|
|
222
|
+
try:
|
|
223
|
+
changed = bool(codeinlining.evaluate(compiler, program))
|
|
224
|
+
return PassResult(success=True, changed=changed)
|
|
225
|
+
except Exception as e:
|
|
226
|
+
return PassResult.from_exception(e)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class StoreEliminationPass(OptimizationPass):
|
|
230
|
+
"""Store elimination pass."""
|
|
231
|
+
|
|
232
|
+
def __init__(
|
|
233
|
+
self, name: str = "store_elimination", description: str | None = None
|
|
234
|
+
):
|
|
235
|
+
super().__init__(
|
|
236
|
+
name, description or "Eliminates redundant store operations"
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
def run(self, compiler, program) -> PassResult:
|
|
240
|
+
try:
|
|
241
|
+
changed = bool(storeelimination.evaluate(compiler, program))
|
|
242
|
+
return PassResult(success=True, changed=changed)
|
|
243
|
+
except Exception as e:
|
|
244
|
+
return PassResult.from_exception(e)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class LoadEliminationPass(OptimizationPass):
|
|
248
|
+
"""Load elimination pass."""
|
|
249
|
+
|
|
250
|
+
def __init__(self):
|
|
251
|
+
super().__init__("load_elimination", "Eliminates redundant load operations")
|
|
252
|
+
|
|
253
|
+
def run(self, compiler, program) -> PassResult:
|
|
254
|
+
try:
|
|
255
|
+
changed = bool(loadelimination.evaluate(compiler, program))
|
|
256
|
+
return PassResult(success=True, changed=changed)
|
|
257
|
+
except Exception as e:
|
|
258
|
+
return PassResult.from_exception(e)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class DeadCodeEliminationPass(OptimizationPass):
|
|
262
|
+
"""Standalone DCE pass."""
|
|
263
|
+
|
|
264
|
+
def __init__(self):
|
|
265
|
+
super().__init__("dce", "Eliminates dead code without constant folding")
|
|
266
|
+
|
|
267
|
+
def run(self, compiler, program) -> PassResult:
|
|
268
|
+
try:
|
|
269
|
+
changed = bool(dce.evaluate(compiler, program))
|
|
270
|
+
return PassResult(success=True, changed=changed)
|
|
271
|
+
except Exception as e:
|
|
272
|
+
return PassResult.from_exception(e)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class DependencyAnchorPass(UtilityPass):
|
|
276
|
+
"""No-op utility pass used to encode higher-level pipeline stages."""
|
|
277
|
+
|
|
278
|
+
def __init__(self, name: str, description: str):
|
|
279
|
+
super().__init__(name, description)
|
|
280
|
+
|
|
281
|
+
def run(self, compiler, program) -> PassResult:
|
|
282
|
+
return PassResult(success=True, changed=False)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
# Registry of standard passes
|
|
286
|
+
STANDARD_PASSES = {
|
|
287
|
+
"ipa": IPAAnalysisPass,
|
|
288
|
+
"cpa": CPAAnalysisPass,
|
|
289
|
+
"lifetime": LifetimeAnalysisPass,
|
|
290
|
+
"heap": HeapAnalysisPass,
|
|
291
|
+
"methodcall": MethodCallOptimizationPass,
|
|
292
|
+
"simplify": SimplifyOptimizationPass,
|
|
293
|
+
"clone": CloneOptimizationPass,
|
|
294
|
+
"argument_normalization": ArgumentNormalizationPass,
|
|
295
|
+
"cull_program": ProgramCullingPass,
|
|
296
|
+
"inlining": InliningPass,
|
|
297
|
+
"load_elimination": LoadEliminationPass,
|
|
298
|
+
"store_elimination": StoreEliminationPass,
|
|
299
|
+
"dce": DeadCodeEliminationPass,
|
|
300
|
+
"ipa_refresh": lambda: IPAAnalysisPass(
|
|
301
|
+
"ipa_refresh", "Recompute IPA after whole-program transformations"
|
|
302
|
+
),
|
|
303
|
+
"cpa_path_sensitive": lambda: CPAAnalysisPass(
|
|
304
|
+
"cpa_path_sensitive",
|
|
305
|
+
op_path_length=3,
|
|
306
|
+
first_pass=False,
|
|
307
|
+
description="Path-sensitive CPA rerun after first-pass optimizations",
|
|
308
|
+
),
|
|
309
|
+
"lifetime_refresh": lambda: LifetimeAnalysisPass(
|
|
310
|
+
"lifetime_refresh", "Recompute lifetime analysis after path-sensitive CPA"
|
|
311
|
+
),
|
|
312
|
+
"simplify_final": lambda: SimplifyOptimizationPass(
|
|
313
|
+
"simplify_final",
|
|
314
|
+
"Final simplification after path-sensitive CPA",
|
|
315
|
+
),
|
|
316
|
+
"store_elimination_final": lambda: StoreEliminationPass(
|
|
317
|
+
"store_elimination_final",
|
|
318
|
+
"Final dead-store elimination after path-sensitive CPA",
|
|
319
|
+
),
|
|
320
|
+
"first_pass_methodcall": lambda: DependencyAnchorPass(
|
|
321
|
+
"first_pass_methodcall",
|
|
322
|
+
"Dependency anchor for the method-call stage of the first optimization pass",
|
|
323
|
+
),
|
|
324
|
+
"first_pass_lifetime": lambda: DependencyAnchorPass(
|
|
325
|
+
"first_pass_lifetime",
|
|
326
|
+
"Dependency anchor for the lifetime stage of the first optimization pass",
|
|
327
|
+
),
|
|
328
|
+
"first_pass_simplify": lambda: DependencyAnchorPass(
|
|
329
|
+
"first_pass_simplify",
|
|
330
|
+
"Dependency anchor for the simplify stage of the first optimization pass",
|
|
331
|
+
),
|
|
332
|
+
"first_pass_clone": lambda: DependencyAnchorPass(
|
|
333
|
+
"first_pass_clone",
|
|
334
|
+
"Dependency anchor for the clone stage of the first optimization pass",
|
|
335
|
+
),
|
|
336
|
+
"first_pass_argument_normalization": lambda: DependencyAnchorPass(
|
|
337
|
+
"first_pass_argument_normalization",
|
|
338
|
+
"Dependency anchor for the argument normalization stage of the first optimization pass",
|
|
339
|
+
),
|
|
340
|
+
"first_pass_cull_program": lambda: DependencyAnchorPass(
|
|
341
|
+
"first_pass_cull_program",
|
|
342
|
+
"Dependency anchor for the cull-program stage of the first optimization pass",
|
|
343
|
+
),
|
|
344
|
+
"first_pass_store_elimination": lambda: DependencyAnchorPass(
|
|
345
|
+
"first_pass_store_elimination",
|
|
346
|
+
"Dependency anchor for the store-elimination stage of the first optimization pass",
|
|
347
|
+
),
|
|
348
|
+
"first_pass_complete": lambda: DependencyAnchorPass(
|
|
349
|
+
"first_pass_complete",
|
|
350
|
+
"Dependency anchor representing completion of the whole first optimization pass",
|
|
351
|
+
),
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
PASS_ALIASES = {
|
|
355
|
+
"argumentnormalization": "argument_normalization",
|
|
356
|
+
"cullprogram": "cull_program",
|
|
357
|
+
"loadelimination": "load_elimination",
|
|
358
|
+
"storeelimination": "store_elimination",
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def register_standard_passes(pass_manager):
|
|
363
|
+
"""
|
|
364
|
+
Register all standard PyFlow passes with the pass manager.
|
|
365
|
+
|
|
366
|
+
This function:
|
|
367
|
+
1. Registers all standard passes from STANDARD_PASSES
|
|
368
|
+
2. Sets up dependency relationships between passes
|
|
369
|
+
|
|
370
|
+
**Dependency Graph:**
|
|
371
|
+
```
|
|
372
|
+
IPA
|
|
373
|
+
└─> CPA
|
|
374
|
+
└─> [Method Call, Simplify, Clone, Argument Normalization, Program Culling]
|
|
375
|
+
└─> Simplify
|
|
376
|
+
└─> [Clone, Argument Normalization, Program Culling]
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**Dependency Rules:**
|
|
380
|
+
- CPA depends on IPA (needs call graph)
|
|
381
|
+
- Most optimizations depend on CPA (need type/flow information)
|
|
382
|
+
- Many optimizations depend on Simplify (benefit from constant folding/DCE)
|
|
383
|
+
|
|
384
|
+
Args:
|
|
385
|
+
pass_manager: PassManager instance to register passes with
|
|
386
|
+
"""
|
|
387
|
+
for pass_name, pass_class in STANDARD_PASSES.items():
|
|
388
|
+
pass_manager.register_pass(pass_class())
|
|
389
|
+
for alias, target in PASS_ALIASES.items():
|
|
390
|
+
pass_manager.register_alias(alias, target)
|
|
391
|
+
|
|
392
|
+
# Set up dependencies based on the current hardcoded pipeline
|
|
393
|
+
# IPA should run before CPA (CPA needs call graph from IPA).
|
|
394
|
+
# Bug G fix: the original code stored ``ipa_pass = pass_manager.passes["ipa"]``
|
|
395
|
+
# but never used the variable. The dead assignment was harmless but
|
|
396
|
+
# misleading; removed to keep the code clean.
|
|
397
|
+
cpa_pass = pass_manager.passes["cpa"]
|
|
398
|
+
cpa_pass.info.dependencies.add("ipa")
|
|
399
|
+
lifetime_pass = pass_manager.passes["lifetime"]
|
|
400
|
+
lifetime_pass.info.dependencies.add("cpa")
|
|
401
|
+
heap_pass = pass_manager.passes["heap"]
|
|
402
|
+
heap_pass.info.dependencies.add("cpa")
|
|
403
|
+
heap_pass.info.requirements.add("cpa")
|
|
404
|
+
|
|
405
|
+
analysis_passes = {
|
|
406
|
+
"ipa",
|
|
407
|
+
"cpa",
|
|
408
|
+
"lifetime",
|
|
409
|
+
"heap",
|
|
410
|
+
"ipa_refresh",
|
|
411
|
+
"cpa_path_sensitive",
|
|
412
|
+
"lifetime_refresh",
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# CPA should run before most optimizations (optimizations need type/flow info)
|
|
416
|
+
optimization_passes = [
|
|
417
|
+
"methodcall",
|
|
418
|
+
"simplify",
|
|
419
|
+
"clone",
|
|
420
|
+
"argument_normalization",
|
|
421
|
+
"cull_program",
|
|
422
|
+
"inlining",
|
|
423
|
+
"load_elimination",
|
|
424
|
+
"store_elimination",
|
|
425
|
+
"dce",
|
|
426
|
+
]
|
|
427
|
+
# CRITICAL FIX #2: All optimization passes must declare invalidation metadata
|
|
428
|
+
# Without explicit invalidates/preserves, passes rely on conservative fallback
|
|
429
|
+
# that clears all caches. This ensures correctness but is inefficient.
|
|
430
|
+
# Each optimization pass now explicitly declares what it invalidates.
|
|
431
|
+
for opt_name in optimization_passes:
|
|
432
|
+
if opt_name in pass_manager.passes:
|
|
433
|
+
opt_pass = pass_manager.passes[opt_name]
|
|
434
|
+
opt_pass.info.dependencies.add("cpa")
|
|
435
|
+
# All transforming passes invalidate all analysis passes by default
|
|
436
|
+
# Individual passes can override by setting preserves
|
|
437
|
+
opt_pass.info.invalidates.update(analysis_passes)
|
|
438
|
+
|
|
439
|
+
# Simplification should run before many other optimizations
|
|
440
|
+
# (constant folding and DCE enable better optimization)
|
|
441
|
+
simplify_pass = pass_manager.passes["simplify"]
|
|
442
|
+
for opt_name in [
|
|
443
|
+
"clone",
|
|
444
|
+
"argument_normalization",
|
|
445
|
+
"cull_program",
|
|
446
|
+
"inlining",
|
|
447
|
+
"load_elimination",
|
|
448
|
+
"store_elimination",
|
|
449
|
+
]:
|
|
450
|
+
if opt_name in pass_manager.passes:
|
|
451
|
+
opt_pass = pass_manager.passes[opt_name]
|
|
452
|
+
opt_pass.info.dependencies.add("simplify")
|
|
453
|
+
|
|
454
|
+
if "clone" in pass_manager.passes:
|
|
455
|
+
pass_manager.passes["clone"].info.dependencies.add("lifetime")
|
|
456
|
+
pass_manager.passes["clone"].info.requirements.add("lifetime")
|
|
457
|
+
|
|
458
|
+
if "inlining" in pass_manager.passes:
|
|
459
|
+
# Legacy sequencing requires argument normalization before inlining.
|
|
460
|
+
pass_manager.passes["inlining"].info.dependencies.add("argument_normalization")
|
|
461
|
+
|
|
462
|
+
# CRITICAL FIX #1: Store/load elimination require lifetime analysis
|
|
463
|
+
# These passes depend on code.annotation.codeReads and op.annotation.reads/modifies
|
|
464
|
+
# which are populated by lifetime analysis. Without this dependency, they may use
|
|
465
|
+
# stale annotations from a previous lifetime run, causing miscompilation.
|
|
466
|
+
if "store_elimination" in pass_manager.passes:
|
|
467
|
+
pass_manager.passes["store_elimination"].info.dependencies.add("lifetime")
|
|
468
|
+
pass_manager.passes["store_elimination"].info.requirements.add("lifetime")
|
|
469
|
+
if "load_elimination" in pass_manager.passes:
|
|
470
|
+
pass_manager.passes["load_elimination"].info.dependencies.add("lifetime")
|
|
471
|
+
pass_manager.passes["load_elimination"].info.requirements.add("lifetime")
|
|
472
|
+
|
|
473
|
+
pass_manager.passes["first_pass_methodcall"].info.dependencies.add("methodcall")
|
|
474
|
+
pass_manager.passes["first_pass_lifetime"].info.dependencies.update(
|
|
475
|
+
{"first_pass_methodcall", "lifetime"}
|
|
476
|
+
)
|
|
477
|
+
pass_manager.passes["first_pass_simplify"].info.dependencies.update(
|
|
478
|
+
{"first_pass_lifetime", "simplify"}
|
|
479
|
+
)
|
|
480
|
+
pass_manager.passes["first_pass_clone"].info.dependencies.update(
|
|
481
|
+
{"first_pass_simplify", "clone"}
|
|
482
|
+
)
|
|
483
|
+
pass_manager.passes["first_pass_argument_normalization"].info.dependencies.update(
|
|
484
|
+
{"first_pass_clone", "argument_normalization"}
|
|
485
|
+
)
|
|
486
|
+
pass_manager.passes["first_pass_cull_program"].info.dependencies.update(
|
|
487
|
+
{"first_pass_argument_normalization", "cull_program"}
|
|
488
|
+
)
|
|
489
|
+
pass_manager.passes["first_pass_store_elimination"].info.dependencies.update(
|
|
490
|
+
{"first_pass_cull_program", "store_elimination"}
|
|
491
|
+
)
|
|
492
|
+
pass_manager.passes["first_pass_complete"].info.dependencies.add(
|
|
493
|
+
"first_pass_store_elimination"
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
pass_manager.passes["cpa_path_sensitive"].info.dependencies.update(
|
|
497
|
+
{"ipa_refresh", "first_pass_complete"}
|
|
498
|
+
)
|
|
499
|
+
pass_manager.passes["lifetime_refresh"].info.dependencies.add("cpa_path_sensitive")
|
|
500
|
+
pass_manager.passes["simplify_final"].info.dependencies.update(
|
|
501
|
+
{"cpa_path_sensitive", "lifetime_refresh"}
|
|
502
|
+
)
|
|
503
|
+
pass_manager.passes["store_elimination_final"].info.dependencies.update(
|
|
504
|
+
{"simplify_final", "lifetime_refresh"}
|
|
505
|
+
)
|
|
506
|
+
pass_manager.passes["simplify_final"].info.invalidates.update(analysis_passes)
|
|
507
|
+
pass_manager.passes["store_elimination_final"].info.invalidates.update(
|
|
508
|
+
analysis_passes
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
pass_manager._resolve_dependencies()
|
|
512
|
+
|
|
513
|
+
# CRITICAL FIX #2: Validate that all optimization passes have invalidation metadata
|
|
514
|
+
# This must be called AFTER all metadata is configured
|
|
515
|
+
pass_manager.validate_optimization_metadata()
|