about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCamille Mougey <camille.mougey@cea.fr>2014-12-16 17:47:21 +0100
committerCamille Mougey <camille.mougey@cea.fr>2014-12-16 17:47:21 +0100
commitdf0738328cbab62fd9c27a451079de6a73ef914e (patch)
treea0caa1b0fb8b6ef663c80d121a91055a532809d0
parent68ef4936f35c50a85b318f1f569f67089a1f7c82 (diff)
downloadmiasm-df0738328cbab62fd9c27a451079de6a73ef914e.tar.gz
miasm-df0738328cbab62fd9c27a451079de6a73ef914e.zip
IR/Translators: Introduce Miasm translator, to get an IR building expression
-rw-r--r--miasm2/ir/translators/__init__.py1
-rw-r--r--miasm2/ir/translators/miasm.py51
2 files changed, 52 insertions, 0 deletions
diff --git a/miasm2/ir/translators/__init__.py b/miasm2/ir/translators/__init__.py
index 0d768b57..443ba463 100644
--- a/miasm2/ir/translators/__init__.py
+++ b/miasm2/ir/translators/__init__.py
@@ -1,5 +1,6 @@
 """IR Translators"""
 from miasm2.ir.translators.C import *
 from miasm2.ir.translators.python import *
+from miasm2.ir.translators.miasm import *
 
 __all__ = ["Translator"]
diff --git a/miasm2/ir/translators/miasm.py b/miasm2/ir/translators/miasm.py
new file mode 100644
index 00000000..8f61fa96
--- /dev/null
+++ b/miasm2/ir/translators/miasm.py
@@ -0,0 +1,51 @@
+from miasm2.ir.translators.translator import Translator
+
+
+class TranslatorMiasm(Translator):
+    "Translate a Miasm expression to its Python building form"
+
+    __LANG__ = "Miasm"
+
+    @classmethod
+    def from_ExprId(cls, expr):
+        return "ExprId(%s, size=%d)" % (repr(expr.name), expr.size)
+
+    @classmethod
+    def from_ExprInt(cls, expr):
+        return "ExprInt_fromsize(%d, 0x%x)" % (expr.size, int(expr.arg))
+
+    @classmethod
+    def from_ExprCond(cls, expr):
+        return "ExprCond(%s, %s, %s)" % (cls.from_expr(expr.cond),
+                                         cls.from_expr(expr.src1),
+                                         cls.from_expr(expr.src2))
+
+    @classmethod
+    def from_ExprSlice(cls, expr):
+        return "ExprSlice(%s, %d, %d)" % (cls.from_expr(expr.arg),
+                                          expr.start,
+                                          expr.stop)
+
+    @classmethod
+    def from_ExprOp(cls, expr):
+        return "ExprOp(%s, %s)" % (repr(expr.op),
+                                   ", ".join(map(cls.from_expr, expr.args)))
+
+    @classmethod
+    def from_ExprCompose(cls, expr):
+        args = ["(%s, %d, %d)" % (cls.from_expr(arg), start, stop)
+                for arg, start, stop in expr.args]
+        return "ExprCompose([%s])" % ", ".join(args)
+
+    @classmethod
+    def from_ExprAff(cls, expr):
+        return "ExprAff(%s, %s)" % (cls.from_expr(expr.dst),
+                                    cls.from_expr(expr.src))
+
+    @classmethod
+    def from_ExprMem(cls, expr):
+        return "ExprMem(%s, size=%d)" % (cls.from_expr(expr.arg), expr.size)
+
+
+# Register the class
+Translator.register(TranslatorMiasm)