[pypy-commit] pypy ppc-jit-backend: forgot to add files ...

hager noreply at buildbot.pypy.org
Mon Mar 5 15:38:09 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53230:325d681c61c2
Date: 2012-03-05 06:36 -0800
http://bitbucket.org/pypy/pypy/changeset/325d681c61c2/

Log:	forgot to add files ...

diff --git a/pypy/jit/backend/ppc/tool/__init__.py b/pypy/jit/backend/ppc/tool/__init__.py
new file mode 100644
diff --git a/pypy/jit/backend/ppc/tool/viewcode.py b/pypy/jit/backend/ppc/tool/viewcode.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/backend/ppc/tool/viewcode.py
@@ -0,0 +1,86 @@
+
+#!/usr/bin/env python
+"""
+Try:
+    ./viewcode.py file.asm
+    ./viewcode.py --decode dumpfile
+"""
+import os, sys, py
+import subprocess
+
+def machine_code_dump(data, originaddr, backend_name, label_list=None):
+    assert backend_name in ["ppc", "ppc_64"]
+    tmpfile = get_tmp_file()
+    objdump  = "objdump -EB -D --target=binary --adjust-vma=%(origin)d "
+    objdump += "--architecture=powerpc %(file)s"
+    #
+    f = open(tmpfile, 'wb')
+    f.write(data)
+    f.close()
+    p = subprocess.Popen(objdump % {
+        'file': tmpfile,
+        'origin': originaddr,
+    }, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = p.communicate()
+    assert not p.returncode, ('Encountered an error running objdump: %s' %
+                              stderr)
+    # drop some objdump cruft
+    lines = stdout.splitlines(True)[6:]     # drop some objdump cruft
+    return format_code_dump_with_labels(originaddr, lines, label_list)
+
+def format_code_dump_with_labels(originaddr, lines, label_list):
+    from pypy.rlib.rarithmetic import r_uint
+    if not label_list:
+        label_list = []
+    originaddr = r_uint(originaddr)
+    itlines = iter(lines)
+    yield itlines.next() # don't process the first line
+    for lbl_start, lbl_name in label_list:
+        for line in itlines:
+            addr, _ = line.split(':', 1)
+            addr = int(addr, 16)
+            if addr >= originaddr+lbl_start:
+                yield '\n'
+                if lbl_name is None:
+                    yield '--end of the loop--\n'
+                else:
+                    yield str(lbl_name) + '\n'
+                yield line
+                break
+            yield line
+    # yield all the remaining lines
+    for line in itlines:
+        yield line
+
+def objdump(input):
+    os.system("objdump -EB -D --target=binary --architecture=powerpc %s" % input)
+
+
+def get_tmp_file():
+    # don't use pypy.tool.udir here to avoid removing old usessions which
+    # might still contain interesting executables
+    udir = py.path.local.make_numbered_dir(prefix='viewcode-', keep=2)
+    tmpfile = str(udir.join('dump.tmp'))
+    return tmpfile
+
+def decode(source):
+    with open(source, 'r') as f:
+        data = f.read().strip()
+        data = data.decode('hex')
+
+    target = get_tmp_file()
+    with open(target, 'wb') as f:
+        f.write(data)
+    return target
+
+
+if __name__ == '__main__':
+    if len(sys.argv) == 2:
+        objdump(sys.argv[1])
+    elif len(sys.argv) == 3:
+        assert sys.argv[1] == '--decode'
+        f = decode(sys.argv[2])
+        objdump(f)
+    else:
+        print >> sys.stderr, __doc__
+        sys.exit(2)


More information about the pypy-commit mailing list