Author: Armin Rigo <[email protected]>
Branch: use-gcc
Changeset: r1886:da2e7294405a
Date: 2015-07-02 11:46 +0100
http://bitbucket.org/pypy/stmgc/changeset/da2e7294405a/
Log: hg backout a49dca73c968: cancel the original backout of this branch
diff --git a/c7/demo/Makefile b/c7/demo/Makefile
--- a/c7/demo/Makefile
+++ b/c7/demo/Makefile
@@ -19,18 +19,20 @@
COMMON = -I.. -pthread -lrt -g -Wall -Werror -DSTM_LARGEMALLOC_TEST
+CC = gcc-seg-gs
+
# note that 'build' is partially optimized but still contains all asserts
debug-%: %.c ${H_FILES} ${C_FILES}
- clang $(COMMON) -DSTM_DEBUGPRINT -DSTM_GC_NURSERY=128 -O0 \
+ $(CC) $(COMMON) -DSTM_DEBUGPRINT -DSTM_GC_NURSERY=128 -O0 \
$< -o debug-$* ../stmgc.c
build-%: %.c ${H_FILES} ${C_FILES}
- clang $(COMMON) -DSTM_GC_NURSERY=128 -O1 $< -o build-$* ../stmgc.c
+ $(CC) $(COMMON) -DSTM_GC_NURSERY=128 -O1 $< -o build-$* ../stmgc.c
release-%: %.c ${H_FILES} ${C_FILES}
- clang $(COMMON) -DNDEBUG -O2 $< -o release-$* ../stmgc.c
+ $(CC) $(COMMON) -DNDEBUG -O2 $< -o release-$* ../stmgc.c
release-htm-%: %.c ../../htm-c7/stmgc.? ../../htm-c7/htm.h
- clang $(COMMON) -O2 $< -o release-htm-$* ../../htm-c7/stmgc.c -DUSE_HTM
+ $(CC) $(COMMON) -O2 $< -o release-htm-$* ../../htm-c7/stmgc.c -DUSE_HTM
diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c
--- a/c7/demo/demo2.c
+++ b/c7/demo/demo2.c
@@ -216,7 +216,7 @@
void teardown_list(void)
{
- STM_POP_ROOT_RET(stm_thread_local);
+ STM_POP_ROOT_DROP(stm_thread_local);
}
@@ -256,6 +256,7 @@
stm_rewind_jmp_leaveframe(&stm_thread_local, &rjbuf);
unregister_thread_local();
status = sem_post(&done); assert(status == 0);
+ (void)status;
return NULL;
}
@@ -293,6 +294,7 @@
rewind_jmp_buf rjbuf;
status = sem_init(&done, 0, 0); assert(status == 0);
+ (void)status;
stm_setup();
stm_register_thread_local(&stm_thread_local);
diff --git a/c7/demo/demo_random.c b/c7/demo/demo_random.c
--- a/c7/demo/demo_random.c
+++ b/c7/demo/demo_random.c
@@ -412,6 +412,7 @@
stm_unregister_thread_local(&stm_thread_local);
status = sem_post(&done); assert(status == 0);
+ (void)status;
return NULL;
}
diff --git a/c7/demo/demo_random2.c b/c7/demo/demo_random2.c
--- a/c7/demo/demo_random2.c
+++ b/c7/demo/demo_random2.c
@@ -435,6 +435,7 @@
stm_unregister_thread_local(&stm_thread_local);
status = sem_post(&done); assert(status == 0);
+ (void)status;
return NULL;
}
diff --git a/c7/demo/test_shadowstack.c b/c7/demo/test_shadowstack.c
--- a/c7/demo/test_shadowstack.c
+++ b/c7/demo/test_shadowstack.c
@@ -54,7 +54,7 @@
then do a major collection. It should still be found by the
tracing logic. */
stm_start_transaction(&stm_thread_local);
- STM_POP_ROOT_RET(stm_thread_local);
+ STM_POP_ROOT_DROP(stm_thread_local);
STM_POP_ROOT(stm_thread_local, node);
assert(node->value == 129821);
STM_PUSH_ROOT(stm_thread_local, NULL);
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/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/c7/stm/forksupport.c b/c7/stm/forksupport.c
--- a/c7/stm/forksupport.c
+++ b/c7/stm/forksupport.c
@@ -58,7 +58,7 @@
/* Make a new mmap at some other address, but of the same size as
the standard mmap at stm_object_pages
*/
- int big_copy_fd;
+ int big_copy_fd = -1;
char *big_copy = setup_mmap("stmgc's fork support", &big_copy_fd);
/* Copy all the data from the two ranges of objects (large, small)
diff --git a/c7/stm/fprintcolor.c b/c7/stm/fprintcolor.c
--- a/c7/stm/fprintcolor.c
+++ b/c7/stm/fprintcolor.c
@@ -1,3 +1,5 @@
+#include <stdarg.h>
+
/* ------------------------------------------------------------ */
#ifdef STM_DEBUGPRINT
/* ------------------------------------------------------------ */
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/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
@@ -302,7 +311,12 @@
/* At some key places, like the entry point of the thread and in the
function with the interpreter's dispatch loop, you need to declare
- a local variable of type 'rewind_jmp_buf' and call these macros. */
+ a local variable of type 'rewind_jmp_buf' and call these macros.
+ IMPORTANT: a function in which you call stm_rewind_jmp_enterframe()
+ must never change the value of its own arguments! If they are
+ passed on the stack, gcc can change the value directly there, but
+ we're missing the logic to save/restore this part!
+*/
#define stm_rewind_jmp_enterprepframe(tl, rjbuf) \
rewind_jmp_enterprepframe(&(tl)->rjthread, rjbuf, (tl)->shadowstack)
#define stm_rewind_jmp_enterframe(tl, rjbuf) \
@@ -506,7 +520,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; \
})
diff --git a/c7/test/common.py b/c7/test/common.py
--- a/c7/test/common.py
+++ b/c7/test/common.py
@@ -3,7 +3,7 @@
assert sys.maxint == 9223372036854775807, "requires a 64-bit environment"
# ----------
-os.environ['CC'] = 'clang'
+os.environ['CC'] = 'gcc-seg-gs'
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -478,7 +478,8 @@
],
undef_macros=['NDEBUG'],
include_dirs=[parent_dir],
- extra_compile_args=['-g', '-O0', '-Werror', '-ferror-limit=1'],
+ extra_compile_args=['-g', '-O0', '-Werror', #, '-ferror-limit=1', for
clang
+ '-Wfatal-errors'], # for gcc
extra_link_args=['-g', '-lrt'],
force_generic_engine=True)
diff --git a/c7/test/test_list.py b/c7/test/test_list.py
--- a/c7/test/test_list.py
+++ b/c7/test/test_list.py
@@ -56,7 +56,7 @@
''', define_macros=[('STM_TESTS', '1')],
undef_macros=['NDEBUG'],
include_dirs=[parent_dir],
- extra_compile_args=['-g', '-O0', '-Werror', '-ferror-limit=1'],
+ extra_compile_args=['-g', '-O0', '-Werror'], #, '-ferror-limit=1'],
force_generic_engine=True)
# ____________________________________________________________
diff --git a/c7/test/test_rewind.c b/c7/test/test_rewind.c
--- a/c7/test/test_rewind.c
+++ b/c7/test/test_rewind.c
@@ -174,12 +174,26 @@
void foo(int *x) { ++*x; }
__attribute__((noinline))
-void f6(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
- int a8, int a9, int a10, int a11, int a12, int a13)
+void f6(int c1, int c2, int c3, int c4, int c5, int c6, int c7,
+ int c8, int c9, int c10, int c11, int c12, int c13)
{
rewind_jmp_buf buf;
rewind_jmp_enterframe(>hread, &buf, NULL);
+ int a1 = c1;
+ int a2 = c2;
+ int a3 = c3;
+ int a4 = c4;
+ int a5 = c5;
+ int a6 = c6;
+ int a7 = c7;
+ int a8 = c8;
+ int a9 = c9;
+ int a10 = c10;
+ int a11 = c11;
+ int a12 = c12;
+ int a13 = c13;
+
rewind_jmp_setjmp(>hread, NULL);
gevent(a1); gevent(a2); gevent(a3); gevent(a4);
gevent(a5); gevent(a6); gevent(a7); gevent(a8);
diff --git a/c7/test/test_rewind.py b/c7/test/test_rewind.py
--- a/c7/test/test_rewind.py
+++ b/c7/test/test_rewind.py
@@ -1,11 +1,11 @@
import os
def run_test(opt):
- err = os.system("clang -g -O%s -Werror -DRJBUF_CUSTOM_MALLOC -I../stm"
+ err = os.system("gcc-seg-gs -g -O%s -Werror -DRJBUF_CUSTOM_MALLOC -I../stm"
" -o test_rewind_O%s test_rewind.c ../stm/rewind_setjmp.c"
% (opt, opt))
if err != 0:
- raise OSError("clang failed on test_rewind.c")
+ raise OSError("gcc-seg-gs failed on test_rewind.c")
for testnum in [1, 2, 3, 4, 5, 6, 7, "TL1", "TL2"]:
print '=== O%s: RUNNING TEST %s ===' % (opt, testnum)
err = os.system("./test_rewind_O%s %s" % (opt, testnum))
diff --git a/gcc-seg-gs/README.txt b/gcc-seg-gs/README.txt
new file mode 100644
--- /dev/null
+++ b/gcc-seg-gs/README.txt
@@ -0,0 +1,34 @@
+Get gcc release 5.1.0 from the download page:
+
+ https://gcc.gnu.org/mirrors.html
+
+Unpack it.
+
+Apply the patch provided here in the file gcc-5.1.0-patch.diff.
+
+You can either install the 'libmpc-dev' package on your system,
+or else, manually:
+
+ * unpack 'https://ftp.gnu.org/gnu/gmp/gmp-6.0.0a.tar.xz'
+ and move 'gmp-6.0.0' as 'gcc-5.1.0/gmp'.
+
+ * unpack 'http://www.mpfr.org/mpfr-current/mpfr-3.1.2.tar.xz'
+ and move 'mpfr-3.1.2' as 'gcc-5.1.0/mpfr'
+
+ * unpack 'ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz'
+ and move 'mpc-1.0.3' as 'gcc-5.1.0/mpc'
+
+Compile gcc as usual:
+
+ mkdir build
+ cd build
+ ../gcc-5.1.0/configure --enable-languages=c --disable-multilib
+ make # or maybe only "make all-stage1-gcc"
+
+This patched gcc could be globally installed, but in these instructions
+we assume you don't want that. Instead, create the following script,
+call it 'gcc-seg-gs', and put it in the $PATH:
+
+ #!/bin/bash
+ BUILD=/..../build # <- insert full path
+ exec $BUILD/gcc/xgcc -B $BUILD/gcc "$@"
diff --git a/gcc-seg-gs/gcc-5.1.0-patch.diff b/gcc-seg-gs/gcc-5.1.0-patch.diff
new file mode 100644
--- /dev/null
+++ b/gcc-seg-gs/gcc-5.1.0-patch.diff
@@ -0,0 +1,269 @@
+Index: gcc/doc/tm.texi.in
+===================================================================
+--- gcc/doc/tm.texi.in (revision 223859)
++++ gcc/doc/tm.texi.in (working copy)
+@@ -7424,6 +7424,8 @@
+
+ @hook TARGET_ADDR_SPACE_CONVERT
+
++@hook TARGET_ADDR_SPACE_DEFAULT_POINTER_ADDRESS_MODES_P
++
+ @node Misc
+ @section Miscellaneous Parameters
+ @cindex parameters, miscellaneous
+Index: gcc/doc/tm.texi
+===================================================================
+--- gcc/doc/tm.texi (revision 223859)
++++ gcc/doc/tm.texi (working copy)
+@@ -10290,6 +10290,17 @@
+ as determined by the @code{TARGET_ADDR_SPACE_SUBSET_P} target hook.
+ @end deftypefn
+
++@deftypefn {Target Hook} bool
TARGET_ADDR_SPACE_DEFAULT_POINTER_ADDRESS_MODES_P (void)
++Some places still assume that all pointer or address modes are the
++standard Pmode and ptr_mode. These optimizations become invalid if
++the target actually supports multiple different modes. This hook returns
++true if all pointers and addresses are Pmode and ptr_mode, and false
++otherwise. Called via target_default_pointer_address_modes_p(). The
++default NULL for the hook makes this function return true if the two hooks
++@code{TARGET_ADDR_SPACE_POINTER_MODE}, @code{TARGET_ADDR_SPACE_ADDRESS_MODE}
++are undefined, and false otherwise.
++@end deftypefn
++
+ @node Misc
+ @section Miscellaneous Parameters
+ @cindex parameters, miscellaneous
+Index: gcc/target.def
+===================================================================
+--- gcc/target.def (revision 223859)
++++ gcc/target.def (working copy)
+@@ -3164,6 +3164,19 @@
+ rtx, (rtx op, tree from_type, tree to_type),
+ default_addr_space_convert)
+
++/* True if all pointer or address modes are the standard Pmode and ptr_mode.
*/
++DEFHOOK
++(default_pointer_address_modes_p,
++ "Some places still assume that all pointer or address modes are the\n\
++standard Pmode and ptr_mode. These optimizations become invalid if\n\
++the target actually supports multiple different modes. This hook returns\n\
++true if all pointers and addresses are Pmode and ptr_mode, and false\n\
++otherwise. Called via target_default_pointer_address_modes_p(). The\n\
++default NULL for the hook makes this function return true if the two hooks\n\
++@code{TARGET_ADDR_SPACE_POINTER_MODE},
@code{TARGET_ADDR_SPACE_ADDRESS_MODE}\n\
++are undefined, and false otherwise.",
++ bool, (void), NULL)
++
+ HOOK_VECTOR_END (addr_space)
+
+ #undef HOOK_PREFIX
+Index: gcc/targhooks.c
+===================================================================
+--- gcc/targhooks.c (revision 223859)
++++ gcc/targhooks.c (working copy)
+@@ -1228,6 +1228,9 @@
+ bool
+ target_default_pointer_address_modes_p (void)
+ {
++ if (targetm.addr_space.default_pointer_address_modes_p != NULL)
++ return targetm.addr_space.default_pointer_address_modes_p();
++
+ if (targetm.addr_space.address_mode != default_addr_space_address_mode)
+ return false;
+ if (targetm.addr_space.pointer_mode != default_addr_space_pointer_mode)
+Index: gcc/config/i386/i386-c.c
+===================================================================
+--- gcc/config/i386/i386-c.c (revision 223859)
++++ gcc/config/i386/i386-c.c (working copy)
+@@ -572,6 +572,9 @@
+ ix86_tune,
+ ix86_fpmath,
+ cpp_define);
++
++ cpp_define (parse_in, "__SEG_FS");
++ cpp_define (parse_in, "__SEG_GS");
+ }
+
+
+@@ -586,6 +589,9 @@
+ /* Update pragma hook to allow parsing #pragma GCC target. */
+ targetm.target_option.pragma_parse = ix86_pragma_target_parse;
+
++ c_register_addr_space ("__seg_fs", ADDR_SPACE_SEG_FS);
++ c_register_addr_space ("__seg_gs", ADDR_SPACE_SEG_GS);
++
+ #ifdef REGISTER_SUBTARGET_PRAGMAS
+ REGISTER_SUBTARGET_PRAGMAS ();
+ #endif
+Index: gcc/config/i386/i386.c
+===================================================================
+--- gcc/config/i386/i386.c (revision 223859)
++++ gcc/config/i386/i386.c (working copy)
+@@ -15963,6 +15963,20 @@
+ fputs (" PTR ", file);
+ }
+
++ /**** <AR> ****/
++ switch (MEM_ADDR_SPACE(x))
++ {
++ case ADDR_SPACE_SEG_FS:
++ fputs (ASSEMBLER_DIALECT == ASM_ATT ? "%fs:" : "fs:", file);
++ break;
++ case ADDR_SPACE_SEG_GS:
++ fputs (ASSEMBLER_DIALECT == ASM_ATT ? "%gs:" : "gs:", file);
++ break;
++ default:
++ break;
++ }
++ /**** </AR> ****/
++
+ x = XEXP (x, 0);
+ /* Avoid (%rip) for call operands. */
+ if (CONSTANT_ADDRESS_P (x) && code == 'P'
+@@ -51816,6 +51830,130 @@
+ }
+ #endif
+
++
++/***** <AR> *****/
++
++/*** GS segment register addressing mode ***/
++
++static machine_mode
++ix86_addr_space_pointer_mode (addr_space_t as)
++{
++ gcc_assert (as == ADDR_SPACE_GENERIC ||
++ as == ADDR_SPACE_SEG_FS ||
++ as == ADDR_SPACE_SEG_GS);
++ return ptr_mode;
++}
++
++/* Return the appropriate mode for a named address address. */
++static machine_mode
++ix86_addr_space_address_mode (addr_space_t as)
++{
++ gcc_assert (as == ADDR_SPACE_GENERIC ||
++ as == ADDR_SPACE_SEG_FS ||
++ as == ADDR_SPACE_SEG_GS);
++ return Pmode;
++}
++
++/* Named address space version of valid_pointer_mode. */
++static bool
++ix86_addr_space_valid_pointer_mode (machine_mode mode, addr_space_t as)
++{
++ gcc_assert (as == ADDR_SPACE_GENERIC ||
++ as == ADDR_SPACE_SEG_FS ||
++ as == ADDR_SPACE_SEG_GS);
++ return targetm.valid_pointer_mode (mode);
++}
++
++/* Like ix86_legitimate_address_p, except with named addresses. */
++static bool
++ix86_addr_space_legitimate_address_p (machine_mode mode, rtx x,
++ bool reg_ok_strict, addr_space_t as)
++{
++ gcc_assert (as == ADDR_SPACE_GENERIC ||
++ as == ADDR_SPACE_SEG_FS ||
++ as == ADDR_SPACE_SEG_GS);
++ return ix86_legitimate_address_p (mode, x, reg_ok_strict);
++}
++
++/* Named address space version of LEGITIMIZE_ADDRESS. */
++static rtx
++ix86_addr_space_legitimize_address (rtx x, rtx oldx,
++ machine_mode mode, addr_space_t as)
++{
++ gcc_assert (as == ADDR_SPACE_GENERIC ||
++ as == ADDR_SPACE_SEG_FS ||
++ as == ADDR_SPACE_SEG_GS);
++ return ix86_legitimize_address (x, oldx, mode);
++}
++
++/* The default, SEG_FS and SEG_GS address spaces are all "subsets" of
++ each other. */
++bool static
++ix86_addr_space_subset_p (addr_space_t subset, addr_space_t superset)
++{
++ gcc_assert (subset == ADDR_SPACE_GENERIC ||
++ subset == ADDR_SPACE_SEG_FS ||
++ subset == ADDR_SPACE_SEG_GS);
++ gcc_assert (superset == ADDR_SPACE_GENERIC ||
++ superset == ADDR_SPACE_SEG_FS ||
++ superset == ADDR_SPACE_SEG_GS);
++ return true;
++}
++
++/* Convert from one address space to another: it is a no-op.
++ It is the C code's responsibility to write sensible casts. */
++static rtx
++ix86_addr_space_convert (rtx op, tree from_type, tree to_type)
++{
++ addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (from_type));
++ addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (to_type));
++
++ gcc_assert (from_as == ADDR_SPACE_GENERIC ||
++ from_as == ADDR_SPACE_SEG_FS ||
++ from_as == ADDR_SPACE_SEG_GS);
++ gcc_assert (to_as == ADDR_SPACE_GENERIC ||
++ to_as == ADDR_SPACE_SEG_FS ||
++ to_as == ADDR_SPACE_SEG_GS);
++
++ return op;
++}
++
++static bool
++ix86_addr_space_default_pointer_address_modes_p (void)
++{
++ return true; /* all pointer and address modes are still Pmode/ptr_mode */
++}
++
++#undef TARGET_ADDR_SPACE_POINTER_MODE
++#define TARGET_ADDR_SPACE_POINTER_MODE ix86_addr_space_pointer_mode
++
++#undef TARGET_ADDR_SPACE_ADDRESS_MODE
++#define TARGET_ADDR_SPACE_ADDRESS_MODE ix86_addr_space_address_mode
++
++#undef TARGET_ADDR_SPACE_VALID_POINTER_MODE
++#define TARGET_ADDR_SPACE_VALID_POINTER_MODE
ix86_addr_space_valid_pointer_mode
++
++#undef TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P
++#define TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P \
++ ix86_addr_space_legitimate_address_p
++
++#undef TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS
++#define TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS \
++ ix86_addr_space_legitimize_address
++
++#undef TARGET_ADDR_SPACE_SUBSET_P
++#define TARGET_ADDR_SPACE_SUBSET_P ix86_addr_space_subset_p
++
++#undef TARGET_ADDR_SPACE_CONVERT
++#define TARGET_ADDR_SPACE_CONVERT ix86_addr_space_convert
++
++#undef TARGET_ADDR_SPACE_DEFAULT_POINTER_ADDRESS_MODES_P
++#define TARGET_ADDR_SPACE_DEFAULT_POINTER_ADDRESS_MODES_P \
++ ix86_addr_space_default_pointer_address_modes_p
++
++/***** </AR> *****/
++
++
+ /* Initialize the GCC target structure. */
+ #undef TARGET_RETURN_IN_MEMORY
+ #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
+Index: gcc/config/i386/i386.h
+===================================================================
+--- gcc/config/i386/i386.h (revision 223859)
++++ gcc/config/i386/i386.h (working copy)
+@@ -2568,6 +2568,11 @@
+ /* For switching between functions with different target attributes. */
+ #define SWITCHABLE_TARGET 1
+
++enum {
++ ADDR_SPACE_SEG_FS = 1,
++ ADDR_SPACE_SEG_GS = 2
++};
++
+ /*
+ Local variables:
+ version-control: t
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit