[文档]classGraphDephication(DephicationBase):# pylint:disable=abstract-method""" GraphDephication removes phi expressions from an AIL graph, essentially transforms a partial-SSA form of AIL graph to a normal AIL graph. """
[文档]def__init__(self,func:Function|str,ail_graph,vvar_to_vvar_mapping:dict[int,int]|None=None,rewrite:bool=False,):""" :param func: The subject of the analysis: a function, or a single basic block :param ail_graph: The AIL graph to transform. """self._graph=ail_graphsuper().__init__(func,vvar_to_vvar_mapping=vvar_to_vvar_mapping,rewrite=rewrite)self._analyze()
def_collect_phi_assignments(self)->dict[int,set[int]]:g=self._graphphi_to_src=defaultdict(set)forblocking:forstmtinblock.statements:ifisinstance(stmt,Assignment)andisinstance(stmt.dst,VirtualVariable)andisinstance(stmt.src,Phi):for_,vvarinstmt.src.src_and_vvars:ifvvarisNone:l.debug("Invalid vvar None found in %r.src.src_and_vvars.",stmt)else:phi_to_src[stmt.dst.varid].add(vvar.varid)returnphi_to_srcdef_rewrite_container(self)->networkx.DiGraph:# replace all vvars with phi variables in the graphrewriter=GraphRewritingAnalysis(self.project,self._function,self._graph,self.vvar_to_vvar_mapping)returnrewriter.out_graph