[pypy-commit] pypy stmgc-c7: import stmgc/c7 use-gcc, and use 'gcc-seg-gs'
arigo
noreply at buildbot.pypy.org
Sun May 24 14:14:38 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r77512:4d93e7a10f91
Date: 2015-05-24 14:14 +0200
http://bitbucket.org/pypy/pypy/changeset/4d93e7a10f91/
Log: import stmgc/c7 use-gcc, and use 'gcc-seg-gs'
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
@@ -439,7 +439,7 @@
exe_name = targetdir.join(exe_name)
kwds = {}
if self.config.translation.stm:
- kwds['cc'] = 'clang' # force the use of clang
+ kwds['cc'] = 'gcc-seg-gs' # use the custom patched version of gcc
mk = self.translator.platform.gen_makefile(
cfiles, self.eci,
path=targetdir, exe_name=exe_name,
diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-84157d77ae80
+a23e1117adb9
diff --git a/rpython/translator/stm/src_stm/stm/core.c b/rpython/translator/stm/src_stm/stm/core.c
--- a/rpython/translator/stm/src_stm/stm/core.c
+++ b/rpython/translator/stm/src_stm/stm/core.c
@@ -45,7 +45,6 @@
#endif
}
-__attribute__((always_inline))
static void write_slowpath_overflow_obj(object_t *obj, bool mark_card)
{
/* An overflow object is an object from the same transaction, but
@@ -79,7 +78,6 @@
}
}
-__attribute__((always_inline))
static void write_slowpath_common(object_t *obj, bool mark_card)
{
assert(_seems_to_be_running_transaction());
@@ -223,6 +221,7 @@
check_flag_write_barrier(obj);
}
+__attribute__((flatten))
void _stm_write_slowpath(object_t *obj)
{
write_slowpath_common(obj, /*mark_card=*/false);
@@ -241,6 +240,7 @@
return (size >= _STM_MIN_CARD_OBJ_SIZE);
}
+__attribute__((flatten))
char _stm_write_slowpath_card_extra(object_t *obj)
{
/* the PyPy JIT calls this function directly if it finds that an
diff --git a/rpython/translator/stm/src_stm/stm/fprintcolor.c b/rpython/translator/stm/src_stm/stm/fprintcolor.c
--- a/rpython/translator/stm/src_stm/stm/fprintcolor.c
+++ b/rpython/translator/stm/src_stm/stm/fprintcolor.c
@@ -1,8 +1,10 @@
/* Imported by rpython/translator/stm/import_stmgc.py */
+#include <stdarg.h>
/* ------------------------------------------------------------ */
#ifdef STM_DEBUGPRINT
/* ------------------------------------------------------------ */
+
static int threadcolor_printf(const char *format, ...)
{
char buffer[2048];
diff --git a/rpython/translator/stm/src_stm/stmgc.h b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -20,7 +20,15 @@
#endif
-#define TLPREFIX __attribute__((address_space(256)))
+#ifdef __SEG_GS /* on a custom patched gcc */
+# define TLPREFIX __seg_gs
+# define _STM_RM_SUFFIX :8
+#elif defined(__clang__) /* on a clang, hopefully made bug-free */
+# define TLPREFIX __attribute__((address_space(256)))
+# define _STM_RM_SUFFIX /* nothing */
+#else
+# error "needs either a GCC with __seg_gs support, or a bug-freed clang"
+#endif
typedef TLPREFIX struct object_s object_t;
typedef TLPREFIX struct stm_segment_info_s stm_segment_info_t;
@@ -34,11 +42,11 @@
'STM_SEGMENT->transaction_read_version' if and only if the
object was read in the current transaction. The nurseries
also have corresponding read markers, but they are never used. */
- uint8_t rm;
+ unsigned char rm _STM_RM_SUFFIX;
};
struct stm_segment_info_s {
- uint8_t transaction_read_version;
+ unsigned int transaction_read_version;
int segment_num;
char *segment_base;
stm_char *nursery_current;
@@ -288,6 +296,7 @@
#define STM_PUSH_ROOT(tl, p) ((tl).shadowstack++->ss = (object_t *)(p))
#define STM_POP_ROOT(tl, p) ((p) = (typeof(p))((--(tl).shadowstack)->ss))
#define STM_POP_ROOT_RET(tl) ((--(tl).shadowstack)->ss)
+#define STM_POP_ROOT_DROP(tl) ((void)(--(tl).shadowstack))
/* Every thread needs to have a corresponding stm_thread_local_t
@@ -340,8 +349,6 @@
returns: it jumps back to the stm_start_transaction(). */
void stm_abort_transaction(void) __attribute__((noreturn));
-/* Turn the current transaction inevitable.
- The stm_become_inevitable() itself may still abort. */
#ifdef STM_NO_AUTOMATIC_SETJMP
int stm_is_inevitable(void);
#else
@@ -349,6 +356,10 @@
return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread);
}
#endif
+
+/* Turn the current transaction inevitable.
+ stm_become_inevitable() itself may still abort the transaction instead
+ of returning. */
static inline void stm_become_inevitable(stm_thread_local_t *tl,
const char* msg) {
assert(STM_SEGMENT->running_thread == tl);
@@ -504,7 +515,7 @@
#define STM_POP_MARKER(tl) ({ \
object_t *_popped = STM_POP_ROOT_RET(tl); \
- STM_POP_ROOT_RET(tl); \
+ STM_POP_ROOT_DROP(tl); \
_popped; \
})
More information about the pypy-commit
mailing list