def update_lvalue(new_ir, node, local_variables_instances, all_local_variables_instances, state_variables_instances, all_state_variables_instances): if isinstance(new_ir, OperationWithLValue): lvalue = new_ir.lvalue update_through_ref = False if isinstance(new_ir, (Assignment, Binary)): if isinstance(lvalue, ReferenceVariable): update_through_ref = True while isinstance(lvalue, ReferenceVariable): lvalue = lvalue.points_to if isinstance(lvalue, (LocalIRVariable, StateIRVariable)): if isinstance(lvalue, LocalIRVariable): new_var = LocalIRVariable(lvalue) new_var.index = all_local_variables_instances[ lvalue.name].index + 1 all_local_variables_instances[lvalue.name] = new_var local_variables_instances[lvalue.name] = new_var else: new_var = StateIRVariable(lvalue) new_var.index = all_state_variables_instances[ lvalue.canonical_name].index + 1 all_state_variables_instances[lvalue.canonical_name] = new_var state_variables_instances[lvalue.canonical_name] = new_var if update_through_ref: phi_operation = Phi(new_var, {node}) phi_operation.rvalues = [lvalue] node.add_ssa_ir(phi_operation) if not isinstance(new_ir.lvalue, ReferenceVariable): new_ir.lvalue = new_var else: to_update = new_ir.lvalue while isinstance(to_update.points_to, ReferenceVariable): to_update = to_update.points_to to_update.points_to = new_var
def fix_phi_rvalues_and_storage_ref(node, local_variables_instances, all_local_variables_instances, state_variables_instances, all_state_variables_instances, init_local_variables_instances): for ir in node.irs_ssa: if isinstance(ir, (Phi)) and not ir.rvalues: variables = [last_name(dst, ir.lvalue, init_local_variables_instances) for dst in ir.nodes] ir.rvalues = variables if isinstance(ir, (Phi, PhiCallback)): if isinstance(ir.lvalue, LocalIRVariable): if ir.lvalue.is_storage: l = [v.refers_to for v in ir.rvalues] l = [item for sublist in l for item in sublist] ir.lvalue.refers_to = set(l) if isinstance(ir, (Assignment, Binary)): if isinstance(ir.lvalue, ReferenceVariable): origin = ir.lvalue.points_to_origin if isinstance(origin, LocalIRVariable): if origin.is_storage: for refers_to in origin.refers_to: phi_ir = Phi(refers_to, {node}) phi_ir.rvalues = [origin] node.add_ssa_ir(phi_ir) update_lvalue(phi_ir, node, local_variables_instances, all_local_variables_instances, state_variables_instances, all_state_variables_instances) for succ in node.dominator_successors: fix_phi_rvalues_and_storage_ref(succ, dict(local_variables_instances), all_local_variables_instances, dict(state_variables_instances), all_state_variables_instances, init_local_variables_instances)