diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-04-14 20:13:55 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-04-21 11:05:06 +0200 |
| commit | 102ad42976e7fcae3c67a21b61d0fe9294eb1fc4 (patch) | |
| tree | a2059a53e0abed5ff8de66a28efc6dfcde9f1152 /example/disasm/full.py | |
| parent | 9b0ce9e798941e700b166da43e100f04f12df05f (diff) | |
| download | miasm-102ad42976e7fcae3c67a21b61d0fe9294eb1fc4.tar.gz miasm-102ad42976e7fcae3c67a21b61d0fe9294eb1fc4.zip | |
Example: add irblock simplification example
Diffstat (limited to 'example/disasm/full.py')
| -rw-r--r-- | example/disasm/full.py | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/example/disasm/full.py b/example/disasm/full.py index b919310a..33903282 100644 --- a/example/disasm/full.py +++ b/example/disasm/full.py @@ -9,6 +9,7 @@ from miasm2.expression.expression import ExprId from miasm2.core.interval import interval from miasm2.analysis.machine import Machine from miasm2.analysis.data_flow import dead_simp, DiGraphDefUse, ReachingDefinitions +from miasm2.expression.simplifications import expr_simp log = logging.getLogger("dis") console_handler = logging.StreamHandler() @@ -43,7 +44,7 @@ parser.add_argument('-z', "--dis-nulstart-block", action="store_true", parser.add_argument('-l', "--dontdis-retcall", action="store_true", help="If set, disassemble only call destinations") parser.add_argument('-s', "--simplify", action="store_true", - help="Use the liveness analysis pass") + help="Apply simplifications rules (liveness, graph simplification, ...)") parser.add_argument('-o', "--shiftoffset", default=None, type=lambda x: int(x, 0), help="Shift input binary by an offset") @@ -210,7 +211,7 @@ if args.gen_ir: for label, block in ir_arch_a.blocks.iteritems(): print block - if args.simplify: + if args.simplify > 0: dead_simp(ir_arch_a) if args.defuse: @@ -221,3 +222,15 @@ if args.gen_ir: open('graph_irflow.dot', 'w').write(out) out = ir_arch.graph.dot() open('graph_irflow_raw.dot', 'w').write(out) + + if args.simplify > 1: + ir_arch_a.simplify(expr_simp) + modified = True + while modified: + modified = False + modified |= dead_simp(ir_arch_a) + modified |= ir_arch_a.remove_empty_assignblks() + modified |= ir_arch_a.remove_jmp_blocks() + modified |= ir_arch_a.merge_blocks() + + open('graph_irflow_reduced.dot', 'w').write(ir_arch_a.graph.dot()) |