(self, block_addr, *variables)
return a
Create a phi variable for variables at block `block_addr`.

        :param int block_addr:  The address of the current block.
        :param variables:       Variables that the phi variable represents.
        :return:                The created phi variable.
Create a phi variable for variables at block `block_addr`.
Create a phi variable for variables at block block_addr .
def make_phi_node(self, block_addr, *variables):
        """
        Create a phi variable for variables at block `block_addr`.

        :param int block_addr:  The address of the current block.
        :param variables:       Variables that the phi variable represents.
        :return:                The created phi variable.
        """

        existing_phis = set()
        non_phis = set()
        for var in variables:
            if self.is_phi_variable(var):
                existing_phis.add(var)
            else:
                non_phis.add(var)
        if len(existing_phis) == 1:
            existing_phi = next(iter(existing_phis))
            if non_phis.issubset(self.get_phi_subvariables(existing_phi)):
                return existing_phi
            else:
                # Update phi variables
                self._phi_variables[existing_phi] |= non_phis
                return existing_phi

        repre = next(iter(variables))
        repre_type = type(repre)
        if repre_type is SimRegisterVariable:
            ident_sort = 'register'
            a = SimRegisterVariable(repre.reg, repre.size, ident=self.next_variable_ident(ident_sort))
        elif repre_type is SimMemoryVariable:
            ident_sort = 'global'
            a = SimMemoryVariable(repre.addr, repre.size, ident=self.next_variable_ident(ident_sort))
        elif repre_type is SimStackVariable:
            ident_sort = 'stack'
            a = SimStackVariable(repre.offset, repre.size, ident=self.next_variable_ident(ident_sort))
        else:
            raise TypeError('make_phi_node(): Unsupported variable type "%s".' % type(repre))

        # Keep a record of all phi variables
        self._phi_variables[a] = set(variables)
        self._phi_variables_by_block[block_addr].add(a)

        return a
def make_phi_node ( self , block_addr , * variables ) : existing_phis = set ( ) non_phis = set ( ) for var in variables : if self . is_phi_variable ( var ) : existing_phis . add ( var ) else : non_phis . add ( var ) if len ( existing_phis ) == 1 : existing_phi = next ( iter ( existing_phis ) ) if non_phis . issubset ( self . get_phi_subvariables ( existing_phi ) ) : return existing_phi else : # Update phi variables self . _phi_variables [ existing_phi ] |= non_phis return existing_phi repre = next ( iter ( variables ) ) repre_type = type ( repre ) if repre_type is SimRegisterVariable : ident_sort = 'register' a = SimRegisterVariable ( repre . reg , repre . size , ident = self . next_variable_ident ( ident_sort ) ) elif repre_type is SimMemoryVariable : ident_sort = 'global' a = SimMemoryVariable ( repre . addr , repre . size , ident = self . next_variable_ident ( ident_sort ) ) elif repre_type is SimStackVariable : ident_sort = 'stack' a = SimStackVariable ( repre . offset , repre . size , ident = self . next_variable_ident ( ident_sort ) ) else : raise TypeError ( 'make_phi_node(): Unsupported variable type "%s".' % type ( repre ) ) # Keep a record of all phi variables self . _phi_variables [ a ] = set ( variables ) self . _phi_variables_by_block [ block_addr ] . add ( a ) return a