[pypy-commit] pypy stm: Adding a libitm wrapper. Not used so far, and crashes anyway
arigo
noreply at buildbot.pypy.org
Sat Jan 21 17:56:34 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm
Changeset: r51591:bee9a6779dd0
Date: 2012-01-21 17:56 +0100
http://bitbucket.org/pypy/pypy/changeset/bee9a6779dd0/
Log: Adding a libitm wrapper. Not used so far, and crashes anyway
because libitm doesn't expect _ITM_RU?() calls when not in a
transaction at all.
diff --git a/pypy/translator/stm/using_libitm/stm2itm.h b/pypy/translator/stm/using_libitm/stm2itm.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/stm/using_libitm/stm2itm.h
@@ -0,0 +1,74 @@
+#include <stdlib.h>
+#include <assert.h>
+#include <libitm.h>
+
+
+static void stm_descriptor_init(void) { /* nothing */ }
+static void stm_descriptor_done(void) { /* nothing */ }
+
+static void* stm_perform_transaction(void*(*f)(void*), void* arg)
+{
+ void *result;
+ int _i = _ITM_beginTransaction(pr_instrumentedCode);
+ assert(_i & a_runInstrumentedCode);
+ /**/
+ result = f(arg);
+ /**/
+ _ITM_commitTransaction();
+ return result;
+}
+
+#define STM_CCHARP1(arg) void
+#define STM_EXPLAIN1(info) /* nothing */
+
+static void stm_try_inevitable(STM_CCHARP1(why))
+{
+ _ITM_changeTransactionMode(modeSerialIrrevocable);
+}
+
+static void stm_abort_and_retry(void)
+{
+ abort(); /* XXX */
+}
+
+static long stm_debug_get_state(void)
+{
+ return _ITM_inTransaction();
+}
+
+
+#if PYPY_LONG_BIT == 32
+# define stm_read_word(addr) _ITM_RU4(addr)
+# define stm_write_word(addr, val) _ITM_WU4(addr, val)
+#else
+# define stm_read_word(addr) _ITM_RU8(addr)
+# define stm_write_word(addr, val) _ITM_WU8(addr, val)
+#endif
+
+// XXX little-endian only!
+/* this macro is used if 'base' is a word-aligned pointer and 'offset'
+ is a compile-time constant */
+#define stm_fx_read_partial(base, offset) \
+ (stm_read_word( \
+ (long*)(((char*)(base)) + ((offset) & ~(sizeof(void*)-1)))) \
+ >> (8 * ((offset) & (sizeof(void*)-1))))
+
+#define stm_read_partial_1(addr) _ITM_RU1(addr)
+#define stm_read_partial_2(addr) _ITM_RU2(addr)
+#define stm_write_partial_1(addr, nval) _ITM_WU1(addr, nval)
+#define stm_write_partial_2(addr, nval) _ITM_WU2(addr, nval)
+#if PYPY_LONG_BIT == 64
+#define stm_read_partial_4(addr) _ITM_RU4(addr)
+#define stm_write_partial_4(addr, nval) _ITM_WU4(addr, nval)
+#endif
+
+#define stm_read_double(addr) _ITM_RD(addr)
+#define stm_write_double(addr, val) _ITM_WD(addr, val)
+
+#define stm_read_float(addr) _ITM_RF(addr)
+#define stm_write_float(addr, val) _ITM_WF(addr, val)
+
+#if PYPY_LONG_BIT == 32
+#define stm_read_doubleword(addr) _ITM_RU8(addr)
+#define stm_write_doubleword(addr, val) _ITM_WU8(addr, val)
+#endif
More information about the pypy-commit
mailing list