Author: Armin Rigo <ar...@tunes.org> Branch: reverse-debugger Changeset: r84959:76bf391f9e87 Date: 2016-06-06 08:32 +0200 http://bitbucket.org/pypy/pypy/changeset/76bf391f9e87/
Log: Renames diff --git a/rpython/config/translationoption.py b/rpython/config/translationoption.py --- a/rpython/config/translationoption.py +++ b/rpython/config/translationoption.py @@ -278,9 +278,9 @@ BoolOption("split_gc_address_space", "Ensure full separation of GC and non-GC pointers", default=False), - BoolOption("reversedb", + BoolOption("reverse_debugger", "Give an executable that writes a log file for reverse debugging", - default=False, cmdline='--reversedb', + default=False, cmdline='--revdb', requires=[('translation.split_gc_address_space', True), ('translation.jit', False)]), ]) diff --git a/rpython/translator/c/database.py b/rpython/translator/c/database.py --- a/rpython/translator/c/database.py +++ b/rpython/translator/c/database.py @@ -33,12 +33,12 @@ thread_enabled=False, sandbox=False, split_gc_address_space=False, - reversedb=False): + reverse_debugger=False): self.translator = translator self.standalone = standalone self.sandbox = sandbox self.split_gc_address_space = split_gc_address_space - self.reversedb = reversedb + self.reverse_debugger = reverse_debugger if gcpolicyclass is None: gcpolicyclass = gc.RefcountingGcPolicy self.gcpolicy = gcpolicyclass(self, thread_enabled) diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py --- a/rpython/translator/c/funcgen.py +++ b/rpython/translator/c/funcgen.py @@ -2,7 +2,6 @@ from rpython.translator.c.support import cdecl from rpython.translator.c.support import llvalue_from_constant, gen_assignments from rpython.translator.c.support import c_string_constant, barebonearray -from rpython.translator.c.primitive import PRIMITIVE_FLOATS, PRIMITIVE_TWO_LONGS from rpython.flowspace.model import Variable, Constant from rpython.rtyper.lltypesystem.lltype import (Ptr, Void, Bool, Signed, Unsigned, SignedLongLong, Float, UnsignedLongLong, Char, UniChar, ContainerType, @@ -425,16 +424,6 @@ def OP_JIT_CONDITIONAL_CALL(self, op): return 'abort(); /* jit_conditional_call */' - def _reverse_db_emit(self, T, value): - if T is Void: - return '/* rpy_reverse_db_emit_void(%s); */' % (value,) - elif T in PRIMITIVE_FLOATS: - return 'rpy_reverse_db_emit_float(%s);' % (value,) - elif T in PRIMITIVE_TWO_LONGS: - return 'rpy_reverse_db_emit_two_longs(%s);' % (value,) - else: - return 'rpy_reverse_db_emit((Signed)%s);' % (value,) - # low-level operations def generic_get(self, op, sourceexpr): T = self.lltypemap(op.result) @@ -442,10 +431,12 @@ result = '%s = %s;' % (newvalue, sourceexpr) if T is Void: result = '/* %s */' % result - if self.db.reversedb: + if self.db.reverse_debugger: S = self.lltypemap(op.args[0]).TO if S._gckind != 'gc' and not S._hints.get('is_excdata'): - result += '\t' + self._reverse_db_emit(T, newvalue) + from rpython.translator.revdb import revdb_genc + result += '\t' + revdb_genc.emit(self.lltypename(op.result), + newvalue) return result def generic_set(self, op, targetexpr): diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py --- a/rpython/translator/c/genc.py +++ b/rpython/translator/c/genc.py @@ -115,8 +115,8 @@ def get_eci(self): pypy_include_dir = py.path.local(__file__).join('..') include_dirs = [pypy_include_dir] - if self.config.translation.reversedb: - include_dirs.append(pypy_include_dir.join('..', 'reversedb')) + if self.config.translation.reverse_debugger: + include_dirs.append(pypy_include_dir.join('..', 'revdb')) return ExternalCompilationInfo(include_dirs=include_dirs) def build_database(self): @@ -136,7 +136,8 @@ sandbox=self.config.translation.sandbox, split_gc_address_space= self.config.translation.split_gc_address_space, - reversedb=self.config.translation.reversedb) + reverse_debugger= + self.config.translation.reverse_debugger) self.db = db # give the gc a chance to register interest in the start-up functions it @@ -218,8 +219,8 @@ defines['COUNT_OP_MALLOCS'] = 1 if self.config.translation.sandbox: defines['RPY_SANDBOXED'] = 1 - if self.config.translation.reversedb: - defines['RPY_REVERSE_DB'] = 1 + if self.config.translation.reverse_debugger: + defines['RPY_REVERSE_DEBUGGER'] = 1 if CBuilder.have___thread is None: CBuilder.have___thread = self.translator.platform.check___thread() if not self.standalone: @@ -846,9 +847,9 @@ ] if _CYGWIN: files.append(srcdir / 'cygwin_wait.c') - if database.reversedb: - from rpython.translator.reversedb import rdb_genc - files += rdb_genc.extra_files() + if database.reverse_debugger: + from rpython.translator.revdb import revdb_genc + files += revdb_genc.extra_files() return eci.merge(ExternalCompilationInfo(separate_module_files=files)) diff --git a/rpython/translator/c/primitive.py b/rpython/translator/c/primitive.py --- a/rpython/translator/c/primitive.py +++ b/rpython/translator/c/primitive.py @@ -223,11 +223,6 @@ Address: name_address, GCREF: name_gcref, } -PRIMITIVE_FLOATS = set([Float, SingleFloat, LongFloat]) -if SignedLongLong is Signed: - PRIMITIVE_TWO_LONGS = set([]) -else: - PRIMITIVE_TWO_LONGS = set([SignedLongLong, UnsignedLongLong]) PrimitiveType = { SignedLongLong: 'long long @', diff --git a/rpython/translator/c/src/entrypoint.c b/rpython/translator/c/src/entrypoint.c --- a/rpython/translator/c/src/entrypoint.c +++ b/rpython/translator/c/src/entrypoint.c @@ -82,7 +82,7 @@ pypy_asm_stack_bottom(); instrument_setup(); -#ifdef RPY_REVERSE_DB +#ifdef RPY_REVERSE_DEBUGGER rpy_reverse_db_setup(argc, argv); #endif diff --git a/rpython/translator/c/src/g_include.h b/rpython/translator/c/src/g_include.h --- a/rpython/translator/c/src/g_include.h +++ b/rpython/translator/c/src/g_include.h @@ -51,6 +51,6 @@ #include "src/cygwin_wait.h" #endif -#ifdef RPY_REVERSE_DB -#include "rdb-src/rdb_include.h" +#ifdef RPY_REVERSE_DEBUGGER +#include "rdb-src/revdb_include.h" #endif diff --git a/rpython/translator/reversedb/__init__.py b/rpython/translator/revdb/__init__.py rename from rpython/translator/reversedb/__init__.py rename to rpython/translator/revdb/__init__.py diff --git a/rpython/translator/reversedb/rdb-src/rdb.c b/rpython/translator/revdb/rdb-src/revdb.c rename from rpython/translator/reversedb/rdb-src/rdb.c rename to rpython/translator/revdb/rdb-src/revdb.c --- a/rpython/translator/reversedb/rdb-src/rdb.c +++ b/rpython/translator/revdb/rdb-src/revdb.c @@ -4,14 +4,14 @@ #include <fcntl.h> #include <unistd.h> -#include "rdb-src/rdb_include.h" +#include "rdb-src/revdb_include.h" #define RDB_SIGNATURE 0x0A424452 /* "RDB\n" */ #define RDB_VERSION 0x00FF0001 -Signed *rpy_rev_buf_p, *rpy_rev_buf_end; -static Signed rpy_rev_buffer[2048]; +rpy_revdb_t rpy_revdb; +static char rpy_rev_buffer[16384]; static int rpy_rev_fileno = -1; @@ -20,30 +20,29 @@ { /* init-time setup */ - char *filename = getenv("PYPYRDB"); + char *filename = getenv("PYPYREVDB"); - rpy_rev_buf_p = rpy_rev_buffer; - rpy_rev_buf_end = rpy_rev_buffer + - sizeof(rpy_rev_buffer) / sizeof(rpy_rev_buffer[0]); + rpy_revdb.buf_p = rpy_rev_buffer; + rpy_revdb.buf_limit = rpy_rev_buffer + sizeof(rpy_rev_buffer) - 32; if (filename && *filename) { - putenv("PYPYRDB="); + putenv("PYPYREVDB="); rpy_rev_fileno = open(filename, O_WRONLY | O_CLOEXEC | O_CREAT | O_NOCTTY | O_TRUNC, 0600); if (rpy_rev_fileno < 0) { - fprintf(stderr, "Fatal error: can't create PYPYRDB file '%s'\n", + fprintf(stderr, "Fatal error: can't create PYPYREVDB file '%s'\n", filename); abort(); } atexit(rpy_reverse_db_flush); } - rpy_reverse_db_emit(RDB_SIGNATURE); - rpy_reverse_db_emit(RDB_VERSION); - rpy_reverse_db_emit(0); - rpy_reverse_db_emit(0); - rpy_reverse_db_emit(argc); - rpy_reverse_db_emit((Signed)argv); + rpy_reverse_db_EMIT(Signed _e=RDB_SIGNATURE); + rpy_reverse_db_EMIT(Signed _e=RDB_VERSION); + rpy_reverse_db_EMIT(Signed _e=0); + rpy_reverse_db_EMIT(Signed _e=0); + rpy_reverse_db_EMIT(Signed _e=argc); + rpy_reverse_db_EMIT(void *_e=argv); } RPY_EXTERN @@ -51,11 +50,11 @@ { /* write the current buffer content to the OS */ - ssize_t size = (rpy_rev_buf_p - rpy_rev_buffer) * sizeof(rpy_rev_buffer[0]); - rpy_rev_buf_p = rpy_rev_buffer; + ssize_t size = rpy_revdb.buf_p - rpy_rev_buffer; + rpy_revdb.buf_p = rpy_rev_buffer; if (size > 0 && rpy_rev_fileno >= 0) { if (write(rpy_rev_fileno, rpy_rev_buffer, size) != size) { - fprintf(stderr, "Fatal error: writing to PYPYRDB file: %m\n"); + fprintf(stderr, "Fatal error: writing to PYPYREVDB file: %m\n"); abort(); } } diff --git a/rpython/translator/reversedb/rdb-src/rdb_include.h b/rpython/translator/revdb/rdb-src/revdb_include.h rename from rpython/translator/reversedb/rdb-src/rdb_include.h rename to rpython/translator/revdb/rdb-src/revdb_include.h --- a/rpython/translator/reversedb/rdb-src/rdb_include.h +++ b/rpython/translator/revdb/rdb-src/revdb_include.h @@ -4,29 +4,12 @@ RPY_EXTERN void rpy_reverse_db_flush(void); -RPY_EXTERN Signed *rpy_rev_buf_p, *rpy_rev_buf_end; +typedef struct { char *buf_p, *buf_limit; } rpy_revdb_t; +RPY_EXTERN rpy_revdb_t rpy_revdb; - -static inline void rpy_reverse_db_emit(Signed value) { - *(rpy_rev_buf_p++) = value; - if (rpy_rev_buf_p == rpy_rev_buf_end) - rpy_reverse_db_flush(); -} - -static inline void rpy_reverse_db_emit_float(double value) { - /* xxx for 'long double' this can loose some precision */ - Signed sval[sizeof(double) / SIZEOF_LONG]; - memcpy(sval, &value, sizeof(value)); - rpy_reverse_db_emit(sval[0]); - if (SIZEOF_LONG < sizeof(double)) /* assume len(sval) is exactly 1 or 2 */ - rpy_reverse_db_emit(sval[1]); -} - -static inline void rpy_reverse_db_emit_two_longs(long long value) -{ - Signed sval[2]; - assert(SIZEOF_LONG * 2 == SIZEOF_LONG_LONG); - memcpy(sval, &value, sizeof(value)); - rpy_reverse_db_emit(sval[0]); - rpy_reverse_db_emit(sval[1]); -} +#define rpy_reverse_db_EMIT(decl_e) do { \ + decl_e; \ + memcpy(rpy_revdb.buf_p, &_e, sizeof(_e)); \ + if ((rpy_revdb.buf_p += sizeof(_e)) > rpy_revdb.buf_limit) \ + rpy_reverse_db_flush(); \ +} while (0) diff --git a/rpython/translator/reversedb/rdb_genc.py b/rpython/translator/revdb/revdb_genc.py rename from rpython/translator/reversedb/rdb_genc.py rename to rpython/translator/revdb/revdb_genc.py --- a/rpython/translator/reversedb/rdb_genc.py +++ b/rpython/translator/revdb/revdb_genc.py @@ -1,7 +1,15 @@ import py +from rpython.rtyper.lltypesystem import lltype, rffi +from rpython.translator.c.support import cdecl + def extra_files(): srcdir = py.path.local(__file__).join('..', 'rdb-src') return [ - srcdir / 'rdb.c', + srcdir / 'revdb.c', ] + +def emit(tp, value): + if tp == 'void @': + return '/* void */' + return 'rpy_reverse_db_EMIT(%s=%s);' % (cdecl(tp, '_e'), value) diff --git a/rpython/translator/reversedb/test/__init__.py b/rpython/translator/revdb/test/__init__.py rename from rpython/translator/reversedb/test/__init__.py rename to rpython/translator/revdb/test/__init__.py diff --git a/rpython/translator/reversedb/test/test_basic.py b/rpython/translator/revdb/test/test_basic.py rename from rpython/translator/reversedb/test/test_basic.py rename to rpython/translator/revdb/test/test_basic.py --- a/rpython/translator/reversedb/test/test_basic.py +++ b/rpython/translator/revdb/test/test_basic.py @@ -3,37 +3,36 @@ import array, struct from rpython.tool.udir import udir from rpython.translator.interactive import Translation +from rpython.rlib.rarithmetic import LONG_BIT class RDB(object): def __init__(self, filename): - f = open(filename, 'rb') - f.seek(0, 2) - filesize = f.tell() - f.seek(0, 0) - self.items = array.array("l") - self.items.fromfile(f, filesize / struct.calcsize("l")) - f.close() + with open(filename, 'rb') as f: + self.buffer = f.read() # - assert self.items[0] == 0x0A424452 - assert self.items[1] == 0x00FF0001 - assert self.items[2] == 0 - assert self.items[3] == 0 - self.argc = self.items[4] - self.argv = self.items[5] - self.cur = 6 + self.cur = 0 + x = self.next(); assert x == 0x0A424452 + x = self.next(); assert x == 0x00FF0001 + x = self.next(); assert x == 0 + x = self.next(); assert x == 0 + self.argc = self.next() + self.argv = self.next() - def next(self): - n = self.cur - self.cur = n + 1 - return self.items[n] + def next(self, mode='P'): + p = self.cur + self.cur = p + struct.calcsize(mode) + return struct.unpack_from(mode, self.buffer, p)[0] + + def done(self): + return self.cur == len(self.buffer) class TestBasic(object): def getcompiled(self, entry_point, argtypes, backendopt=True): t = Translation(entry_point, None, gc="boehm") - t.config.translation.reversedb = True + t.config.translation.reverse_debugger = True t.config.translation.rweakref = False if not backendopt: t.disable(["backendopt_lltype"]) @@ -47,7 +46,7 @@ def run(*argv): env = os.environ.copy() - env['PYPYRDB'] = self.rdbname + env['PYPYREVDB'] = self.rdbname stdout = t.driver.cbuilder.cmdexec(' '.join(argv), env=env) return stdout return run @@ -70,17 +69,17 @@ s = [] # first we determine the length of the "char *p" while True: - c = rdb.next() - if c == 0: + c = rdb.next('c') + if c == '\x00': break - s.append(chr(c)) + s.append(c) # then we really read the "char *" and copy it into a rpy string # (that's why this time we don't read the final \0) for c1 in s: - c2 = rdb.next() - assert c2 == ord(c1) + c2 = rdb.next('c') + assert c2 == c1 got.append(''.join(s)) # that's all that should get from this simple example - assert rdb.cur == len(rdb.items) + assert rdb.done() # assert got == [self.exename, 'abc', 'd'] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit