about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCamille Mougey <commial@gmail.com>2019-01-30 19:24:47 +0100
committerGitHub <noreply@github.com>2019-01-30 19:24:47 +0100
commit099576fba1a6ee7db63ba69e3fa484b507d4a785 (patch)
treeec0811d6774d7c068b948581640e2edc3b4dadea
parent98f54e1cff3b80d2c0c14ed0424b90bfe9112680 (diff)
parentc6699e063731b48ddfd1064bf912d80471fc1a26 (diff)
downloadmiasm-099576fba1a6ee7db63ba69e3fa484b507d4a785.tar.gz
miasm-099576fba1a6ee7db63ba69e3fa484b507d4a785.zip
Merge pull request #946 from serpilliere/fix_armt_itt_flags
Armt: fix flags update in ITT blocks
-rw-r--r--miasm2/arch/arm/sem.py39
1 files changed, 38 insertions, 1 deletions
diff --git a/miasm2/arch/arm/sem.py b/miasm2/arch/arm/sem.py
index 64403206..3e017d1f 100644
--- a/miasm2/arch/arm/sem.py
+++ b/miasm2/arch/arm/sem.py
@@ -1754,15 +1754,52 @@ class ir_arml(IntermediateRepresentation):
 
             irblocks.append(irblock)
 
+            it_instr_irblocks = []
             assignments = []
             loc = loc_do
+
             split = self.add_instr_to_current_state(
                 instr, block, assignments,
-                irblocks, gen_pc_updt
+                it_instr_irblocks, gen_pc_updt
             )
             if split:
                 raise NotImplementedError("Unsupported instr in IT block (%s)" % instr)
 
+            if it_instr_irblocks:
+                assert len(it_instr_irblocks) == 1
+                it_instr_irblocks = it_instr_irblocks.pop()
+            # Remove flags assignment if instr != [CMP, CMN, TST]
+            if instr.name not in ["CMP", "CMN", "TST"]:
+                # Fix assignments
+                out = []
+                for assignment in assignments:
+                    assignment = AssignBlock(
+                        {
+                            dst:src for (dst, src) in assignment.iteritems()
+                            if dst not in [zf, nf, of, cf]
+                        },
+                        assignment.instr
+                    )
+                    out.append(assignment)
+                assignments = out
+                # Fix extra irblocksx
+                new_irblocks = []
+                for irblock in it_instr_irblocks:
+                    out = []
+                    for tmp_assignment in irblock:
+                        assignment = AssignBlock(
+                            {
+                                dst:src for (dst, src) in assignment.iteritems()
+                                if dst not in [zf, nf, of, cf]
+                            },
+                            assignment.instr
+                        )
+                        out.append(assignment)
+                    new_irblock = IRBlock(irblock.loc_key, out)
+                    new_irblocks.append(new_irblock)
+                it_instr_irblocks = new_irblocks
+
+            irblocks += it_instr_irblocks
             dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32))
             dst_blk = AssignBlock([dst], instr)
             assignments.append(dst_blk)