about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2020-03-31 20:03:05 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2020-05-04 00:21:44 +0200
commit96e686195bbf982e830584f517bbe4201c6890d9 (patch)
treeeec56495c881e1e515bee9350060669a91941987
parent257d63333ea152bdc55f954481fe846651faffe7 (diff)
downloadmiasm-96e686195bbf982e830584f517bbe4201c6890d9.tar.gz
miasm-96e686195bbf982e830584f517bbe4201c6890d9.zip
Clean undefined
Diffstat (limited to '')
-rw-r--r--miasm/analysis/data_flow.py30
1 files changed, 18 insertions, 12 deletions
diff --git a/miasm/analysis/data_flow.py b/miasm/analysis/data_flow.py
index 12474f9b..bc6eab47 100644
--- a/miasm/analysis/data_flow.py
+++ b/miasm/analysis/data_flow.py
@@ -15,7 +15,7 @@ from miasm.expression.expression_helper import possible_values
 from miasm.analysis.ssa import get_phi_sources_parent_block, \
     irblock_has_phi
 from miasm.ir.symbexec import get_expr_base_offset
-
+from collections import deque
 
 class ReachingDefinitions(dict):
     """
@@ -1940,7 +1940,8 @@ class State(object):
             if self.may_interfer(dsts, node):
                 # Interfer with known equivalence class
                 self.equivalence_classes.del_element(node)
-                self.undefined.add(node)
+                if node.is_id() or node.is_mem():
+                    self.undefined.add(node)
 
 
         # Update equivalence classes
@@ -1953,13 +1954,15 @@ class State(object):
                     to_del.add(node)
             for node in to_del:
                 self.equivalence_classes.del_element(node)
-                self.undefined.add(node)
+                if node.is_id() or node.is_mem():
+                    self.undefined.add(node)
 
             # Don't create equivalence if self interfer
             if self.may_interfer(dsts, src):
                 if dst in self.equivalence_classes.nodes():
                     self.equivalence_classes.del_element(dst)
-                    self.undefined.add(dst)
+                    if dst.is_id() or dst.is_mem():
+                        self.undefined.add(dst)
                 continue
 
             if not self.propagation_allowed(src):
@@ -2017,7 +2020,6 @@ class State(object):
                 if len(common) == 1:
                     if node.is_id() or node.is_mem():
                         assert(node not in nodes_ok)
-
                         undefined.add(node)
                         component2.discard(common.pop())
                     continue
@@ -2071,6 +2073,7 @@ class State(object):
 
         return state
 
+
 class PropagateExpressions(object):
     """
     Propagate expressions
@@ -2107,10 +2110,10 @@ class PropagateExpressions(object):
 
         prev_states = []
         for predecessor in ircfg.predecessors(loc_key):
-            prev_states.append(states[predecessor])
+            prev_states.append((predecessor, states[predecessor]))
 
         filtered_prev_states = []
-        for prev_state in prev_states:
+        for (_, prev_state) in prev_states:
             if prev_state is not None:
                 filtered_prev_states.append(prev_state)
 
@@ -2141,7 +2144,6 @@ class PropagateExpressions(object):
         for index, assignblock in enumerate(irblock):
             if not assignblock.items():
                 continue
-
             new_assignblk = state.eval_assignblock(assignblock)
             new_assignblocks.append(new_assignblk)
             if new_assignblk != assignblock:
@@ -2162,16 +2164,18 @@ class PropagateExpressions(object):
         for loc_key, irblock in irblocks.items():
             states[loc_key] = None
 
-        todo = set([head])
+        todo = deque([head])
         while todo:
-            loc_key = todo.pop()
+            loc_key = todo.popleft()
             irblock = irblocks.get(loc_key)
             if irblock is None:
                 continue
 
             state_orig = states[loc_key]
             state = self.merge_prev_states(ircfg, states, loc_key)
-            new_irblock, _ = self.update_state(irblock, state)
+            state = state.copy()
+
+            new_irblock, modified_irblock = self.update_state(irblock, state)
             if (
                     state_orig is not None and
                     state.equivalence_classes == state_orig.equivalence_classes and
@@ -2179,9 +2183,11 @@ class PropagateExpressions(object):
             ):
                 continue
 
+
             states[loc_key] = state
             # Propagate to sons
-            todo.update(ircfg.successors(loc_key))
+            for successor in ircfg.successors(loc_key):
+                todo.append(successor)
 
         # Update blocks
         todo = set(loc_key for loc_key in irblocks)