Skip to main content

module lang::php::analysis::cfg::CFG

rascal-0.40.17
php-analysis-0.2.4

Usage

import lang::php::analysis::cfg::CFG;

Source code

http://github.com/cwi-swat/php-analysis/blob/main/src/main/rascal/lang/php/analysis/cfg/CFG.rsc

Dependencies

import lang::php::ast::AbstractSyntax;
import lang::php::pp::PrettyPrinter;
import lang::php::analysis::cfg::Label;
import lang::php::analysis::cfg::FlowEdge;
import analysis::graphs::Graph;
import Set;
import Node;

data CFG

data CFG  
= cfg(loc item, set[CFGNode] nodes, FlowEdges edges)
| cfg(loc item, set[CFGNode] nodes, FlowEdges edges, CFGNode entryNode, CFGNode exitNode)
| cfg(loc item, set[CFGNode] nodes, FlowEdges edges, loc at)
| cfg(loc item, set[CFGNode] nodes, FlowEdges edges, loc at, CFGNode entryNode, CFGNode exitNode)
;

Representations of the control flow graph

data CFGNode

data CFGNode  
= functionEntry(str functionName, Lab lab)
| functionExit(str functionName, Lab lab)
| methodEntry(str className, str methodName, Lab lab)
| methodExit(str className, str methodName, Lab lab)
| closureEntry(str fileName, int offset, int length, Lab lab)
| closureExit(str fileName, int offset, int length, Lab lab)
| scriptEntry(Lab lab)
| scriptExit(Lab lab)
| stmtNode(Stmt stmt, Lab lab)
| exprNode(Expr expr, Lab lab)
| foreachTest(Expr expr, Lab lab)
| foreachAssignKey(Expr expr, Expr keyExpr, Lab lab)
| foreachAssignValue(Expr expr, Expr valExpr, Lab lab)
| headerNode(Stmt stmt, Lab footer, Lab lab)
| headerNode(Expr expr, Lab footer, Lab lab)
| footerNode(Stmt stmt, Lab header, Lab lab)
| footerNode(Expr expr, Lab header, Lab lab)
| actualProvided(str paramName, bool refAssign, Lab lab)
| actualNotProvided(str paramName, Expr expr, bool refAssign, Lab lab)
;

Control flow graph nodes

alias CFGNodes

set[CFGNode]

function printCFGNode

str printCFGNode(functionEntry(str fn ,_))

str printCFGNode(functionExit(str fn, _))

str printCFGNode(methodEntry(str cn, str mn, _))

str printCFGNode(methodExit(str cn, str mn, _))

str printCFGNode(closureEntry(str fn, int offset, int len, _))

str printCFGNode(closureExit(str fn, int offset, int len, _))

str printCFGNode(scriptEntry(_))

str printCFGNode(scriptExit(_))

str printCFGNode(foreachTest(Expr expr, Lab l))

str printCFGNode(foreachAssignKey(Expr expr, Expr keyExpr, Lab l))

str printCFGNode(foreachAssignValue(Expr expr, Expr valExpr, Lab l))

str printCFGNode(headerNode(Expr e,_,Lab lab))

str printCFGNode(headerNode(Stmt s,_,Lab lab))

str printCFGNode(footerNode(Expr e,_,Lab lab))

str printCFGNode(footerNode(Stmt s,_,Lab lab))

str printCFGNode(stmtNode(Stmt s, Lab lab))

str printCFGNode(exprNode(Expr e, Lab lab))

str printCFGNode(actualProvided(str paramName, bool refAssign, Lab lab))

str printCFGNode(actualNotProvided(str paramName, Expr expr, bool refAssign, Lab lab))

Pretty-print CFG nodes

function cfgAsGraph

Graph[CFGNode] cfgAsGraph(CFG cfg)

Convert the CFG into a Rascal Graph, based on flow edge information

function isEntryNode

bool isEntryNode(CFGNode n)

Given a node, determine if it is an entry node.

function getEntryNode

CFGNode getEntryNode(CFG g)

Get the unique entry node for the CFG.

function isExitNode

bool isExitNode(CFGNode n)

Given a node, determine if it is an exit node.

function getExitNode

CFGNode getExitNode(CFG g)

Get the unique exit node for the CFG.

function getLabelLocationRel

rel[Lab label, loc at] getLabelLocationRel(CFG g)

Get a map from labels to locations.